otto
Otto's MCP server lets an agent inspect terminal state, browse routes, discover and execute safe terminal actions, and refresh public market data.
Check terminal health and Command Center status, including milestone, goal status, active task, risk gates, recovery count, and provider freshness.
List all 15 terminal routes and fetch each route's read-only current-state payload.
Discover safe operable actions from the terminal agent contract, excluding safety-disabled and secret actions.
Execute safe actions by
action_id, passing bodies, query parameters, path parameters, and confirmation when required.Refresh public no-key market data and get counts for written, available, and reused-cache data.
Refuse safety-disabled and secret actions through the exposed surface.
Click on "Deploy 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, Python 3.12 and Claude Code. Install once, then register it:
uv tool install git+https://github.com/0Smallcat0/otto
claude mcp add otto -- otto-terminalInstall first, in a terminal: on a slow connection the first download can outlast the
30 or so seconds Claude Code gives an MCP server to start. If uv says its bin directory is
not on your PATH, run uv tool update-shell and open a new terminal. Update later with
uv tool upgrade otto-terminal.
Then 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."
"Use my paper book to buy $5,000 of AAPL, say why in one line, then show me the book."
The dashboard comes with it. The MCP server starts the backend for you, and http://127.0.0.1:8765/ is the screen: books, calls and every order the agent placed.
Related MCP server: OpenFinClaw CLI
Run a round every day
A round is what the terminal is for: grade the open calls, scan for names with no view, record a call only where there is a real thesis, place paper orders with a reason, then snapshot the books. To run one, ask:
"Run one Otto decision round: grade my open calls, scan for gaps, record a call only where you have a real thesis, place paper orders with a rationale, then snapshot the books and report each against its benchmark."
To have it run every morning on its own (Windows, PowerShell), save the runner and register it once:
iwr https://raw.githubusercontent.com/0Smallcat0/otto/main/scripts/run_decision_loop.ps1 -OutFile "$HOME\otto-round.ps1"
$run = New-ScheduledTaskAction -Execute powershell -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$HOME\otto-round.ps1`""
Register-ScheduledTask OttoDailyRound -Action $run -Trigger (New-ScheduledTaskTrigger -Daily -At 9am)Each run is one headless claude -p session on your Claude account (a test round on
2026-10-22 took 3 minutes, 33 turns and $1.18). It writes the theses in your Windows
display language — add -Language English after the .ps1 path to pick another — and
appends its duration, turns and cost to ~/.otto/artifacts/loop/runs.jsonl.
Why this one
It keeps score. Every call the agent records — a stance, the reasoning, the price that
would prove it wrong, a horizon — is graded later against the price the market actually
printed and against its index (0050.TW, SPY, BTC-USD); a call without reasoning is
refused. "An AI can operate it" is measured: a real headless agent runs plain-language
tasks in hermetic sandboxes, graded on terminal state and artifacts, never by an LLM judge.
Model | Passed | Avg turns | Run |
| 21 / 21 | 7.7 | 2026-08-16, 21-task suite |
| 21 / 21 | 6.4 | 2026-08-16, 21-task suite |
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. 805 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 and the eval harness are not in the installed package, so these run from a
clone. The built dashboard is committed, so uv run otto needs no frontend build:
git clone https://github.com/0Smallcat0/otto && cd otto
uv run otto
uv run --extra dev python -m pytest -q
python evals/run_eval.py --model claude-sonnet-5License
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.
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
Scored across 6 tools
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
Related MCP Connectors
Trading MCP server for AI agents, with live market data, account reads and controlled execution.
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.
Unified financial infrastructure connecting AI agents directly to trade live/demo brokerage accounts, Web3 non-custodial wallets, real-time market data across equities, ETFs, crypto, forex, options, DeFi swaps, and prediction markets, institutional research feeds, and algorithmic strategy backtesters.
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.2MIT
- FlicenseNot gradedqualityDmaintenanceEnables quant research, strategy generation, backtesting, and paper trading from natural language prompts, integrating with AI agents via an MCP server.24-
- 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
- AlicenseBqualityCmaintenanceEnables multi-agent financial research through MCP, combining live or offline market, news, fundamentals, document RAG, and risk tools with critic review, synthesis, and execution tracing.10MIT