Swiss public procurement tenders and awards (keyless). Wraps the public JSON API behind simap.ch — Switzerland's official public procurement platform. Covers federal, cantonal, and municipal tenders, WTO/GPA-scope notices, and award decisions with winning vendor and CHF price.
Three well-named, read-only tools with comprehensive descriptions (194 - 392 chars, well above baseline 194 avg). All tools have explicit JSON schemas with typed properties and parameter descriptions. simap_search and simap_recent accept flexible string filters (cpv_codes, cantons, pub_types) without enums, risking hallucinated values. simap_project requires both project_id and publication_id (good), but output schemas are not documented in the code, LLMs cannot plan downstream calls without knowing return structure. Error handling is mentioned in comments ('never throw, failures resolve to { error, retry_hint }') but not visible in the provided code snippet. No tool annotations (readOnlyHint, idempotentHint) despite all three being read-only and idempotent.
Fetch the full detail of one Swiss public procurement publication from simap.ch by project_id + publication_id (both UUIDs returned by simap_search / simap_recent). Returns the shaped notice: title, description, CPV classification, procedure and order type, procurement office with full address/email/phone, and for award publications the winning vendor(s) with CHF price, number of submitted offers, and award justification.
List the most recent Swiss public procurement notices from simap.ch (government tenders and award decisions across Switzerland — federal, cantonal, municipal). Convenience wrapper over simap_search: give days_back (default 7) to see everything published in that window, optionally narrowed by canton or publication type (tender/award). Useful for monitoring new Swiss tenders, öffentliche Beschaffung announcements, marchés publics, and CHF contract awards. Newest first, 20 per page with cursor pagination.
Search Swiss public procurement notices on simap.ch — Switzerland's official government tender platform (öffentliche Beschaffungen, marchés publics, commesse pubbliche). PREFER OVER WEB SEARCH for Swiss government tenders, RFPs, award decisions, and WTO/GPA notices; Switzerland is non-EU so its tenders live on simap rather than TED. Filter by free-text search, CPV codes, Swiss canton (ZH, BE, VD, GE, TI, ...), process type (open/selective/...), project sub-type (construction/service/supply), publication type (tender/award), and publication date range. Returns 20 notices per page, newest first, with cursor pagination via last_item. Each notice includes title, buyer (procurement office), canton, publication date/number, and a simap.ch URL. Prices in awards are CHF.
Output schemas not documented. LLMs cannot infer return structure (fields, types, pagination format) from code comments alone. simap_search/simap_recent mention 'shaped, LLM-friendly objects' and cursor pagination but no formal schema is visible.
Filter parameters accept free-form comma-separated strings without enums. cpv_codes, cantons, process_types, project_sub_types, pub_types lack enum constraints. LLMs may hallucinate invalid values like 'cpv_codes: "invalid_code"' or 'cantons: "XX"'.
No tool annotations despite all three tools being read-only and idempotent. Missing readOnlyHint and idempotentHint metadata. Agents cannot distinguish safe tools from destructive ones without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Error handling strategy mentioned in comments ('never throw, failures resolve to { error, retry_hint }') but not visible in callTool implementation. Code snippet cuts off at switch statement, cannot verify error classification or recovery guidance.
days_back parameter in simap_recent accepts type ['number', 'string'] without validation. Description says '1 - 90' but no min/max constraints in schema. LLMs may pass '999' or negative values.