MCP server for political finance data: campaign contributions, lobbying, voting records via FEC and OpenSecrets APIs
Server has 6 tools with basic schemas and descriptions in German. All tools have input schemas with types and descriptions, which is positive. However, descriptions are generic and lack LLM-optimized guidance on WHEN to use each tool vs. alternatives. Parameter descriptions are minimal (e.g., 'Name des Kandidaten' without format hints). No output schemas documented. Error handling is minimal, most tools return raw API responses or generic error dicts without recovery guidance. No tool annotations (readOnlyHint, etc.). Tools lack composition guidance (e.g., which tool to call first for discovery). German descriptions reduce LLM clarity in English-dominant environments.
Gibt einen Überblick über die Wahlkampffinanzierung eines Jahres.
Ruft Spendeneinnahmen und -ausgaben eines Kandidaten ab.
Ruft Abstimmungsverhalten eines Kongressmitglieds ab (via ProPublica).
Ruft PAC-Ausgaben (Political Action Committees) ab.
Zeigt Top-Spender nach Industrie/Branche (via FEC).
Sucht nach Einzelspenden einer Person an Wahlkämpfe.
No output schemas documented. Tools return dicts with field names inferred from code (e.g., 'kandidat', 'partei', 'einnahmen_gesamt') but LLMs cannot plan downstream calls without knowing what fields to expect. Violates pattern:tool and pattern:response-shaper.
Descriptions are in German and generic. E.g., 'Ruft Spendeneinnahmen und -ausgaben eines Kandidaten ab' (194 chars) lacks WHEN to use this vs. get_campaign_finance_summary, what fields are returned, or prerequisites. Violates pattern:tool-description baseline of 50-200 chars with actionable context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
Parameter descriptions lack format hints and constraints. E.g., 'Name des Kandidaten (z.B. "Biden", "Trump")' includes example values that LLMs may reuse literally. Should use enums or patterns instead. Violates pattern:constrained-input and review:param-validation-rules.
Error handling is minimal. get_congress_member_votes returns a fallback dict with 'info' and 'tipp' fields instead of actionable error guidance. Most tools call raise_for_status() but do not catch/translate API errors into recovery guidance. Violates pattern:recovery-guide.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only but this is not declared. Violates current MCP spec (2026-07-28) tool annotation pattern.