swiss-school-calendar-mcp
🇨🇭 Parte del Swiss Public Data MCP Portfolio
Este es un proyecto privado. Es independiente de cualquier empleador o afiliación institucional y no representa ninguna posición oficial de ninguna autoridad.
📅 swiss-holidays-mcp
Un calendario de festivos suizo para agentes de IA — festivos públicos, vacaciones escolares y fines de semana largos para los 26 cantones, con comparación intercantonal. Las vacaciones escolares se diferencian por Schulart (tipo de escuela), lo que importa más de lo que parece a primera vista. No se requiere clave de API.
Resumen
swiss-holidays-mcp es un calendario de festivos suizo para asistentes de IA como Claude — festivos públicos, vacaciones escolares y fines de semana largos para los 26 cantones, sin necesidad de claves de API. Los festivos públicos son cantonales (Berchtoldstag, Fronleichnam y compañía varían según el cantón, no solo el mínimo federal). Las vacaciones escolares se fijan a nivel cantonal, a veces a nivel de distrito y — en seis cantones — por separado según el tipo de escuela. No existe un calendario federal único; cualquiera que planifique a través de fronteras cantonales se ve reducido a abrir 26 páginas PDF.
El servidor cubre dos grupos temáticos: festivos públicos / fines de semana largos y vacaciones escolares (con diferenciación por Schulart). Cada grupo se asigna a un conjunto de herramientas específicas que transforman los datos brutos de las agencias en respuestas JSON limpias y etiquetadas con su procedencia. Todos los datos provienen de la OpenHolidays API (CC BY 4.0) y de Nager.Date (MIT).
Regla mnemotécnica: Un duplicado en los datos escolares suizos suele ser un tipo de escuela disfrazado. La API subyacente publica el mismo periodo de vacaciones varias veces cuando un cantón diferencia por tipo de escuela. Eso parece datos duplicados e invita a una deduplicación ingenua — que destruiría precisamente la distinción que necesita una autoridad escolar.
Consulta de demostración ancla: "¿En qué semanas de 2026 están de vacaciones simultáneamente las escuelas obligatorias de Zúrich, Zug y Argovia — y cuántos días de solapamiento comparte cada par?"
→ Esto ejercita find_common_free_window, compare_school_holidays y list_school_types en una sola conversación, y responde a una pregunta que se repite en cada ciclo de planificación de la coordinación intercantonal.
→ Más casos de uso por audiencia →
Demostración
Related MCP server: mcp-nager-holidays
Características
🏫 Vacaciones escolares — periodos por cantón y rango de fechas, diferenciados por Schulart (
VS/MS/BS/EO)🎌 Festivos públicos — conjuntos de festivos cantonales, no solo el mínimo federal (Berchtoldstag y compañía)
🔍 Comprobación de fechas — ¿es una fecha determinada un festivo escolar o público en un cantón?
🔗 Comparación intercantonal — matriz de solapamiento por pares de días festivos entre cantones
🪟 Ventanas libres comunes — rangos de fechas en los que todos los cantones listados están simultáneamente de vacaciones
🌉 Fines de semana largos y días puente — calculados a partir de los festivos públicos federales (Nager.Date)
🏘️ Festivos locales y municipales — particularidades a nivel de distrito y municipio como el Sechseläuten y el Knabenschiessen de Zúrich, con un marcador
scopepara que nunca se confundan con festivos de todo el cantón📆 Exportación iCal / ICS — los festivos de un cantón para un año como calendario
.icslisto para importar🔖 Recurso de feed de festivos — recurso MCP
holidays://<canton>/<year>con un resumen en Markdown📌 "¿Es hoy festivo?" — comodidad de una sola llamada para la pregunta cotidiana
🩺 Salud de las fuentes — accesibilidad y latencia de ambos proveedores, siempre evaluable
🔑 Sin autenticación requerida — ambas fuentes de datos son de acceso público
☁️ Transporte dual — stdio para Claude Desktop, Streamable HTTP/SSE para despliegue en la nube
🧾 Procedencia en cada respuesta —
live_api|cached|degraded, nunca una lista vacía silenciosa
Fuentes de datos
Fuente | Datos | Licencia |
Cantones, Schularten, vacaciones escolares, festivos públicos | CC BY 4.0 | |
Fines de semana largos y días puente requeridos | MIT |
Ambas fuentes son de acceso público, no se requiere autenticación. Atribución requerida: OpenHolidays (CC BY 4.0) y Nager.Date deben citarse como fuente al usar sus datos.
Herramientas
Herramienta | Propósito | Fuente de datos |
| Los 26 cantones con códigos ISO e idiomas oficiales | OpenHolidays |
| Grupos de Schulart por cantón ( | OpenHolidays |
| Vacaciones escolares para un cantón y rango de fechas | OpenHolidays |
| Festivos públicos para un cantón y año | OpenHolidays |
| Festivos públicos para un municipio o distrito, incl. particularidades locales | OpenHolidays |
| ¿Es una fecha determinada un festivo escolar o público? | OpenHolidays |
| Matriz de solapamiento por pares entre cantones | OpenHolidays |
| Ventanas en las que todos los cantones listados están de vacaciones | OpenHolidays |
| Los próximos periodos de vacaciones | OpenHolidays |
| Fines de semana largos y días puente requeridos | Nager.Date |
| Los festivos de un cantón para un año como documento iCalendar ( | OpenHolidays |
| ¿Es hoy un festivo escolar o público en un cantón? | OpenHolidays |
| Accesibilidad y latencia de ambos proveedores | Integrado |
Recursos
URI del recurso | Contenido |
| Resumen en Markdown de todos los festivos públicos + escolares, p. ej. |
Todas las herramientas llevan el conjunto completo de anotaciones — readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true (acceden a una API externa). Ninguna herramienta escribe en ningún sitio. Las entradas se validan contra el esquema (los códigos de cantón contra los 26 cantones conocidos, las fechas como YYYY-MM-DD, year acotado, language/school_type en listas blancas).
Ejemplos de casos de uso
Consulta | Herramienta |
"¿Qué cantones existen y cuáles son sus códigos?" |
|
"Muestra las vacaciones de las escuelas obligatorias de Zúrich para la primavera de 2026" |
|
"¿Es el 3 de abril de 2026 un festivo público en el Tesino?" |
|
"¿Se solapan las vacaciones escolares de Zúrich y Zug este año?" |
|
"¿Cuándo pueden ZH, ZG, AG planificar una semana conjunta sin escuela?" |
|
"¿Cuáles son las próximas vacaciones para las escuelas de Basilea-Ciudad?" |
|
"¿Qué fines de semana largos tiene 2026 y qué días puente necesitan?" |
|
"¿Qué festivos locales celebra la ciudad de Zúrich que el resto del cantón no celebra?" |
|
"Exporta los festivos de Zúrich de 2026 como calendario .ics que pueda importar" |
|
"¿Es hoy festivo en Argovia?" |
|
🛡️ Seguridad y límites
Aspecto | Detalles |
Acceso | Solo lectura ( |
Datos personales | Sin datos personales — todas las fuentes son calendarios de festivos públicos agregados |
Caché | TTL en memoria de 12 horas (las tablas de festivos cambian unas pocas veces al año) |
Reintentos | Retroceso exponencial 2s / 4s / 8s; los 4xx excepto 429 no se reintentan |
Tiempo de espera | 20 segundos por llamada a la API (8 segundos para sondas de salud) |
Autenticación | Sin claves de API requeridas — ambos proveedores son de acceso público |
Degradación | Un fallo del proveedor produce un envoltorio |
Condiciones de servicio | Sujeto a las condiciones de servicio de las respectivas fuentes de datos: OpenHolidays, Nager.Date |
Arquitectura
Este servidor utiliza la Arquitectura A (solo API en vivo, con caché en memoria).
┌──────────────────────────┐
Claude / any ───▶│ swiss-holidays-mcp │
MCP host │ (MCPServer · 13 tools) │
└────────┬─────────────────┘
│ retry 2s/4s/8s · 12h cache
┌────────┴─────────┐
▼ ▼
OpenHolidays API Nager.Date
(CC BY 4.0) (MIT)
cantons · Schularten long weekends
school + public bridge daysJustificación (verificada en vivo el 2026-07-19):
Los diez endpoints documentados de OpenHolidays respondieron HTTP 200 con cargas útiles plausibles;
/Subdivisions?countryIsoCode=CHdevuelve exactamente 26 cantones, coincidiendo con el recuento oficial.No se pudo verificar ningún volcado público masivo en el momento de la compilación (el acceso bruto a
openpotato/openholidays.datadevolvió 404), por lo que la Arquitectura B no estaba disponible.Las tablas de festivos cambian unas pocas veces al año, por lo que un TTL en memoria de 12 horas elimina casi toda la carga del proveedor sin arriesgar datos obsoletos.
Consecuencias:
Cada respuesta lleva
provenance(live_api|cached|degraded).Un fallo del proveedor produce un envoltorio
degradedcon unanoteexplicativa, nunca una lista vacía silenciosa.source_statussiempre devuelve un informe de salud evaluable.
Hallazgos de la sonda en vivo (2026-07-19)
Endpoint | HTTP | Estado | Registros | Nota |
| 200 | ✅ funciona | 36 | |
| 200 | ✅ funciona | 26 | coincide con el recuento oficial de cantones |
| 200 | ✅ funciona | 11 | grupos Schulart, solo 6 cantones |
| 200 | ✅ funciona | 39 | ámbito cantonal incluido |
| 200 | ✅ funciona | 193 | 183 distintos tras la división por tipo de escuela |
| 200 | ✅ funciona | – | |
| 200 | ⚠️ vacío silencioso | 0 | país no válido ≠ error |
| 200 | ⚠️ retroceso silencioso a EN | 26 | idioma no válido ≠ error |
| 400 | ✅ error correcto | – | RFC 9110 problem+json |
Nager | 200 | ✅ funciona | 33 | 29 filas llevan |
Nager | 200 | ✅ funciona | 3 | |
Nager | 404 | ✅ error correcto | – | más estricto que OpenHolidays |
Hallazgos conocidos
Los aparentes duplicados son tipos de escuela. Zúrich devuelve Frühlingsferien 2026 dos veces: una para
CH-ZH-VS(Volksschulen, etiquetadoRecommended) y otra paraCH-ZH-BS+CH-ZH-MS(Berufsfach- y Mittelschulen). Use el parámetroschool_type(VS/MS/BS/EO) en lugar de eliminar duplicados.Solo seis cantones diferencian por tipo de escuela (AI, AR, BE, GR, SO, ZH). En el resto,
groupsestá ausente y una sola tabla lo cubre todo. Por lo tanto, el filtro trata un campogroupsausente como "aplica a todos".Los códigos de subdivisión mezclan niveles. Los registros pueden llevar
CH-AI-APoCH-BE-TH-BL. Siempre haga coincidir el prefijoCH-XX, nunca la igualdad de cadenas.Una lista vacía no es una respuesta. Un código de país o cantón desconocido devuelve HTTP 200 con
[]. Este servidor establece unanoteexplicativa para que "sin vacaciones" y "filtro incorrecto" sigan siendo distinguibles.
Requisitos previos
Python 3.10 o superior
uv / uvx (recomendado) o pip
Acceso a Internet (ambas API son de acceso público)
Instalación
Ejecute mediante uvx de uv — no se necesita clonar ni instalar manualmente:
uvx swiss-holidays-mcpDesarrollo
git clone https://github.com/malkreide/swiss-holidays-mcp
cd swiss-holidays-mcp
pip install -e ".[dev]"Configuración
Claude Desktop
Añada a claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"swiss-holidays": {
"command": "uvx",
"args": ["swiss-holidays-mcp"]
}
}
}Reinicie Claude Desktop — el servidor se inicia automáticamente en el primer uso.
Implementación en la nube (SSE / Streamable HTTP para acceso desde navegador)
Para su uso a través de claude.ai en el navegador (p. ej., en estaciones de trabajo gestionadas sin software local):
MCP_TRANSPORT=sse PORT=8000 python -m swiss_holidays_mcpEl SDK expone SSE en /sse, no en /mcp.
Variable | Valor por defecto | Descripción |
|
| Transporte: |
|
| Puerto para transportes HTTP |
|
| Dirección de enlace para transportes HTTP. Bucle local por defecto; |
| (vacío) | Orígenes CORS adicionales separados por comas para clientes de navegador (auditoría SDK-004). Los orígenes de bucle local siempre están permitidos; añada el origen público desde el que se sirve su interfaz, p. ej. |
Los transportes HTTP adjuntan una capa CORS explícita que expone la cabecera
Mcp-Session-Id, de modo que un cliente MCP de navegador pueda leer el id de
sesión y realizar solicitudes de seguimiento. La lista de permitidos nunca es un
comodín.
Ejecutar más de una instancia HTTP detrás de un balanceador de carga requiere
sesiones fijas basadas en Mcp-Session-Id — consulte docs/scaling.md
para ejemplos con nginx/Traefik/Kubernetes. Una sola instancia (el caso común) no
necesita configuración de afinidad.
💡 "stdio para el portátil del desarrollador, SSE para el navegador."
Estructura del proyecto
swiss-holidays-mcp/
├── src/
│ └── swiss_holidays_mcp/
│ ├── __init__.py # Package init
│ ├── __main__.py # Entry point: stdio / SSE / Streamable HTTP
│ ├── server.py # MCPServer: lifespan, 13 tools, 1 resource, op_* logic
│ ├── client.py # Shared HTTP client: retry, 12h cache, egress guard
│ ├── guard.py # Egress / SSRF guard (HTTPS + allow-list + IP blocklist)
│ ├── pinning.py # DNS-pinning transport (TOCTOU-free connect, SEC-005)
│ ├── ical.py # RFC 5545 iCalendar (.ics) writer
│ ├── settings.py # Pydantic-Settings config (loopback default)
│ ├── logging_setup.py # Structured logging to stderr
│ ├── constants.py # Canton codes, Schulart suffixes, API bases, allow-list
│ └── models.py # Pydantic v2 response envelopes
├── tests/
│ ├── conftest.py # respx fixtures
│ ├── test_tools.py # Tool unit tests (mocked, no network)
│ ├── test_resilience.py # Degradation / retry / cache behaviour
│ └── test_live.py # Live smoke tests (marker: live)
├── docs/ # roadmap.md, security.md, network-egress.md
├── deploy/ # Network-layer egress manifests (Cilium / NetworkPolicy)
├── audits/ # mcp-audit run artifacts
├── Dockerfile # Non-root multi-stage container
├── .github/
│ ├── dependabot.yml # Weekly dependency / action update PRs
│ └── workflows/ # ci.yml, live-tests.yml, publish.yml
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md # Contributing guide (English)
├── CONTRIBUTING.de.md # Contributing guide (German)
├── SECURITY.md # Security policy (English)
├── SECURITY.de.md # Security policy (German)
├── EXAMPLES.md # Use cases by audience
├── server.json # MCP registry manifest
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German versionSobre el archivo único server.py (auditoría ARCH-011). Las 13 herramientas
viven deliberadamente en un solo módulo en lugar de un paquete tools/. Cada
herramienta es un envoltorio fino y uniforme (@mcp.tool → @_safe_tool → op_*)
sobre una operación op_* independiente del transporte, y cada operación comparte
el mismo pequeño conjunto de ayudantes (_to_period, _matches_school_type,
_require_known_canton, …) y el único HolidayClient. Dividirlos en varios
archivos dispersaría ese núcleo compartido y duplicaría las importaciones sin
beneficio de aislamiento — el archivo está uniformemente seccionado
(alias → ayudantes → lógica op_* → envoltorios de herramientas → recurso) y cada
op_* se prueba unitariamente directamente sin transporte. Una división en
tools/ es el paso planificado solo si la Fase 2 eleva materialmente el
número de herramientas.
Fase del ciclo de vida
Este servidor está en la Fase 1 (solo lectura) — todas las herramientas son de
solo lectura, sin autenticación, sin efectos secundarios. El presupuesto de 13
herramientas (del máximo recomendado de 15–20) aún deja margen. Los detalles
locales y municipales — incluidos el Sechseläuten y el Knabenschiessen de Zúrich —
se cubren directamente desde OpenHolidays mediante get_local_holidays
(una prueba en vivo mostró que se publican aguas arriba a nivel de Gemeinde), por
lo que no se requiere una fuente de datos urbana separada para ellos.
Primitivas MCP y versión del protocolo
Primitivas — Herramientas + Recursos. Las 13 herramientas son
GETs idempotentes y sin efectos secundarios. Un Recurso expone un feed de URI estable (holidays://<canton>/<year>) para que los clientes puedan leer el calendario de un cantón como contexto cacheable sin una llamada de herramienta. No hay flujos de trabajo plantillados recurrentes, por lo que Prompts no se utilizan (se revisará si eso cambia).Versión del protocolo MCP — dos eras.
mcp2.x sirve ambas en el mismo servidor, y la primera solicitud del cliente en una conexión decide cuál aplica: el apretón de manosinitializelimita a2025-11-25, el sobre por solicitud alcanza2026-07-28.source_statusmuestra una de ellas en su campomcp_protocol_version— una sola cadena no puede nombrar ambas — y muestra el techo del apretón de manos, porque eso es lo que un cliente que llega a este servidor a través deinitializerealmente negoció. Medido, no inferido de un nombre de constante: un cliente que pide2026-07-28en el apretón de manos recibe2025-11-25.MCP_PROTOCOL_VERSIONse deriva deLATEST_HANDSHAKE_VERSIONdel SDK en lugar de escribirse, por lo que no puede desviarse como lo hizo una vez — permaneció en2025-06-18durante dos revisiones mientras cada llamada lo reportaba como un hecho.tests/test_protocol_version.pymantiene ambas eras contra el SDK y comprueba el campo entregado también contra el SDK, no contra la constante de la que proviene. La versión de cable es negociada por el SDKmcpfijado (mcp>=2.0.0,<3).Política de actualización. Las actualizaciones de SDK y dependencias llegan a través de Dependabot (semanal); los cambios de versión de protocolo o de definición de herramientas se registran en
CHANGELOG.mdcon un aumento de versión.
Clasificación de datos
Todos los datos son Öffentlich / Datos abiertos públicos — calendarios de
vacaciones agregados, sin datos personales (DSG/DSGVO). Esta es la clasificación
más alta que maneja el servidor; el modelo completo está en
docs/security.md.
Limitaciones conocidas
Fuente no oficial. OpenHolidays agrega publicaciones cantonales. Para fechas legalmente vinculantes, la autoridad cantonal sigue siendo la autoritativa. Cada respuesta lo indica.
La cobertura municipal depende del proveedor. OpenHolidays sí incluye vacaciones públicas a nivel de distrito y municipio (p. ej., Sechseläuten, Knabenschiessen en
CH-ZH-ZH-ZH), expuestas a través deget_local_holidays. La exhaustividad a nivel de Gemeinde es tan buena como los datos del proveedor, que varían según el cantón. Las vacaciones escolares municipales no se modelan por separado.Los fines de semana largos de Nager ignoran las vacaciones cantonales. Se calculan solo a partir de vacaciones a nivel nacional.
Sin garantía de profundidad histórica. La cobertura de años anteriores a aproximadamente 2020 es desigual.
Pruebas
# Unit tests (no network required — respx-mocked)
PYTHONPATH=src pytest tests/ -m "not live"
# Live smoke tests (hits the real upstream APIs)
PYTHONPATH=src pytest tests/ -m "live"
# Linting
ruff check src/ tests/ scripts/
ruff format --check src/ tests/ scripts/Contribuciones
¡Las contribuciones son bienvenidas! Lea CONTRIBUTING.md (inglés) · CONTRIBUTING.de.md (alemán) para conocer las pautas sobre cómo informar errores, configurar el entorno de desarrollo, el estilo de código y los requisitos de prueba.
Este proyecto sigue las convenciones del Swiss Public Data MCP Portfolio.
Seguridad
Para informar una vulnerabilidad, siga el proceso de divulgación responsable en SECURITY.md (inglés) · SECURITY.de.md (alemán). El servidor es de solo lectura y no requiere clave API; consulte la sección Safety & Limits anterior para conocer el modelo de seguridad.
Registro de cambios
Consulte CHANGELOG.md
Implementación para la administración pública suiza
Si aloja este servidor para una autoridad escolar suiza o un caso de uso municipal:
Residencia de datos: los patrones de consulta en sí (qué cantones compara un funcionario) pueden revelar planificación en curso y es mejor mantenerlos en infraestructura suiza o de confianza.
Llamadas ascendentes van a OpenHolidays (proyecto OGD alojado en la UE) y Nager.Date. No salen datos personales de su entorno; solo se solicitan calendarios de vacaciones.
Registro: los registros se escriben en stderr; configure su política de retención de TI en consecuencia.
El transporte HTTP debe ejecutarse detrás de un proxy inverso con autenticación y límites de velocidad por IP — el servidor no tiene autenticación integrada.
Licencia
Licencia MIT — consulte LICENSE
Los datos de origen están sujetos a los términos de OpenHolidays (CC BY 4.0) y Nager.Date (MIT); se requiere atribución a estas fuentes al usar sus datos.
Autor
Hayal Oezkan · github.com/malkreide
Créditos y proyectos relacionados
Datos: OpenHolidays API (CC BY 4.0) · Nager.Date (MIT)
Protocolo: Model Context Protocol — Anthropic / Linux Foundation
Construido siguiendo la metodología
mcp-data-source-probe: sonda en vivo antes del diseño, volcado de respaldo antes de la dependencia de API, reintento antes del derrotismo.Portafolio: Swiss Public Data MCP Portfolio
Servidor | Descripción |
Datos educativos del cantón de Zúrich | |
Datos abiertos de la ciudad de Zúrich | |
BFS STAT-TAB — estadísticas federales suizas | |
Geodatos federales suizos (swisstopo) |
Licencia MIT. Dinero público, código público.
Available Tools
13 toolscheck_dateARead-onlyIdempotent
Check whether a given date falls into school holidays or a public holiday.
The everyday scheduling question: can we hold the parents' evening on that Thursday? Checks one date against both school and public holidays.
The everyday question behind this tool: "Can we schedule the parents' evening on that Thursday?"
| Name | Required | Description | Default |
|---|---|---|---|
| canton | Yes | ISO code, e.g. CH-ZH | |
| language | No | DE | |
| school_type | No | ||
| check_date_iso | Yes | Date as YYYY-MM-DD |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| canton | Yes | |
| source | Yes | Attribution string of the upstream source. |
| matches | Yes | |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| checked_date | Yes | |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
| is_public_holiday | Yes | |
| is_school_holiday | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive. Description adds context that it checks both school and public holidays, which is beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short but includes redundant use-case block repeating the same idea. Could be more concise without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers core purpose. Output schema exists, so return values not needed. Distinguishes from siblings partly, but lacks edge-case context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 50% schema coverage, description adds no information about parameters. Relies entirely on schema, which has descriptions for only two of four parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks a date for school and public holidays. It distinguishes from siblings like is_holiday_today and get_school_holidays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage for single date checking against both holiday types, but no explicit when-to-use or when-not-to-use compared to alternatives like get_school_holidays.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_school_holidaysARead-onlyIdempotent
Compare school holiday overlap between cantons for a calendar year.
Quantify inter-cantonal school-holiday overlap (pairwise day counts) for coordinating events or campaigns across cantonal borders.
Returns a pairwise matrix of overlapping holiday days. Defaults to VS
(Volksschule) because that is the level most inter-cantonal coordination
concerns.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| cantons | Yes | ||
| language | No | DE | |
| school_type | No | VS |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| rows | Yes | |
| year | Yes | |
| source | Yes | Attribution string of the upstream source. |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
| school_type_filter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and openWorldHint. The description adds the output format and default behavior but does not significantly extend behavioral insight beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a structured use case block. Every sentence adds value, no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Input schema is covered with defaults and use case. Output schema exists (not shown). The description is adequate for the tool's complexity, though it could elaborate on overlap calculation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the default for school_type and the purpose, but does not detail the language or cantons format, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares school holiday overlap between cantons, returning a pairwise matrix. It is distinct from siblings like get_school_holidays or find_common_free_window.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case explicitly states when to use the tool (coordinating events across cantonal borders) and explains the default school type (VS) as most relevant. It lacks explicit alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_holidays_icsARead-onlyIdempotent
Export a canton's holidays for a year as an iCalendar (.ics) document.
Produce a ready-to-import .ics calendar of a canton's holidays for a year, filtered by public/school and Schulart.
Returns a ready-to-save text/calendar document with one all-day event per
holiday. include selects all (default), public or school; combine
with school_type (VS/MS/BS/EO) to narrow school holidays.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| canton | Yes | ISO code, e.g. CH-ZH | |
| include | No | all | |
| language | No | DE | |
| school_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ics | Yes | The full iCalendar (text/calendar) document. |
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| year | Yes | |
| canton | Yes | |
| source | Yes | Attribution string of the upstream source. |
| filename | Yes | Suggested file name, e.g. holidays-CH-ZH-2026.ics. |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| event_count | Yes | Number of VEVENTs in the calendar. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds that the output is a text/calendar document with all-day events, and explains how parameters filter holidays. This complements the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: one sentence for the main purpose, a use_case block, and a sentence detailing return and parameters. Every sentence adds value, and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations are rich, the description covers the essential behavioral and parameter details. It explains the output type and filtering options. Minor omission: it doesn't mention the output is a downloadable file, but this is inferred from 'ready-to-import .ics document.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers only 20% of parameters with descriptions. The description adds meaning for 'include' (all, public, school) and 'school_type' (VS/MS/BS/EO) beyond patterns. However, 'language' and the constraints on 'year' and 'canton' are not elaborated. Overall, it provides useful context but leaves some gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool exports a canton's holidays for a year as an iCalendar document. The use_case block reinforces the purpose, and the sibling tools (e.g., check_date, get_school_holidays) are distinct in that they do not produce ICS files, making this tool's purpose unique and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to produce a ready-to-import .ics calendar, implying use when an ICS file is needed. However, it does not explicitly state when not to use it or mention alternatives (e.g., get_school_holidays for JSON). The guidance is clear but lacks exclusionary context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_common_free_windowARead-onlyIdempotent
Find date ranges in which all listed cantons are simultaneously on holiday.
Find a common free window across several cantons — joint events, maintenance or campaigns when every listed canton is on holiday.
Useful for planning campaigns, joint events or maintenance windows across cantonal borders.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| cantons | Yes | ||
| language | No | DE | |
| min_days | No | ||
| school_type | No | VS |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| source | Yes | Attribution string of the upstream source. |
| windows | Yes | |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive hints. Description adds context about finding common free windows but does not discuss rate limits, authorization, or other behavioral traits beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: two short sentences plus a use case block. Front-loaded with the core purpose. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters and an output schema, the description covers the main use case but lacks details about return format, parameter defaults, and edge cases. Adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%; the description does not explain individual parameters (year, cantons, language, min_days, school_type). It only briefly mentions 'listed cantons' and 'year', leaving other parameters without semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds date ranges when all listed cantons are simultaneously on holiday, with a concrete use case. It distinguishes from sibling tools like check_date or is_holiday_today.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes when to use it (planning campaigns, joint events, maintenance). Does not explicitly state when not to use, but context from siblings implies alternatives. Slightly lacking explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_local_holidaysARead-onlyIdempotent
Public holidays for a single municipality or district, incl. local specifics.
Answer the locality question the canton-level tools flatten away: which holidays are observed only in this town (e.g. Zurich's Sechselaeuten)? scope is 'local' (specific here), 'regional' (canton/district) or 'national' (inherited). Accepts a name or a full subdivision code.
Answers the local question the canton-level tools flatten away: which holidays are observed only here? The city of Zurich, for example, keeps Sechseläuten and Knabenschiessen (both half-day), which the rest of the canton does not.
municipality accepts a name (e.g. "Zürich", "Morschach") or a full
subdivision code (e.g. "CH-ZH-ZH-ZH"). The result lists every holiday that
applies in that locality; each carries a scope of local (specific to this
place), regional (inherited from the canton/district) or national.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| canton | Yes | ISO code, e.g. CH-ZH | |
| language | No | DE | |
| municipality | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| count | Yes | |
| source | Yes | Attribution string of the upstream source. |
| holidays | Yes | |
| match_type | No | How the lookup key resolved (audit ARCH-003): 'exact' (code or full name / validated canton), 'fuzzy' (a single prefix match was assumed) or 'none' (nothing matched — see `note` for suggestions). |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds behavioral context: it describes the scope attribute on returned holidays, that municipality accepts name or full subdivision code, and that results list every holiday applying in the locality. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with use_case and important_notes sections, but it is somewhat lengthy. Every sentence adds value, but it could be slightly more concise without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (many sibling tools) and the presence of comprehensive annotations and an output schema, the description is complete. It explains the key differentiator (local scope) and adequately covers behavior beyond structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (25%), but the description adds meaning for the municipality parameter (accepts name or code) and clarifies the result structure with scope. However, it does not explain the canton, year, or language parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns public holidays for a specific municipality or district, including local specifics, and explicitly distinguishes from canton-level tools that flatten away local holidays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a use case for when to use this tool (to answer locality questions flatted by canton tools) and explains the scope concept (local/regional/national). It does not explicitly list when not to use it or mention sibling alternatives, but the differentiation is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_long_weekendsARead-onlyIdempotent
Return Swiss long weekends and the bridge days needed to create them.
Plan bridge days: which long weekends exist this year and which working days must be taken off to extend them. Computed from federal public holidays (Nager.Date); cantonal-only holidays are not considered.
Sourced from Nager.Date, which computes these from federal public holidays; cantonal-only holidays are not considered.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| year | Yes | |
| source | Yes | Attribution string of the upstream source. |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
| long_weekends | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds behavioral context: it is computed from federal public holidays from Nager.Date, and cantonal holidays are ignored. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly structured with a main sentence and XML tags, but it contains redundancy (the note about federal holidays appears twice). It could be more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter), annotations, and existence of an output schema, the description adequately covers purpose, usage, and behavioral limitations. It is mostly complete, though it does not describe the output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description implies the 'year' parameter through the use case ('which long weekends exist this year'). However, the description does not explicitly document the parameter or its constraints, so it provides minimal additional meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return Swiss long weekends and the bridge days needed to create them', using a specific verb and resource. The use case further clarifies the tool's purpose, distinguishing it from siblings like get_public_holidays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a use case for planning bridge days and notes the limitation of only considering federal holidays. It implies when to use this tool, but does not explicitly mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_public_holidaysARead-onlyIdempotent
Return public holidays for one canton and calendar year.
Get a canton's official public holidays for a whole year — cantonal holidays (Berchtoldstag, Fronleichnam) differ, so always pass the canton.
Cantonal holidays such as Berchtoldstag differ substantially across Switzerland, so always pass the canton rather than assuming the federal set.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| canton | Yes | ISO code, e.g. CH-ZH | |
| language | No | DE |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| count | Yes | |
| source | Yes | Attribution string of the upstream source. |
| holidays | Yes | |
| match_type | No | How the lookup key resolved (audit ARCH-003): 'exact' (code or full name / validated canton), 'fuzzy' (a single prefix match was assumed) or 'none' (nothing matched — see `note` for suggestions). |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and idempotency. The description adds that it returns data for a whole year, but no further behavioral details (e.g., performance, errors) are provided, so the added value is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the purpose, but it contains redundancy (e.g., 'always pass the canton' is stated twice). It could be more concise and structured better.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with an output schema, the description covers the main use case but misses the optional language parameter entirely. Given the sibling tools, it does not differentiate explicitly, leaving some context gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low at 33% (only canton has a description). The tool description repeats the need to pass the canton and year but does not explain the format or the optional language parameter, failing to compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns public holidays for a canton and year, using the verb 'Return' and specifying the resource and scope. It distinguishes itself from siblings like get_school_holidays and is_holiday_today by emphasizing the need to pass a canton for cantonal holidays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to 'always pass the canton because cantonal holidays differ substantially,' providing clear context on when to use this tool. However, it does not mention when not to use it or list alternative tools for related queries, slightly reducing the score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_school_holidaysARead-onlyIdempotent
Return school holiday periods for one canton in a date range.
Look up a canton's school holidays for planning within an explicit from/to window (term breaks, parent events, campaigns). Apparent duplicates are the same period per Schulart; set school_type to collapse them. Cantons that do not differentiate return one table.
Args:
canton: ISO subdivision code, e.g. CH-ZH.
valid_from: Inclusive start date, YYYY-MM-DD.
valid_to: Inclusive end date, YYYY-MM-DD.
school_type: Optional Schulart suffix -- VS, MS, BS or EO.
Use VS for compulsory schooling (Volksschule).
language: DE, FR, IT or EN.
Records that look duplicated are usually the same period published for a
different Schulart. Set school_type to collapse them.
| Name | Required | Description | Default |
|---|---|---|---|
| canton | Yes | ISO code, e.g. CH-ZH | |
| language | No | DE | |
| valid_to | Yes | Date as YYYY-MM-DD | |
| valid_from | Yes | Date as YYYY-MM-DD | |
| school_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| count | Yes | |
| source | Yes | Attribution string of the upstream source. |
| holidays | Yes | |
| match_type | No | How the lookup key resolved (audit ARCH-003): 'exact' (code or full name / validated canton), 'fuzzy' (a single prefix match was assumed) or 'none' (nothing matched — see `note` for suggestions). |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), the description discloses duplicate handling and how to collapse them via 'school_type', and explains behavior for cantons that don't differentiate. This adds significant context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with tags but slightly verbose. It could be tightened without losing clarity, but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description adequately covers use case, parameters, and behavioral quirks. It is complete for a tool of moderate complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The 'Args' section provides clear explanations for all 5 parameters, including format examples and guidance on 'school_type' values. This surpasses the schema descriptions, which had 60% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'return', resource 'school holiday periods', and constraints (one canton, date range). It distinguishes from siblings like 'get_public_holidays' by focusing on school holidays and canton-specific scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'use_case' tag explicitly describes when to use the tool (planning within an explicit from/to window). It does not provide direct exclusions but the sibling list implies alternatives for other holiday types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
is_holiday_todayARead-onlyIdempotent
Is today a school or public holiday in the given canton?
One-call convenience for the everyday 'are we off today?' question in a given canton.
Convenience wrapper over check_date for the everyday question
"are we off today?".
| Name | Required | Description | Default |
|---|---|---|---|
| canton | Yes | ISO code, e.g. CH-ZH | |
| language | No | DE | |
| school_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| canton | Yes | |
| source | Yes | Attribution string of the upstream source. |
| matches | Yes | |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| checked_date | Yes | |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
| is_public_holiday | Yes | |
| is_school_holiday | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering the safe nature. The description adds that it's a convenience wrapper for `check_date`, but does not provide significant additional behavioral context beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences and a tag. Every word earns its place, and the main purpose is front-loaded immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of annotations and an output schema, the description adequately covers the main use case. It does not explain return values (not needed due to output schema) and is sufficiently complete for a convenience wrapper.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (canton described). The description mentions 'given canton' but does not elaborate on `language` or `school_type` parameters. It fails to compensate for the low coverage, leaving agents unclear on optional parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks if today is a school or public holiday in a given canton, using a specific verb and resource. It distinguishes itself from sibling tool `check_date` as a convenience wrapper for the everyday question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'one-call convenience for the everyday...are we off today?' and 'convenience wrapper over check_date', providing clear context for when to use this tool over alternatives. However, it does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cantonsARead-onlyIdempotent
List the 26 Swiss cantons with their ISO subdivision codes.
Resolve a canton name to the CH-XX code every other tool needs; call this first when the user gives a canton by name.
Use this first to resolve a canton name to the CH-XX code that every other
tool expects.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | DE |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| source | Yes | Attribution string of the upstream source. |
| cantons | Yes | |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, indicating a safe read operation. The description adds that it returns 26 cantons with codes and the CH-XX format, which is helpful but not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the core action in the first sentence and additional guidance in a separate use case section. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a single optional parameter and an output schema, the description is mostly adequate but fails to document the language parameter's effect. The use case guidance is helpful, but the parameter gap reduces completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not mention the 'language' parameter, its default, or how it affects the output. The description only says 'list the 26 Swiss cantons', without clarifying that names vary by language.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists the 26 Swiss cantons with ISO codes. It uses a specific verb 'list' and resource 'Swiss cantons', and the use case differentiates from sibling tools which focus on holidays and dates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to 'call this first' when resolving a canton name to the CH-XX code needed by other tools. Provides clear when-to-use and a concrete use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_school_typesARead-onlyIdempotent
List the Schularten (school types) that publish separate holiday tables.
Discover whether a canton differentiates school holidays by Schulart before querying, so VS/MS/BS/EO filters are used only where they exist.
Only a minority of cantons differentiate. For Zurich the codes are
CH-ZH-VS (Volksschulen), CH-ZH-MS (Mittelschulen) and CH-ZH-BS
(Berufsfachschulen). Cantons absent from this list publish one table for
all school types.
| Name | Required | Description | Default |
|---|---|---|---|
| canton | No | ||
| language | No | DE |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| source | Yes | Attribution string of the upstream source. |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
| school_types | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=False. The description adds behavioral context: it lists only school types that publish separate holiday tables, and absence means unified table. It also gives example codes for Zurich, enhancing transparency beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences plus a use_case tag. It is front-loaded with the main action. The use_case tag is helpful but somewhat redundant. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple listing nature and presence of output schema, the description covers all necessary context: what the tool does, when to use, behavior regarding missing cantons, and example codes. Annotations cover safety. Complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and parameters have minimal descriptions ('ISO code', 'Language'). The description does not explain the canton parameter format or language parameter function beyond examples. It mentions canton codes in Zurich example but not the ISO pattern. Description does not compensate for lack of schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List the Schularten (school types) that publish separate holiday tables.' It uses specific verb+resource, and distinguishes from sibling tools like list_cantons and get_school_holidays by focusing on differentiation of holiday tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use case: 'Discover whether a canton differentiates school holidays by Schulart before querying.' It also notes that only a minority of cantons differentiate, guiding when to use. However, it does not explicitly state when not to use or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_school_holidaysARead-onlyIdempotent
Return the next upcoming school holiday periods for a canton.
Forward-looking planning: the next N school-holiday periods for a canton from today, without computing a date range by hand.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| canton | Yes | ISO code, e.g. CH-ZH | |
| language | No | DE | |
| school_type | No | VS |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| count | Yes | |
| source | Yes | Attribution string of the upstream source. |
| holidays | Yes | |
| match_type | No | How the lookup key resolved (audit ARCH-003): 'exact' (code or full name / validated canton), 'fuzzy' (a single prefix match was assumed) or 'none' (nothing matched — see `note` for suggestions). |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds context about computing from today, which is useful but not extensive. No additional behavioral details like rate limits or caching are provided, but the annotations cover the core safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, with a clear main sentence and a helpful use case block. No redundant text, though the use case could be integrated more concisely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides the core purpose and context (forward-looking, from today). However, with low parameter documentation and no mention of output format (despite an output schema existing), it is not fully complete for a tool with 4 parameters and sibling alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only 'canton' has a description). The tool description does not mention any parameter details, leaving the other three parameters (count, language, school_type) with no semantic guidance beyond the schema's minimal info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'next upcoming school holiday periods for a canton', with a specific use case for forward-looking planning. This distinguishes it from sibling tools like 'get_school_holidays' which likely handle date ranges.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case explains when to use this tool (forward-looking planning without manual date range computation). However, it does not explicitly state when not to use it or provide direct alternatives, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_statusARead-onlyIdempotent
Report reachability and latency of both upstream sources.
Health check before a batch of queries, or to distinguish 'no data' from 'source down' — always returns an evaluable status.
Always returns an evaluable status rather than an empty result set, so that "no data" can be distinguished from "source down".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Human-readable caveat, set when provenance is 'degraded'. |
| source | Yes | Attribution string of the upstream source. |
| sources | Yes | |
| provenance | Yes | live_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload. |
| all_healthy | Yes | |
| retrieved_at | Yes | ISO-8601 UTC timestamp of the underlying fetch. |
| mcp_protocol_version | Yes | MCP wire protocol version this server is built and tested against. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior. The description adds that it always returns an evaluable status, which is a behavioral guarantee not covered by annotations. However, it does not detail how reachability or latency is measured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with two sentences and a structured use_case tag. Every sentence adds value and is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and an output schema, the description fully covers what the tool does, when to use it, and its behavioral guarantee. No gaps are evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so schema coverage is 100%. Baseline 4 is appropriate; the description does not need to add param information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports reachability and latency of upstream sources, with a specific use case for health checks and distinguishing 'no data' from 'source down'. This is distinct from the sibling holiday/date tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions when to use the tool: as a health check before queries or to differentiate source status. It does not specify when not to use it, but the use case is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
All 13 tools have clearly distinct purposes. Each targets a specific aspect of Swiss school calendar queries, from date checks to holiday comparisons and exports. There is no ambiguity or overlap.
Most tool names follow a verb_noun pattern (e.g., check_date, list_cantons, get_school_holidays). Two tools (is_holiday_today, source_status) deviate slightly, but the pattern is still predictable and readable.
13 tools is well-scoped for the Swiss school calendar domain. Each tool serves a specific need such as querying holidays, comparing cantons, or exporting calendars, without unnecessary duplication.
The tool surface covers the full lifecycle of holiday lookups: enumeration (list_cantons, list_school_types), individual checks (check_date, is_holiday_today), bulk retrieval (get_school_holidays, get_public_holidays, get_local_holidays), comparison (compare_school_holidays, find_common_free_window, next_school_holidays, get_long_weekends), export (export_holidays_ics), and health checks (source_status). No obvious gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for public_holidays_mcp
Holidays MCP — wraps Nager.Date API (free, no auth)
opendata.swiss MCP — Switzerland's federal open-data portal (CKAN catalogue).
Nager.Date Public Holidays MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceSwiss open data MCP server — transport, weather, geodata, companies, etc,. Zero API keys.7622722MIT
- AlicenseNot gradedqualityFmaintenanceMCP server for accessing Nager.Date public holidays data. It provides tools to query and retrieve holiday information for various countries through natural language or direct tool calls.13MIT
- AlicenseAqualityAmaintenanceMCP server for searching Swiss court decisions from federal and cantonal courts via entscheidsuche.ch. Enables full-text search, law reference lookup, and filtering by canton, court level, and date without API keys.81MIT
- AlicenseAqualityDmaintenanceAn unofficial MCP server for accessing Swiss Federal Statistical Office (BFS) data.81MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/swiss-holidays-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server