MCP server for Swiss federal finances (EFV): budget, debt, forecasts and spending data
Five tools with complete schemas, descriptions, and proper typing. All parameters have descriptions and types. Tool names follow verb_noun pattern (fiscal_*). Descriptions are domain-specific and actionable (avg ~120 chars). Output schemas are documented via Pydantic models. Error handling is present via mask_error_details=True and structured logging. Main gaps: no enums for constrained inputs (e.g., 'household' accepts 'bund'|'kantone'|'gemeinden' but not declared as enum); no pagination support despite potential for large result sets; descriptions lack explicit 'when to use' guidance for disambiguation between similar tools (fiscal_headline vs fiscal_budget_breakdown).
Fetch budget breakdown by category (e.g., spending by task area) for a given topic, year, and hierarchy level.
Fetch headline fiscal series (e.g., budget balance, revenue, spending) for a given variable, household, and model, optionally filtered by year range.
Fetch spending or staffing data by federal department and administrative unit.
List all valid dimensions (variables, households, models, topics, departments) available in the EFV datasets.
Check the health and reachability of all EFV datasets. Returns which datasets are currently accessible or cached, and whether the server is healthy.
Constrained string parameters lack enum declarations. 'household' accepts 'bund'|'kantone'|'gemeinden' and 'model' accepts 'fs'|'nfa', but these are documented only in descriptions, not as JSON Schema enums. LLMs cannot parse constraints from text alone and may hallucinate invalid values.
No pagination support despite tools returning potentially large result sets (e.g., fiscal_list_dimensions, fiscal_budget_breakdown with multiple hierarchy levels). No limit, offset, or cursor parameters. Large responses risk context window exhaustion.
Tool descriptions lack 'when to use' guidance. fiscal_headline and fiscal_budget_breakdown both retrieve spending data but serve different purposes (time series vs category breakdown). LLMs cannot disambiguate without explicit guidance on which to call for a given intent.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | <=2025-11-25 | v2 |
fiscal_status description is minimal (60 chars: 'Check the health and reachability of all EFV datasets.'). Does not explain what 'health' means, what 'cached' implies, or when an LLM should call this vs proceeding with a data request.
No explicit error recovery guidance in tool descriptions. If fiscal_headline returns no data for a year range, the description does not suggest calling fiscal_list_dimensions to discover valid years or fiscal_status to check data availability.