An open-source trading platform with AI agent capabilities, market data ingestion, broker integrations, and MCP server support for external tools and data access.
OpenTraderWorld provides 7 tools with explicit schemas and descriptions visible in core/otw-core/src/agent/tools.rs. Naming follows verb-noun patterns (otw_catalog, otw_read, otw_write, memory_load, memory_save, memory_delete, load_skill), which is solid. Descriptions are present and moderately detailed (avg ~150 chars), explaining what each tool does and when to use it. However, several critical issues reduce the score: (1) The otw_catalog, otw_read, otw_write tools accept vague 'query' and 'body' parameters that are untyped JSON objects with minimal constraint documentation, LLMs cannot predict valid structures. (2) The memory and skill tools lack output schema documentation; what fields do they return? (3) No error handling guidance: what happens when a memory slug doesn't exist? When an API endpoint 404s? (4) No pagination support documented for list-like endpoints. (5) Tool descriptions lack dependency hints (e.g., 'call otw_catalog first to discover endpoints'). The server does NOT include sampled tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible in the schema; Risk tags are only in source comments, not in the tool definitions themselves. Overall, the tools are functional but lack the polish and LLM-optimized guidance expected of production-grade agent tools.
Load a skill (Handlebars template + YAML metadata) by name. Skills are built-in blueprints for repeated tasks (e.g. 'Portfolio Rebalance', 'Signal Scout'). Returns the compiled template and metadata.
Delete a memory document permanently. Pass its slug (the stable identifier shown in the URL bar). This is irreversible.
Load one of your memory documents by slug. A memory's slug is the stable identifier (lowercase, no spaces); its name can be changed in the UI but the slug cannot. Returns the full markdown body.
Save or update a memory document (markdown text). Pass a slug (the stable identifier, created on first save if it doesn't exist) and the full markdown body. The UI will display the name you set in Settings → Memory.
Discover OpenTraderWorld API endpoints. With no argument, returns a compact index of the modules you can access. Pass a "module" to list that module's concrete endpoints. Call this before otw_read/otw_write.
Read data from OpenTraderWorld: GET a price series, a portfolio snapshot, backtest results, or any other query endpoint. Pass the endpoint path (e.g. '/api/prices') and an optional JSON query object.
Untyped JSON object parameters ('query', 'body') lack schema constraints. LLMs cannot predict valid structures, leading to malformed API calls.
Output schemas not documented for any tool. LLMs cannot infer response structure, preventing downstream tool chaining and data extraction planning.
'method' parameter in otw_write should be an enum (POST|PUT|DELETE), not a free string. LLM may pass invalid HTTP verbs.
No error recovery guidance. Tools lack descriptions of failure modes (endpoint not found, permission denied, slug not found) and what the LLM should do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Write data to OpenTraderWorld: POST/PUT/DELETE to any mutable endpoint. Pass the HTTP method, endpoint path, and a JSON body (for POST/PUT). The agent's MCP token must grant write (rw) or full (rwd) access to the affected module.
memory_delete is a destructive operation but lacks confirmation/dry-run support. Agents can accidentally delete memories without recovery.
No pagination support documented. otw_read may return large lists without limit/offset/cursor parameters, risking context window exhaustion.
Tool descriptions contain example values ('e.g. Portfolio Rebalance') that LLMs may treat as the only valid options, instead of using formal enum/pattern constraints.
Tool naming 'load_skill' is generic. Prefer 'get_skill' or 'fetch_skill' to signal retrieval vs. execution.