MCP server for searching and retrieving cultural heritage items from the Europeana API
Three tools with complete input schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names follow verb_noun convention (search_, get_). Descriptions are present but generic (avg ~120 chars, below 194-char baseline). Parameters lack individual descriptions in schema, LLMs cannot infer what 'qf' means from the name alone. Output schemas are not formally documented; responses are inferred from code. No error handling guidance, no pagination metadata, no per-item success/failure reporting. Composition is reasonable (three distinct concerns), but tools lack the polish expected of production-grade agents.
Get available filter categories for Europeana searches. Returns: Dictionary of filter categories and example values
Get detailed information about a specific Europeana item. Args: europeana_id: The Europeana ID for an item (e.g. "/9200365/BibliographicResource_3000059614459") Returns: Detailed metadata about the item
Search for items in Europeana. Args: query: Search terms to find cultural heritage items rows: Number of results to return (default: 10, max: 100) start: Starting position in search results (for pagination) qf: Query filters (e.g., ["TYPE:IMAGE", "COUNTRY:france"]) Returns: Search results from Europeana including metadata
Parameter descriptions missing from JSON Schema. 'qf' parameter in search_europeana has no description in the schema object, only in the docstring. LLMs cannot read docstrings; they parse schema descriptions. This forces LLMs to guess that 'qf' means 'query filters'.
Output schemas not formally documented. search_europeana returns a dict with 'totalResults' and 'items' array, but the schema for items (title, id, type, year, creator, country, provider, thumbnail, link) is inferred from code, not declared. LLMs cannot plan downstream calls without knowing the response structure.
No error handling guidance. If Europeana API returns 401 (invalid key), 404 (item not found), or 429 (rate limit), the tools will raise httpx.HTTPError with no recovery hint. LLMs receive a raw exception and cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
No pagination metadata in search results. search_europeana accepts 'start' and 'rows' but does not return 'next_cursor', 'has_more', or 'total_count' in a consistent format. LLMs cannot reliably iterate through large result sets.
get_available_filters description is too short (28 chars: 'Get available filter categories for Europeana searches.'). Below the 50-char minimum for clarity. Does not explain WHEN to call it or what structure it reveals.