Public Money Mirror as MCP — citizen-level Bundeshaushalt queries + anomaly heuristics + curated Bundesrechnungshof findings, exposed as Model Context Protocol tools.
Five tools with clear verb-noun naming (get_, compute_, detect_, lookup_, compare_). All have descriptions (194 - 280 chars, within baseline 34 - 392). Input schemas present with types and descriptions. Output schemas documented in docstrings. Main gaps: no enum constraints on string parameters (keyword, category, year); no explicit error recovery guidance; no tool annotations (readOnlyHint); parameter descriptions could be more prescriptive about valid ranges and formats. Tracing decorator adds observability but does not substitute for structured error messages.
Compare an Einzelplan's allocation between two fiscal years — surface the absolute delta + percentage change. Flags large year-over-year changes.
Compute the distribution + top-N ranking from a year's Einzelplan data.
Flag Einzelpläne whose share of the budget falls significantly outside the typical range (per the EFFICIENCY_BENCHMARKS heuristic, EU-average informed).
Return the federal budget summary for a given fiscal year — totals plus the Einzelplan (ministry) breakdown.
Search the bundled set of Bundesrechnungshof (Federal Audit Office) findings by keyword. Substring match against keyword tag, title, and finding text.
String parameters lack enum constraints. 'keyword' in lookup_brh_findings and 'category' in compare_years accept free-form strings; no validation against known Einzelplan names or audit office tags. LLMs will hallucinate invalid values.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All five tools are read-only and idempotent, but this is not declared in the schema. Agents cannot infer safety properties without explicit hints.
Error responses lack recovery guidance. When year is not available, the tool returns available_years but does not suggest 'Try again with one of these years.' Agents receive data but no actionable next step.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | <=2025-11-25 | v2 |
Parameter descriptions lack prescriptive constraints. 'fiscal year (2024 or 2025 currently bundled)' is informal; should state 'integer in range [2024, 2025]' or use JSON Schema minimum/maximum. 'top_n' has no bounds (could be 0, negative, or 1000000).
Output schema for detect_anomalies includes nested 'anomalies' and 'vendor_concentration_warnings' arrays but does not specify per-item field types (e.g., is 'severity' a string enum or numeric score?). LLMs cannot reliably extract structured data.