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 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-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."

  • "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

claude-sonnet-5

20 / 20

6.5

2026-07-10, 20-task suite

claude-haiku-4-5

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

A 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.

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

ParametersJSON Schema
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.

ParametersJSON Schema
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.

ParametersJSON Schema
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.

ParametersJSON Schema
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.

ParametersJSON Schema
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.

ParametersJSON Schema
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. Dates show when Glama detected each change.

  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
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
ResponsivenessNo issues

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

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.
    1
    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

Latest Blog Posts

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