OpenHolidays MCP. Public AND school holidays for ~30 European countries, with regional subdivisions, from openholidaysapi.org. Keyless. Complements the worldwide-public-only `nager-holidays` pack: OpenHolidays is Europe-focused but adds *school* holidays (term breaks) and per-subdivision granularity, which nager does not provide.
OpenHolidays MCP has well-structured tool definitions with complete input schemas and clear descriptions. All 4 tools have proper JSON Schema with typed properties and required fields. Descriptions are substantive (100-200 chars) and explain the Europe-focused scope and use cases. However, output schemas are not documented, LLMs cannot predict response structure. Parameter descriptions are good but lack format constraints (e.g., date format validation, language code validation). No error handling guidance is provided. Tool naming follows verb_noun convention (list_*, public_holidays, school_holidays) and is clear. Security is solid (keyless, read-only). Composition is good, tools chain well (list_countries → list_subdivisions → school_holidays). Missing: output schema documentation, input validation rules in descriptions, error recovery guidance.
List the ~30 European countries OpenHolidays covers, with their ISO codes and official languages. EUROPE-focused. Keyless.
List the regional subdivisions (federal states, regions, cantons, etc.) of a European country, with their codes and category. Use the returned codes to scope school_holidays. EUROPE-focused. Keyless.
Public (statutory) holidays for a European country in a date range, with regional subdivisions. EUROPE-focused (~30 countries: DE, FR, NL, CH, IT, AT, BE, ES, PL, etc.). Returns each holiday with its localized name, dates, whether it is nationwide, and which subdivisions observe it. Keyless. For school terms/breaks use school_holidays instead.
School holidays (term breaks: Christmas, Easter, summer, etc.) for a European country in a date range, optionally scoped to one subdivision. This is the unique value-add over worldwide public-holiday sources — school calendars vary by region. EUROPE-focused (~30 countries). Returns each break with its localized name, dates, and observing subdivisions. Keyless.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). Code shows mapHoliday() returns {name, start_date, end_date, nationwide, subdivisions} but this is not declared in tool definitions.
Parameter descriptions lack format constraints. 'valid_from' and 'valid_to' say 'YYYY-MM-DD' but do not specify validation rules (e.g., 'must be valid ISO 8601 date, not future dates'). 'language' accepts 'ISO 639-1' but does not list supported languages or fallback behavior.
No error handling guidance. Code returns {error: '...'} on validation failures and API errors, but tool descriptions do not explain what errors are possible or how to recover. E.g., 'country must be a 2-letter ISO 3166-1 alpha-2 code' is returned at runtime, not documented upfront.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
No pagination or result limits documented. Tools may return large result sets (e.g., all school holidays for a country over 10 years). Code does not show pagination support, and descriptions do not warn about result size or offer limits.
Transport mechanism unknown. package.json lists 'main: src/index.ts' but does not specify how the server exposes itself (STDIO, HTTP, SSE, etc.). No MCP server initialization code visible (e.g., StdioServerTransport, HttpServerTransport).