MCP Server for Canton Zurich legislation (ZH-Lex) — full-text search, article extraction, and education law tools
OpenLex MCP demonstrates solid definition quality with consistent naming patterns, comprehensive parameter schemas, and clear descriptions in German. All 8 tools follow verb_noun naming (search_*, get_*, list_*, refresh_*). Input schemas are well-structured with type constraints, minLength/maxLength bounds, and defaults. Descriptions are present and contextual (avg ~120 chars). However, output schemas are not documented, LLMs cannot predict response structure. Error handling guidance is absent; tools do not indicate what to do on failure. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles (7 READ_ONLY, 1 WRITE). Parameter descriptions could be more prescriptive about valid formats and dependencies.
Einzelnen Artikel aus einem Gesetz extrahieren.
Status des lokalen Gesetzes-Cache abrufen.
Gesetz nach Ordnungsnummer oder Abkürzung abrufen.
Alle verfügbaren Zürcher Gesetze auflisten.
Lokalen Cache aktualisieren (lädt Gesetze von HuggingFace neu).
Spezialisierte Suche in Bildungsrecht (Volksschulgesetz, Lehrerpersonalverordnung etc.).
Volltextsuche innerhalb eines einzelnen Artikels.
Volltextsuche in allen Zürcher Gesetzen.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Tools return law objects, metadata, or cache status but no schema is visible in definitions.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). refresh_cache is marked WRITE but lacks destructiveHint annotation; 7 READ_ONLY tools lack readOnlyHint. Agents cannot infer safety/retry semantics.
No error handling guidance. Tools do not document failure modes, recovery steps, or what to do if a law is not found, cache refresh fails, or search returns no results.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2025-06-18+ | v2 |
get_cache_status and refresh_cache have minimal descriptions (<60 chars). Descriptions do not explain when to call them, what cache contains, or why refresh might be needed.
search_education_law description lacks context on scope. Does it search only education laws or all laws with education keywords? Relationship to search_laws is unclear.