MCP server for searching and retrieving German Green Party (Grüne Hamburg) resolutions and policy documents using semantic search with vector embeddings
Three tools with clear German descriptions and proper Spring AI @Tool annotations. All tools have input schemas with type definitions and parameter descriptions. Tools follow verb_noun naming but in German (beschluesse_suchen, in_beschluss_suchen, beschluesse_listen), which is acceptable for domain-specific servers. No error handling guidance visible. Tool composition is sound, three distinct, single-responsibility tools with clear chaining potential (list → search → search-within).
Listet alle verfügbaren Beschlüsse (PDF-Dateien) auf. Nutze dieses Tool, um herauszufinden, welche Beschlüsse durchsucht werden können.
Sucht nach Beschlüssen der Grünen Hamburg basierend auf einer semantischen Suchanfrage. Gibt die relevantesten Beschlüsse mit Titel, Thema, Inhalt und PDF-Link zurück.
Sucht innerhalb eines bestimmten Beschlusses (PDF-Datei) nach relevanten Passagen. Nutze dieses Tool, wenn du gezielt in einem spezifischen Beschluss suchen möchtest.
Parameter descriptions include example values ('Klimaschutz', '2024-Wahlprogramm') which LLMs tend to reuse literally rather than adapt to context. Replace with formal constraints (enums, patterns, ranges).
Limit parameters (1-20, default 5) lack explicit min/max constraints in JSON Schema. Schema should declare minimum: 1, maximum: 20 to prevent LLM from passing invalid values.
Output schema not documented. BeschlussResult DTO structure (title, topic, content, pdfUrl, filename) is inferred from code but not formally declared in tool metadata. LLMs cannot plan downstream operations without knowing return fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
No error handling guidance. If beschlussName not found in inBeschlussSuchen, or if PDF parsing fails, no recovery hints provided. Errors should guide LLM to fallback (e.g., 'Try beschluesseListen() to see available documents').
beschluesseListen returns List<String> (filenames only). If downstream tools need metadata (upload date, topic, size), this forces an extra lookup. Consider returning structured objects with filename + metadata.