MCP server exposing the pp-mt5 command tree (MetaTrader 5 CLI) as tools over stdio. Enables Claude Desktop and other MCP clients to drive MetaTrader 5 directly with safety gates (live-mode confirmation, hash-confirm, audit logging).
pp-mt5 demonstrates solid naming conventions (verb_noun pattern: mt5_doctor, mt5_account_info, mt5_quote) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 13 tools have descriptions explaining WHAT they do and WHEN to use them. Tool annotations (readOnlyHint, destructiveHint) are correctly applied per tool risk profile. However, input schemas are inconsistent: 5 tools have empty input objects (no parameters documented), and optional parameters lack explicit 'required' declarations in several cases. Output schemas are entirely undocumented, LLMs cannot predict response structure. Error handling is present (exit codes mapped to names like 'broker_rejected', 'safety_rejected') but lacks recovery guidance in tool descriptions. Parameter descriptions are present but sparse (e.g., mt5_order_send's 'price' param lacks format/range guidance). No pagination support documented despite mt5_symbols_list and mt5_history_deals returning potentially large result sets.
Print account balance, equity, margin, leverage, currency, trade mode. Useful to confirm which broker account the CLI will operate against and whether it is real or demo.
Tail the audit log (confirmed writes, broker rejections, safety rejections). Useful for post-trade reconciliation and debugging.
Close all open positions. Requires MT5_LIVE=1 environment variable, --i-understand-this-is-live flag, and --confirm <hash> after a dry-run.
Run a preflight check: Python, MetaTrader5 package, terminal, login, store writability, safety mode. Non-zero exit means something blocks live commands; the detail field carries remediation.
Read historical deals from the local mirror over a window. Requires a prior sync over the same window.
Send a live order (market, limit, stop). Requires MT5_LIVE=1 environment variable, --i-understand-this-is-live flag, and --confirm <hash> after a dry-run.
Five tools (mt5_doctor, mt5_account_info, mt5_terminal_info, mt5_positions_list, mt5_orders_list) have empty input schemas ({}), making it impossible for LLMs to understand what parameters they accept. Even read-only tools with no required params should document optional filters or pagination.
No output schemas documented for any tool. LLMs cannot predict response structure (e.g., does mt5_account_info return {balance, equity, margin} or {account: {balance, equity, margin}}?). This forces agents to guess field names and risks downstream tool call failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Snapshot pending orders. Live, not from the mirror.
Snapshot currently open positions. Live, not from the mirror.
Get a live bid/ask/spread/last-tick quote for a symbol. Hits the bridge (≈50ms) and does not require sync.
Execute a read-only SQL query against the local mirror (store.db). Blocks INSERT/UPDATE/DELETE/DROP/ALTER/CREATE. Useful for custom aggregations, joins, and time-series analysis.
List symbols from the local mirror, optionally filtered by a comma-separated glob (e.g. 'EUR*,XAU*'). Requires a prior 'mt5_sync_all' call.
Sync all symbols' bars, ticks, and history (deals/orders) from the broker into the local SQLite mirror. Long-running; use for backtest prep or periodic reconciliation.
Print MT5 terminal build, data path, and connected/trade-allowed flags.
Parameter descriptions lack format/range guidance. mt5_order_send's 'price' param has no min/max or format hint; 'volume' lacks lot-size constraints; 'type' enum is documented in description but not as a formal enum constraint in schema. This invites invalid LLM inputs.
No pagination or result-limit documentation. mt5_symbols_list, mt5_history_deals, and mt5_sql could return thousands of rows, risking context window exhaustion. No mention of limit, offset, or cursor parameters.
Error handling maps exit codes to names (broker_rejected, safety_rejected) but tool descriptions do not explain recovery steps. An LLM receiving 'exit 5 (broker_rejected)' has no guidance on whether to retry, adjust parameters, or escalate to the user.