16 tools with consistent verb-noun naming (get_*, all starting with action verbs). All tools have descriptions (10-200 chars, well within baseline 10-1024 range). Input schemas present with type definitions and enums for constrained parameters. However, output schemas are deliberately unstructured (UnstructuredFastMCP class disables structured_output by default), which violates pattern:response-shaper. Parameter descriptions are present but terse (avg ~40 chars vs baseline 72). No error handling guidance visible in tool implementations. No pagination support despite tools returning potentially large datasets (e.g., get_all_stock returns ~5000 stocks, ~1 MB). Missing output field documentation.
Fetch adjustment factor data for calculating adjusted prices. Factors exist only on ex-div / ex-rights dates; a window with none returns an empty list.
Search stocks by name. Returns matching code, code_name, and tradeStatus.
Fetch PBoC benchmark deposit or loan rates within a date range.
Fetch a year's dividends: annual cash total plus every payout's detail. A year with several distributions has one entry per payout in `payouts` (full detail). `annual_cash_per_share_pretax` is their summed dividCashPsBeforeTax — the yearly total, so callers needn't add across rows. Within a single payout, semicolon-separated multi-values in the cash-dividend fields are already summed by the client.
Fetch a quarterly financial report; `report` selects which statement. baostock splits quarterly fundamentals across six statements, each with a distinct field set. All values are cumulative-from-year-start: quarter=1 is 3-month, 2 is H1 (6-month), 3 is 9-month, 4 is FY (12-month).
Unstructured output by design (UnstructuredFastMCP disables structured_output). Violates pattern:response-shaper, LLMs cannot validate or parse output schema, increasing hallucination risk and token waste. Justification (column drift in baostock) is valid but should be addressed via schema flexibility, not disabling structure entirely.
No pagination support for large result sets. get_all_stock returns ~5000 stocks (~1 MB) with no limit/offset/page parameters. Violates pattern:paginated-result and mxe:enforce-result-limits. LLM context window exhaustion risk.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2025-06-18+ | v2 |
Fetch a full financial statement (all periods, all columns) from EastMoney via akshare. `statement` selects which one (each is a separate EastMoney endpoint — one fetch per call, so request only the statement you need): - "balance" 资产负债表 — point-in-time snapshot per report date. - "income" 利润表 — key fields OPERATE_INCOME, NETPROFIT, ... - "cash_flow" 现金流量表 — key fields NETCASH_OPERATE (operating cash flow), CONSTRUCT_LONG_ASSET (capex).
Fetch historical K-line (OHLCV + valuation) data for a Chinese A-share stock.
Fetch constituent stocks of a major A-share index. index: - 'sz50': SSE 50 (上证50). - 'hs300': CSI 300 (沪深300). - 'zz500': CSI 500 (中证500).
Most recent trading date with K-line data published. Returns 'YYYY-MM-DD'. Probes CSI 300 (sh.000300) directly and returns the date of its latest available daily bar. This is the safe anchor date for follow-up K-line queries — guaranteed to have data, regardless of wall-clock time. On a trading day before market close, today's bar is not yet published, so this returns the previous trading date.
Fetch money supply data (M0, M1, M2) at monthly or yearly frequency.
Compute net debt from the latest balance sheet (conservative upper bound). net_debt = SHORT_LOAN + LONG_LOAN + BOND_PAYABLE + NONCURRENT_LIAB_1YEAR - MONETARYFUNDS
Fetch performance express (业绩快报) or forecast (业绩预告) reports.
Fetch required reserve ratio data.
Fetch basic info: code, code_name, ipoDate, outDate, type, status.
Fetch industry classification data.
Fetch trading calendar. Each row has calendar_date and is_trading_day ('1'/'0').
No output schema documentation visible. Tools return list[Record] (dict[str, object]) but field names, types, and semantics are not documented. LLMs cannot plan downstream tool calls or extract specific fields without trial-and-error.
No error handling guidance. Tools return raw baostock/akshare errors with no recovery hints. Violates pattern:recovery-guide. LLMs cannot self-correct on invalid stock codes, date ranges, or API failures.
Parameter descriptions are terse (avg ~40 chars vs baseline 72). Missing format/constraint details. E.g., 'date' params lack 'YYYY-MM-DD' format hint in descriptions; 'code' params lack baostock format examples (sh.600519 vs sz.000001); 'year' lacks 4-digit requirement.