otto
The Otto server provides a local, AI-operable financial terminal for managing paper portfolios, running backtests, accessing market data, and performing financial research — with a strong emphasis on safety and transparent operation.
Check Terminal Health (
terminal_status): Get situational awareness including terminal health, milestone/goal status, active task, risk gate states (live trading/secrets on/off), recovery count, and provider data freshness. Recommended as the first call before any operation.Discover Available Routes (
list_routes): List all terminal routes (dashboard, markets, portfolio, backtest, settings, etc.) with their IDs, labels, categories, and primary endpoints.Read Route State (
get_route): Fetch the current read-only data payload for any route by ID — e.g. pull the current portfolio state, market data, or backtest results.Discover Operable Actions (
list_actions): List all safe, agent-executable actions from the terminal's contract, optionally filtered by route. Each action shows its ID, label, HTTP method, endpoint, safety class, whether it mutates state, and whether it requires confirmation. Safety-disabled and secret actions are automatically excluded.Execute Terminal Actions (
run_action): Run any safe action by its ID, passing a JSON body, path parameters, query parameters, and a confirmation flag when required. Refuses to execute safety-gated or secret actions.Refresh Public Market Data (
refresh_public_data): Trigger a no-key public data provider refresh and return a summary of written, available, and cached data — a convenient way to load fresh market data without credentials.
Safety-gated by design: Live trading, credential entry, and arbitrary code execution are disabled by default, ensuring a read-only/paper/dry-run environment suitable for AI-driven operation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ottobacktest moving average crossover on AAPL"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Otto
A local financial terminal your AI agent operates for you. Market data, backtests, paper books, news — driven in plain language, running entirely on your machine.

Try it
Needs uv and Python 3.12. No clone, no build, no server to start:
claude mcp add otto -- uvx --from git+https://github.com/0Smallcat0/otto otto-terminalThen ask for things:
"Refresh market data and show me the BTC snapshot."
"Backtest an SMA cross on BTCUSDT and tell me if it's any good."
"What do you make of my holdings?"
The dashboard comes with it. The built UI ships inside the package, so there is nothing
to compile: the MCP server starts the backend the first time your agent touches the
terminal, and http://127.0.0.1:8765/ is the screen. Working from a clone instead? Build it
once with npm --prefix frontend install && npm --prefix frontend run build, then
uv run otto.
Related MCP server: OpenFinClaw CLI
Why this one
It keeps score, and the score is published even when it is bad. The agent records dated calls — a stance, the reasoning, the price level that would prove it wrong, a horizon — and every call is later graded against the price the market actually printed. Calls without reasoning are refused rather than guessed, moves inside a flat band don't count as skill, and a call graded long after it matured is excluded because it measured a window its thesis never claimed.
Here is the entire record so far. It is a small, unflattering sample, and that is the point of showing it:
Calls journaled | 13 (5 still open, 4 withdrawn and never scored) |
Hit rate | 0% — 0 of 4 graded theses held |
Beat its index | 2 of 3 measurable calls, average excess −0.22% |
Those two lines disagree on purpose, and the disagreement is the reason the second one
exists. A hold graded a 6.6% loss over a window its index fell 7.9% did worse than nothing
and better than the alternative; a hit rate can only see the first half. Excess return is
measured against 0050.TW, SPY or BTC-USD over the call's own window, and a call that
meant to stay out beats the index when the thing it avoided lagged — so a negative excess
is a win for that stance, and the board colours by verdict rather than by sign.
These are one operator's calls on one operator's holdings, so the ledger behind them stays
on that machine and is not in this repo — what ships is the machinery that produces and
grades them, and GET /api/research/ledger reports the same block for yours. All three
graded comparisons rest on an index level reconstructed from that session's published close
rather than stamped live when the call was struck; the ledger marks those, the scorecard
counts them, and the board flags them, because a weaker measurement that looks identical to
a strong one is just a lie with extra steps.
"An AI can operate it" is a benchmark here, not a tagline. A real headless agent gets plain-language tasks in hermetic sandboxes, graded programmatically on terminal state and artifacts — never by an LLM judge:
Model | Passed | Avg turns | Run |
| 20 / 20 | 6.5 | 2026-07-10, 20-task suite |
| 19 / 20 | 6.8 | 2026-07-10, 20-task suite |
The suite has since grown to 21 tasks and the MCP surface has changed, so those figures are dated rather than current. Reproducing them takes a clone, not the package — the wheel ships the terminal, not the harness that grades it:
git clone https://github.com/0Smallcat0/otto && cd otto
python evals/run_eval.py --model claude-sonnet-5A run whose agent never starts reports no score rather than zero, and refuses to write the report at all, because a benchmark that did not execute is not a result.
Safety tasks grade refusal: asking for a live order must leave state unchanged. Live trading, credential entry and code execution aren't switched off — they're unreachable through the surface the agent has.
Under the hood
One typed contract (142 actions across 16 routes) is the single source of truth; the MCP tools, the UI capability catalog and the eval suite are all derived from it. 802 tests on Windows + Linux CI.
Clean-room boundary — built by observing a reference terminal's workflow, never by reading or porting its code; a test fails the build if that wall is crossed.
The tests live in the repository rather than the wheel, so this one is from the clone too:
python -m pytest -q && python -m ruff check .License
MIT.
Available Tools
6 toolsget_routeA
Fetch the current state of one route (e.g. dashboard, markets, portfolio, backtest, command center is under settings). Returns the route's primary read-only payload.
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | Yes | Route id from list_routes, e.g. 'markets'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It states the tool returns a 'primary read-only payload', indicating a non-destructive read. However, it does not mention authentication requirements, rate limits, or any other behavioral traits (e.g., whether the data is cached in real-time).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise with two pithy sentences. Every word serves a purpose: the verb, examples, and return type are front-loaded. No unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, no output schema), the description is adequate but lacks clarity on the 'primary read-only payload' structure. An agent cannot infer the return format without additional context, which would be helpful for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with a description for 'route_id'. The tool description adds extra value by listing example route IDs (dashboard, markets, portfolio, backtest) and noting that 'command center is under settings', which aids correct invocation beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the goal with a specific verb ('Fetch') and resource ('current state of one route'), and provides concrete examples like 'dashboard, markets, portfolio, backtest'. It distinguishes from sibling 'list_routes' by specifying it fetches one route's state, not a list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching a single route's data, but does not explicitly state when to use it versus alternatives such as 'list_routes' for listing all routes or 'run_action' for mutations. No when-not or prerequisite guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_actionsA
List the safe operable actions (from the terminal agent-contract). Excludes safety-disabled and secret actions. Each row shows action_id, route_id, label, method, endpoint, request_contract, safety_class, whether it mutates local state, and whether it needs confirmation. Use action_id with run_action.
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | No | Optional route id filter, e.g. 'backtest'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It reveals that actions are filtered (safe, not disabled, not secret) and mentions behavioral aspects like mutating local state and needing confirmation in the output. It could elaborate on safety classification criteria.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the core purpose and exclusions, then detailing output and usage. Every sentence provides essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description covers what the tool does, what it excludes, what columns are returned, and how to use the result with run_action. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and description adds value by explaining the route_id parameter as an optional filter with an example ('backtest'). This goes beyond the schema's minimal description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists safe operable actions, specifies exclusions (safety-disabled and secret actions), and lists the columns shown. It distinguishes from sibling run_action by noting the action_id is used with that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to list actions) and provides context on what each row contains, but does not explicitly state when not to use it or provide direct alternatives beyond mentioning run_action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_routesA
List the 15 terminal routes with their route_id, label, category, and primary endpoint. Use route_id with get_route.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description discloses scope (15 routes), returned fields, and suggests a read-only operation. Does not mention pagination or side effects, which is acceptable given no parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no extraneous information. Action and result are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficient for a simple tool with zero parameters. Might benefit from noting read-only nature, but not required. Output schema is absent, but description covers return fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in input schema (100% coverage). Description adds value by explaining how the output relates to get_route, which is beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists 15 terminal routes with specific fields (route_id, label, category, primary endpoint). Distinguishes from sibling get_route by specifying that route_id is used with get_route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the purpose: list the routes. Mentions using route_id with get_route, indicating subsequent usage. No exclusions or when-not guidance, but adequate for a simple list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_public_dataA
Convenience: start the public no-key provider refresh job and return its result summary (written / available / reused cache counts). This is the common 'load fresh public data' operation; no keys or private accounts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the result summary (written/available/reused cache counts) but lacks details on side effects, idempotency, or rate limits. It is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Purpose is front-loaded, providing immediate clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and no output schema, the description fully explains what the tool does and what it returns. It is complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so schema coverage is 100%. The description adds context about the return summary, which goes beyond the schema. Baseline 3 + 1 for added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to start a public data refresh job and return a result summary. It distinguishes from siblings by highlighting it's for public data without keys, contrasting with tools like run_action or get_route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states this is for loading fresh public data without keys or private accounts, guiding when to use it. It does not mention when not to use alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_actionA
Execute one safe terminal action by action_id (from list_actions). Refuses safety-disabled and secret actions. For POST actions pass 'body'; for endpoints with {placeholders} pass 'path_params'; optional 'query'. If the action requires confirmation, pass confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON body for POST actions (optional). | |
| query | No | Query string parameters (optional). | |
| confirm | No | Set true for actions that require confirmation. | |
| action_id | Yes | Action id from list_actions. | |
| path_params | No | Values for {name} segments in the endpoint (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses refusal of certain actions and need for confirmation, but does not mention rate limits, auth, response format, or side effects. Adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no fluff, all sentences add value. The description is front-loaded with the main purpose and then specifics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters and no output schema, the description covers parameter usage and safety, but does not mention return values or error handling. For an execution tool, more detail on response would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds significant meaning by linking parameters to specific use cases (body for POST, path_params for placeholders, query optional, confirm for confirmation). This goes beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Execute' and the resource 'safe terminal action by action_id'. It distinguishes from sibling tools like list_actions and list_routes by focusing on execution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on when to pass 'body' (POST), 'path_params' (placeholders), 'query' (optional), and 'confirm' (confirmation). It also mentions what it refuses (safety-disabled, secret). However, it lacks explicit when-not-to-use or alternatives, but context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminal_statusA
Situational awareness entry point. Returns terminal health plus the Command Center summary: current milestone, goal status, active task, risk gates (live/secrets), recovery count, and provider freshness. Call this first before operating.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It details the return content (milestone, goal status, etc.) and hints at dependencies (provider freshness). It does not mention side effects or authentication needs, but for a read-only status tool, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with a front-loaded purpose and a list of return items. Every sentence earns its place; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, no output schema, and no annotations, the description is remarkably complete. It explains the tool's role, return content, and usage timing, fully covering what an agent needs to know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (0 params, 100% schema coverage), so baseline is 4. The description does not need to add parameter semantics and does not introduce confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns terminal health and a Command Center summary with specific enumerated items. It positions itself as a situational awareness entry point, effectively distinguishing its purpose from sibling tools like 'run_action' or 'get_route'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to 'Call this first before operating,' providing clear context for when to use it. It lacks explicit mention of when not to use it or specific alternatives, but the context is sufficient given the sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.1.0- First observed
get_route - First observed
list_actions - First observed
list_routes - First observed
refresh_public_data - First observed
run_action - First observed
terminal_status
TDQS
Each tool has a clearly distinct purpose: fetching a route, listing actions, listing routes, refreshing data, executing an action, and checking terminal status. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern with snake_case (e.g., get_route, list_actions, run_action). This makes them predictable and easy to understand.
Six tools is well-scoped for a terminal interface. Each tool serves a necessary function without redundancy, covering status, navigation, data refresh, and action execution.
The tool surface covers key operations: status, listing resources, fetching data, refreshing public data, and executing actions. Minor potential gaps like direct search or filtering are not critical given the design.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
The financial MCP for AI agents - 90+ financial tables, SEC filings, signals, alt-data.
Trade across 22+ exchanges and brokers from any MCP-capable AI agent, no install required.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server that provides AI agents with financial tools including real-time quotes, backtesting, technical analysis, and multi-exchange data via a simple CLI interface.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables quant research, strategy generation, backtesting, and paper trading from natural language prompts, integrating with AI agents via an MCP server.63-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Interactive Brokers through 48 tools for market data, orders, account management, and more, via the MCP protocol.MIT

inferventisofficial
FlicenseNot gradedqualityDmaintenanceEnables AI agents to access real-time financial data, news, and web reading through a single MCP endpoint with zero installation.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/0Smallcat0/otto'
If you have feedback or need assistance with the MCP directory API, please join our Discord server