A multi-agent trading system with separate MCP servers for accounts management, market data, and push notifications. Includes autonomous traders using different investment strategies (Warren Buffett value investing, George Soros macro trading, Ray Dalio systematic diversification, Cathie Wood disruptive innovation) that execute trades via MCP tools.
Server has 7 tools with basic schemas and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-60 chars, mostly short), and input schemas are present with typed parameters. However, descriptions are often vague or lack context for LLM selection. No output schemas documented. Error handling is absent, no guidance on retryability, user-fixable errors, or recovery paths. No tool annotations (readOnlyHint/destructiveHint). Parameter descriptions are minimal. The 'rationale' parameter in buy_shares/sell_shares is unusual but undocumented. No pagination, no result limits documented. Security: credentials (PUSHOVER_USER, PUSHOVER_TOKEN) are injected server-side (good), but no audit logging visible. Composition is reasonable, tools are single-purpose, but output chaining not verified.
Buy shares of a stock.
At your discretion, if you choose to, call this to change your investment strategy for the future.
Get the cash balance of the given account name.
Get the holdings of the given account name.
This tool provides the current price of the given stock symbol.
Send a push notification with this brief message
Sell shares of a stock.
No output schemas documented. LLMs cannot plan downstream calls or extract return values reliably. get_balance returns float, get_holdings returns dict[str, int], buy_shares returns float, but no structured response format specified.
No error handling or recovery guidance. Tools lack descriptions of failure modes, retryability, or what the LLM should do if a call fails. E.g., buy_shares could fail if insufficient balance, no guidance provided.
Descriptions are too short (40-60 chars) and lack context. 'Get the cash balance of the given account name' does not explain when to use this vs get_holdings, or what the return value represents (total balance? available cash? margin?). Baseline: 194 chars average for A+ tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes. buy_shares and sell_shares should be marked destructiveHint=true; get_balance should be readOnlyHint=true.
'rationale' parameter in buy_shares and sell_shares is unusual and undocumented. Why is the LLM required to provide a rationale? Is this for audit logging? Does it affect execution? Undocumented dependencies cause misuse.