Skip to main content
Glama

Otto

CI

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.

A real agent operating Otto: a plain-language command goes in, the agent runs a backtest through MCP, and the run lands on the dashboard

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-terminal

Install 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

claude-sonnet-5

21 / 21

7.7

2026-08-16, 21-task suite

claude-haiku-4-5

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.

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-5

License

MIT.

Available Tools

6 tools
get_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.

NameRequiredDescriptionDefault
route_idYesRoute id from list_routes, e.g. 'markets'.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
route_idNoOptional route id filter, e.g. 'backtest'.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
bodyNoJSON body for POST actions (optional).
queryNoQuery string parameters (optional).
confirmNoSet true for actions that require confirmation.
action_idYesAction id from list_actions.
path_paramsNoValues for {name} segments in the endpoint (optional).

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.1.0
    • First observedget_route
    • First observedlist_actions
    • First observedlist_routes
    • First observedrefresh_public_data
    • First observedrun_action
    • First observedterminal_status

TDQS

A4.3/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that provides AI agents with financial tools including real-time quotes, backtesting, technical analysis, and multi-exchange data via a simple CLI interface.
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with Interactive Brokers through 48 tools for market data, orders, account management, and more, via the MCP protocol.
    MIT