MCP server for Swedish traktamente (per diem) rates from Skatteverket
The Traktamente MCP server demonstrates solid definition quality with well-structured tool schemas, comprehensive parameter descriptions, and clear output documentation. All three tools follow consistent naming conventions (verb_noun pattern with 'traktamente_' prefix). Input schemas are properly defined using Zod with strict validation, type information, and min/max constraints. Descriptions are substantial (200+ chars) and explain context well. However, there are gaps in error handling guidance and some parameter descriptions could be more prescriptive about constraints. The server is domain-specific and read-only, limiting complexity.
Query Swedish traktamente (per diem) rates from Skatteverket's official database. This tool retrieves daily travel allowance rates for business trips to different countries. The rates are used by Swedish employers to calculate tax-free per diem payments. Args: - land (string, optional): Country name in Swedish. Supports regex patterns. - år (string, optional): Year to filter by (e.g., "2025") - landskod (string, optional): ISO country code (e.g., "SE", "NO") - normalbelopp (string, optional): Daily rate in SEK. Supports regex. - limit (number, optional): Max results (1-500, default: 100) - offset (number, optional): Pagination offset (default: 0) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: For JSON format: { "total": number, // Total matching results "count": number, // Results in this response "offset": number, // Current offset "limit": number, // Page size "results": [ { "land eller område": string, // Country name (Swedish) "normalbelopp": string, // Daily rate in SEK "år": string, // Year "landskod": string // ISO country code } ], "hasMore": boolean, // More results available "nextOffset": number // Offset for next page (if hasMore) } Examples: - Get Sweden's rate: { "landskod": "SE", "år": "2025" } - Get Nordic countries: { "land": "Norge|Danmark|Finland", "år": "2025" } - Paginate results: { "limit": 20, "offset": 20 } Note: Country names are in Swedish (e.g., "Tyskland" for Germany, "Frankrike" for France).
List all countries with available traktamente (per diem) rates. This tool retrieves a comprehensive list of all countries for which Skatteverket has published per diem rates. Use this when you need to see all available countries or when you're unsure of the exact country name. Args: - år (string, optional): Filter by year (e.g., "2025") - limit (number, optional): Max results (1-500, default: 200) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Same structure as traktamente_get_rates with a list of all countries. Examples: - List all countries for 2025: { "år": "2025" } - Get first 50 countries: { "limit": 50 } Use traktamente_search for fuzzy matching when you don't know the exact Swedish name.
Error handling lacks actionable recovery guidance. handleApiError() throws descriptive messages but does not suggest which tool to retry with or how to adjust parameters. LLMs cannot self-correct from '429 rate limited' without explicit recovery steps.
Parameter 'normalbelopp' description mentions regex support but does not specify format or examples clearly. 'Supports regex for range queries (e.g., "^3")' could confuse LLMs about whether this is a numeric range or pattern matching. Should clarify: numeric values only, regex for filtering strings representing amounts.
Search tool description references Swedish country name conventions but does not provide a discovery mechanism for learning those names. Tool suggests 'Use traktamente_search for fuzzy matching' but user may not know Swedish spellings exist. Consider cross-referencing traktamente_list_countries in search description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 74 | 2025-06-18+ | v2 |
| 2026-03-09 | C | 63 | - | v1 |
Search for traktamente rates by country name using pattern matching. This tool is ideal when you don't know the exact Swedish spelling of a country name. It supports regex patterns for flexible searching. Args: - search (string, required): Search term or regex pattern - år (string, optional): Filter by year (e.g., "2025") - limit (number, optional): Max results (1-500, default: 50) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: { "searchTerm": string, // The search pattern used "count": number, // Number of matches "results": [...] // Matching traktamente records } Examples: - Find France: { "search": "Frank" } → finds "Frankrike" - Find Germany: { "search": "Tysk" } → finds "Tyskland" - Countries starting with S: { "search": "^S" } - Case-insensitive: { "search": "[Ss]pan" } → finds "Spanien" Tip: Swedish country names often differ from English (Tyskland=Germany, Frankrike=France, Spanien=Spain, Schweiz=Switzerland).
Output schema documents fields but does not explain when 'hasMore' is true vs false or what 'nextOffset' value to use. LLMs need explicit pagination guidance: 'If hasMore=true, call with offset=nextOffset to fetch the next batch.'
No dry-run or confirmation pattern. While tools are read-only and safe, the server lacks any mention of this safety property in capability metadata or tool annotations. LLMs benefit from explicit readOnlyHint declarations to avoid over-cautious prompting.