MCP server for tools and resources over normalized political trade data. Tracks U.S. politician stock trades from STOCK Act filings with alert scoring and AI summaries.
Strong tool naming (verb_noun pattern consistently applied) and comprehensive parameter schemas with proper type constraints (enums, min/max bounds). Descriptions are present and substantive (avg ~150 chars), exceeding the 10-char minimum. However, output schemas are not explicitly documented in the visible code, responses are inferred from JSON serialization. Error handling is minimal; no recovery guidance or actionable error messages visible. Tool composition is sound (single responsibility per tool), but some parameter descriptions lack actionable format hints (e.g., 'YYYY-MM-DD' format for date strings is mentioned in some but not all date params). No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification (READ_ONLY vs WRITE).
Add a politician to the watchlist.
Add a disclosed trade to an experiment as a simulated position. Entry price defaults to the current market price (the price when YOU saw the filing, not the politician's entry).
Create a copy-trading experiment (e.g. "$10,000, copy watchlist trades filed within 30 days").
AI daily briefing: top trades by score, watchlist activity, clusters, stale-filing warnings. Modes: research, youtube, newsletter.
Retrieve scored alerts (fresh trades, large trades, watchlist hits, clusters, stale-filing warnings).
Retrieve experiment details, positions, and P&L.
Latest publicly disclosed U.S. politician stock trades (STOCK Act filings, delayed up to 45 days). Sorted newest-published first with alert scores and AI summaries.
Output schemas not explicitly documented. Responses are JSON-serialized but no formal schema definitions (e.g., 'returns: {trades: Trade[], count: number}') are visible in tool registration. LLMs cannot reliably plan downstream calls without knowing response structure.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk stratification. Tools marked 'WRITE' (create_experiment, add_trade_to_experiment, add_to_watchlist, remove_from_watchlist) should declare destructiveHint=true to signal irreversibility to agents.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Profile for one politician: metadata, trading stats, filing-delay behaviour, top tickers, recent trades, AI summary.
Political trading activity for one ticker: buys/sells, politicians involved, disclosed volume, recent filings.
Retrieve the current watchlist of politicians.
List all experiments with summary stats.
Rank politicians for watchlist selection by activity, freshness (low filing delay), estimated return, large trades, or a combined watchlist score.
Remove a politician from the watchlist.
Search normalized trades by politician, ticker, issuer, party, chamber, date range, filing delay, or source.
Error handling lacks recovery guidance. No visible error responses with actionable next steps (e.g., 'Politician not found. Try rank_politicians() to discover available politicians'). Errors should categorize as retryable, user-fixable, or fatal.
Date parameter descriptions inconsistent. Some mention 'YYYY-MM-DD' format (dateFrom, dateTo in search_trades), others omit format guidance (date in generate_daily_briefing). All date params should explicitly state format to prevent LLM hallucination.
Pagination guidance incomplete. search_trades and list_experiments accept limit/offset but descriptions do not state max result count or whether total_count is returned. Without explicit pagination semantics, LLMs cannot reliably iterate large result sets.