MCP server for the simap.ch Swiss public procurement API — all cantons, read-only
Eight read-only tools with consistent naming (verb_noun pattern: search_*, get_*) and complete JSON schemas. All tools have descriptions (avg 85 chars, within 10-1024 range). Parameters are typed and described. However, descriptions are terse and lack WHEN/WHY guidance for LLM selection. No output schemas documented. Error handling is minimal, no recovery guidance or actionable error messages visible. Tool composition is sound (search → detail → history chain), but descriptions don't explain this flow. Schemas are present but sparse on constraints (no enums for canton, publication_type, process_type despite known valid values in constants.py).
Get detailed information about a specific procurement project. Requires both project_id and publication_id from search results.
Get the publication history for a procurement project. For projects with lots, requires a lot_id from the search hit.
Get the current status and availability of the simap.ch data source
Search for procurement awards with built-in filters
Search for procurement classification codes (CPV, BKP, etc.)
Search for procurement offices and institutions
Search for public procurement projects with required filters
No output schemas documented. LLMs cannot predict response structure or plan downstream calls. E.g., search_procurements returns SearchResponse but no field list is visible in tool definition.
Enum constraints not exposed in schemas. canton, publication_type, process_type, code_system accept known finite sets (CANTON_IDS, PUB_TYPES, PROCESS_TYPES, CODE_SYSTEMS in constants.py) but schemas use free-form strings. LLMs will hallucinate invalid values.
Descriptions lack WHEN/WHY guidance. 'Search for public procurement projects' does not explain when to use search_procurements vs search_procurements_detailed, or what 'detailed' means. LLMs cannot disambiguate.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Detailed search for public procurement projects with advanced filters
No error handling guidance. If a project_id or publication_id is invalid, what error is returned? How should the LLM recover? No recovery hints in descriptions.
Pagination not visible. search_* tools accept 'limit' but no offset/cursor or total_count documented. Large result sets risk context window exhaustion.