swiss-school-calendar-mcp
🇨🇭 Часть Swiss Public Data MCP Portfolio
Это частный проект. Он не зависит от какого-либо работодателя или институциональной принадлежности и не представляет официальную позицию какого-либо органа.
📅 swiss-holidays-mcp
Швейцарский календарь праздников для ИИ-агентов — государственные праздники, школьные каникулы и длинные выходные для всех 26 кантонов, с межкантональным сравнением. Школьные каникулы различаются по Schulart (типу школы), что важнее, чем кажется на первый взгляд. API-ключ не требуется.
Обзор
swiss-holidays-mcp — это швейцарский календарь праздников для ИИ-ассистентов, таких как Claude — государственные праздники, школьные каникулы и длинные выходные для всех 26 кантонов, без необходимости в API-ключах. Государственные праздники являются кантональными (Берхтольдстаг, Фронляйхнам и т. д. различаются по кантонам, а не только по федеральному минимуму). Школьные каникулы устанавливаются на уровне кантона, иногда на уровне округа, и — в шести кантонах — отдельно по типу школы. Единого федерального календаря не существует; любому, кто планирует что-то через кантональные границы, в противном случае приходится открывать 26 PDF-страниц.
Сервер охватывает два тематических кластера: государственные праздники / длинные выходные и школьные каникулы (с дифференциацией по Schulart). Каждый кластер сопоставляется с группой специализированных инструментов, которые преобразуют необработанные данные агентств в чистые JSON-ответы с указанием происхождения данных. Все данные поступают из OpenHolidays API (CC BY 4.0) и Nager.Date (MIT).
Мнемоника: Дубликат в швейцарских школьных данных обычно является замаскированным типом школы. Базовый API публикует один и тот же период каникул несколько раз, когда кантон различает их по типу школы. Это выглядит как дублирование данных и провоцирует наивную дедупликацию — которая как раз уничтожила бы то различие, которое нужно школьному ведомству.
Эталонный демонстрационный запрос: «В какие недели 2026 года обязательные школы Цюриха, Цуга и Аргау одновременно на каникулах — и сколько перекрывающихся дней у каждой пары?»
→ Это задействует find_common_free_window, compare_school_holidays и list_school_types в одном разговоре и отвечает на вопрос, который повторяется в каждом цикле планирования межкантональной координации.
→ Дополнительные примеры использования по аудиториям →
Демо
Related MCP server: mcp-nager-holidays
Возможности
🏫 Школьные каникулы — периоды по кантонам и диапазонам дат, различаемые по Schulart (
VS/MS/BS/EO)🎌 Государственные праздники — кантональные наборы праздников, а не только федеральный минимум (Берхтольдстаг и компания)
🔍 Проверка даты — является ли данная дата школьным или государственным праздником в кантоне?
🔗 Межкантональное сравнение — попарная матрица перекрытий праздничных дней между кантонами
🪟 Общие свободные окна — диапазоны дат, когда все перечисленные кантоны одновременно на каникулах
🌉 Длинные выходные и мостовые дни — вычисляются на основе федеральных государственных праздников (Nager.Date)
🏘️ Местные и муниципальные праздники — особенности на уровне округов и муниципалитетов, такие как цюрихские Sechseläuten и Knabenschiessen, с маркером
scope, чтобы их никогда не путали с кантональными📆 Экспорт iCal / ICS — праздники кантона за год в виде готового к импорту календаря
.ics🔖 Ресурс ленты праздников — MCP-ресурс
holidays://<canton>/<year>с Markdown-сводкой📌 «Сегодня праздник?» — вызов одной функцией для повседневного вопроса
🩺 Здоровье источников — доступность и задержка обоих вышестоящих сервисов, всегда оцениваемые
🔑 Аутентификация не требуется — оба источника данных общедоступны
☁️ Двойной транспорт — stdio для Claude Desktop, Streamable HTTP/SSE для облачного развертывания
🧾 Происхождение данных в каждом ответе —
live_api|cached|degraded, никогда не молчаливый пустой список
Источники данных
Источник | Данные | Лицензия |
Кантоны, Schularten, школьные каникулы, государственные праздники | CC BY 4.0 | |
Длинные выходные и необходимые мостовые дни | MIT |
Оба источника общедоступны, аутентификация не требуется. Требуется указание авторства: OpenHolidays (CC BY 4.0) и Nager.Date должны быть указаны как источник при использовании их данных.
Инструменты
Инструмент | Назначение | Источник данных |
| 26 кантонов с кодами ISO и официальными языками | OpenHolidays |
| Группы Schulart по кантонам ( | OpenHolidays |
| Школьные каникулы для одного кантона и диапазона дат | OpenHolidays |
| Государственные праздники для одного кантона и года | OpenHolidays |
| Государственные праздники для одного муниципалитета или округа, включая местные особенности | OpenHolidays |
| Является ли данная дата школьным или государственным праздником? | OpenHolidays |
| Попарная матрица перекрытий по кантонам | OpenHolidays |
| Окна, когда все перечисленные кантоны на каникулах | OpenHolidays |
| Ближайшие предстоящие периоды каникул | OpenHolidays |
| Длинные выходные и необходимые мостовые дни | Nager.Date |
| Праздники кантона за год в виде документа iCalendar ( | OpenHolidays |
| Является ли сегодня школьным или государственным праздником в кантоне? | OpenHolidays |
| Доступность и задержка обоих вышестоящих сервисов | Встроенный |
Ресурсы
URI ресурса | Содержимое |
| Markdown-сводка всех государственных и школьных праздников, например |
Все инструменты имеют полный набор аннотаций — readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true (они обращаются к внешнему API). Ни один инструмент ничего не записывает. Входные данные проверяются по схеме (коды кантонов сверяются с 26 известными кантонами, даты в формате YYYY-MM-DD, year ограничен, language/school_type находятся в белом списке).
Примеры использования
Запрос | Инструмент |
«Какие есть кантоны и каковы их коды?» |
|
«Покажи каникулы обязательных школ Цюриха на весну 2026 года» |
|
«Является ли 3 апреля 2026 года государственным праздником в Тичино?» |
|
«Пересекаются ли школьные каникулы Цюриха и Цуга в этом году?» |
|
«Когда ZH, ZG, AG могут запланировать совместную неделю без школы?» |
|
«Какие ближайшие каникулы у школ Базель-Штадта?» |
|
«Какие длинные выходные есть в 2026 году и какие мостовые дни для них нужны?» |
|
«Какие местные праздники сохраняет город Цюрих, которых нет в остальной части кантона?» |
|
«Экспортируй праздники Цюриха за 2026 год в виде календаря .ics, который я могу импортировать» |
|
«Сегодня праздник в Аргау?» |
|
🛡️ Безопасность и ограничения
Аспект | Детали |
Доступ | Только чтение ( |
Личные данные | Никаких личных данных — все источники являются агрегированными общедоступными календарями праздников |
Кэширование | 12-часовой TTL в памяти (таблицы праздников меняются несколько раз в год) |
Повторные попытки | Экспоненциальная задержка 2с / 4с / 8с; 4xx, кроме 429, не повторяются |
Тайм-аут | 20 секунд на вызов API (8 секунд для проверок работоспособности) |
Аутентификация | API-ключи не требуются — оба вышестоящих сервиса общедоступны |
Деградация | Сбой вышестоящего сервиса приводит к обёртке |
Условия использования | Подчиняется условиям соответствующих источников данных: OpenHolidays, Nager.Date |
Архитектура
Этот сервер использует Архитектуру A (только живой API, с кэшем в памяти).
┌──────────────────────────┐
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 daysОбоснование (проверено вживую 2026-07-19):
Все десять документированных конечных точек OpenHolidays ответили HTTP 200 с правдоподобными полезными нагрузками;
/Subdivisions?countryIsoCode=CHвозвращает ровно 26 кантонов, что соответствует официальному количеству.Ни один публичный массовый дамп не удалось проверить во время сборки (прямой доступ к
openpotato/openholidays.dataвернул 404), поэтому Архитектура B была недоступна.Таблицы праздников меняются несколько раз в год, поэтому 12-часовой TTL в памяти снимает почти всю нагрузку с вышестоящего сервиса, не рискуя устареванием данных.
Последствия:
Каждый ответ содержит
provenance(live_api|cached|degraded).Сбой вышестоящего сервиса приводит к обёртке
degradedс пояснительнымnote, а не к молчаливому пустому списку.source_statusвсегда возвращает оцениваемый отчёт о работоспособности.
Результаты живого зондирования (2026-07-19)
Endpoint | HTTP | Статус | Записей | Примечание |
| 200 | ✅ работает | 36 | |
| 200 | ✅ работает | 26 | совпадает с официальным числом кантонов |
| 200 | ✅ работает | 11 | группы Schulart, только 6 кантонов |
| 200 | ✅ работает | 39 | кантональный охват включён |
| 200 | ✅ работает | 193 | 183 уникальных после разбивки по типам школ |
| 200 | ✅ работает | – | |
| 200 | ⚠️ молча пустой | 0 | неверная страна ≠ ошибка |
| 200 | ⚠️ молчаливый откат на EN | 26 | неверный язык ≠ ошибка |
| 400 | ✅ корректная ошибка | – | RFC 9110 problem+json |
Nager | 200 | ✅ работает | 33 | 29 строк содержат |
Nager | 200 | ✅ работает | 3 | |
Nager | 404 | ✅ корректная ошибка | – | строже, чем OpenHolidays |
Известные наблюдения
Кажущиеся дубликаты — это типы школ. Цюрих возвращает Frühlingsferien 2026 дважды: один раз для
CH-ZH-VS(Volksschulen, помеченоRecommended) и один раз дляCH-ZH-BS+CH-ZH-MS(Berufsfach- и Mittelschulen). Используйте параметрschool_type(VS/MS/BS/EO), а не дедупликацию.Только шесть кантонов различают по типу школы (AI, AR, BE, GR, SO, ZH). В остальных случаях
groupsотсутствует, и одна таблица покрывает всё. Поэтому фильтр трактует отсутствующее полеgroupsкак «применимо ко всем».Коды подразделений смешивают уровни. Записи могут содержать
CH-AI-APилиCH-BE-TH-BL. Всегда сопоставляйте по префиксуCH-XX, никогда — по строковому равенству.Пустой список — это не ответ. Неизвестный код страны или кантона возвращает HTTP 200 с
[]. Этот сервер устанавливает поясняющийnote, чтобы «нет праздников» и «неверный фильтр» оставались различимыми.
Предварительные требования
Python 3.10 или выше
uv / uvx (рекомендуется) или pip
Доступ в интернет (оба API публично доступны)
Установка
Запуск через uvx из uv — клонирование или ручная установка не требуются:
uvx swiss-holidays-mcpРазработка
git clone https://github.com/malkreide/swiss-holidays-mcp
cd swiss-holidays-mcp
pip install -e ".[dev]"Конфигурация
Claude Desktop
Добавьте в 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"]
}
}
}Перезапустите Claude Desktop — сервер запустится автоматически при первом использовании.
Облачное развёртывание (SSE / Streamable HTTP для доступа из браузера)
Для использования через claude.ai в браузере (например, на управляемых рабочих станциях без локального ПО):
MCP_TRANSPORT=sse PORT=8000 python -m swiss_holidays_mcpSDK предоставляет SSE на /sse, а не на /mcp.
Переменная | По умолчанию | Описание |
|
| Транспорт: |
|
| Порт для HTTP-транспортов |
|
| Адрес привязки для HTTP-транспортов. По умолчанию loopback; |
| (пусто) | Дополнительные CORS-источники через запятую для браузерных клиентов (аудит SDK-004). Loopback-источники разрешены всегда; добавьте публичный источник, с которого обслуживается ваш UI, например |
HTTP-транспорты подключают явный CORS-слой, который раскрывает заголовок
Mcp-Session-Id, чтобы браузерный MCP-клиент мог прочитать идентификатор
сессии и выполнять последующие запросы. Список разрешённых никогда не является
подстановочным знаком.
Запуск более одного HTTP-экземпляра за балансировщиком нагрузки требует
липких сессий по ключу Mcp-Session-Id — см. docs/scaling.md
с примерами для nginx/Traefik/Kubernetes. Один экземпляр (обычный случай) не
требует настройки привязки.
💡 «stdio для ноутбука разработчика, SSE для браузера».
Структура проекта
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 versionОб однофайловом server.py (аудит ARCH-011). 13 инструментов намеренно
живут в одном модуле, а не в пакете tools/. Каждый инструмент — это тонкая
единообразная обёртка (@mcp.tool → @_safe_tool → op_*) над
транспортно-независимой операцией op_*, и каждая операция использует один и
тот же небольшой набор помощников (_to_period, _matches_school_type,
_require_known_canton, …) и один HolidayClient. Разбиение на несколько
файлов разбросало бы это общее ядро и продублировало бы импорты без выгоды для
изоляции — файл равномерно разделён на секции (алиасы → помощники → логика
op_* → обёртки инструментов → ресурс), и каждая op_* тестируется напрямую
без транспорта. Разбиение на tools/ — запланированный шаг только если
Фаза 2 существенно увеличит количество инструментов.
Жизненный цикл
Этот сервер находится в Фазе 1 (только чтение) — все инструменты
только для чтения, без аутентификации, без побочных эффектов. Бюджет из 13
инструментов (из рекомендуемого максимума 15–20) всё ещё оставляет запас.
Особенности местного и муниципального уровня — включая цюрихские Sechseläuten и
Knabenschiessen — покрываются напрямую из OpenHolidays через get_local_holidays
(живой пробный запрос показал, что они публикуются вышестоящим источником на
уровне Gemeinde), поэтому отдельный источник городских данных для них не
требуется.
MCP-примитивы и версия протокола
Примитивы — инструменты + ресурсы. 13 инструментов — идемпотентные
GET-запросы без побочных эффектов. Ресурс предоставляет стабильный URI-канал (holidays://<canton>/<year>), чтобы клиенты могли читать календарь кантона как кэшируемый контекст без вызова инструмента. Повторяющихся шаблонных рабочих процессов нет, поэтому промпты не используются (пересматривается, если это изменится).Версия MCP-протокола — две эпохи.
mcp2.x обслуживает обе на одном сервере, и первый запрос клиента на соединении определяет, какая применяется: рукопожатиеinitializeограничивается2025-11-25, конверт по-запросный достигает2026-07-28.source_statusпоказывает одну из них в своём полеmcp_protocol_version— одна строка не может назвать обе — и показывает потолок рукопожатия, потому что именно это клиент, обращающийся к серверу черезinitialize, фактически согласовал. Измерено, а не выведено из имени константы: клиент, запрашивающий при рукопожатии2026-07-28, получает в ответ2025-11-25.MCP_PROTOCOL_VERSIONвыводится изLATEST_HANDSHAKE_VERSIONSDK, а не записывается вручную, поэтому не может устареть так, как когда-то — он стоял на2025-06-18две ревизии, пока каждый вызов сообщал его как факт.tests/test_protocol_version.pyпроверяет обе эпохи против SDK и сверяет выдаваемое поле тоже с SDK, а не с константой, из которой оно получено. Версия на проводе согласуется закреплённым SDKmcp(mcp>=2.0.0,<3).Политика обновлений. Обновления SDK и зависимостей приходят через Dependabot (еженедельно); изменения версии протокола или определений инструментов фиксируются в
CHANGELOG.mdс повышением версии.
Классификация данных
Все данные — Öffentlich / Public Open Data — агрегированные календари
праздников, без персональных данных (DSG/DSGVO). Это наивысший класс, с которым
работает сервер; полная модель — в docs/security.md.
Известные ограничения
Неофициальный источник. OpenHolidays агрегирует кантональные публикации. Для юридически обязательных дат авторитетным остаётся кантональный орган. Каждый ответ сообщает об этом.
Муниципальное покрытие зависит от вышестоящего источника. OpenHolidays действительно содержит государственные праздники районного и муниципального уровня (например, Sechseläuten, Knabenschiessen на
CH-ZH-ZH-ZH), доступные черезget_local_holidays. Полнота на уровне Gemeinde ограничена качеством данных вышестоящего источника, которое варьируется по кантонам. Муниципальные школьные каникулы отдельно не моделируются.Длинные выходные Nager игнорируют кантональные праздники. Они вычисляются только по общенациональным праздникам.
Нет гарантии исторической глубины. Покрытие лет примерно до 2020 года неравномерно.
Тестирование
# 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/Вклад
Вклад приветствуется! Пожалуйста, прочитайте CONTRIBUTING.md (англ.) · CONTRIBUTING.de.md (нем.) с рекомендациями по сообщению об ошибках, настройке среды разработки, стилю кода и требованиям к тестам.
Этот проект следует соглашениям Swiss Public Data MCP Portfolio.
Безопасность
Чтобы сообщить об уязвимости, следуйте процессу ответственного раскрытия в SECURITY.md (англ.) · SECURITY.de.md (нем.). Сервер работает только на чтение и не требует API-ключа; см. раздел Safety & Limits выше с описанием модели безопасности.
Журнал изменений
См. CHANGELOG.md
Развёртывание для швейцарской государственной администрации
Если вы размещаете этот сервер самостоятельно для швейцарского школьного ведомства или муниципального использования:
Размещение данных: сами паттерны запросов (какие кантоны сравнивает госслужащий) могут раскрывать текущее планирование, и их лучше держать на швейцарской или доверенной инфраструктуре.
Вышестоящие вызовы идут к OpenHolidays (проект OGD, размещённый в ЕС) и Nager.Date. Никакие персональные данные не покидают вашу среду; запрашиваются только календари праздников.
Логирование: логи пишутся в stderr; настройте политику хранения в вашей ИТ-службе.
HTTP-транспорт должен работать за обратным прокси с аутентификацией и ограничением частоты запросов на IP — на сервере нет встроенной аутентификации.
Лицензия
Лицензия MIT — см. LICENSE
Исходные данные подчиняются условиям OpenHolidays (CC BY 4.0) и Nager.Date (MIT); при использовании этих данных требуется указание авторства.
Автор
Hayal Oezkan · github.com/malkreide
Благодарности и связанные проекты
Данные: OpenHolidays API (CC BY 4.0) · Nager.Date (MIT)
Протокол: Model Context Protocol — Anthropic / Linux Foundation
Создано по методологии
mcp-data-source-probe: живой пробный запрос перед проектированием, дамп-запасной вариант перед зависимостью от API, повторная попытка перед пораженчеством.Портфолио: Swiss Public Data MCP Portfolio
Сервер | Описание |
Образовательные данные кантона Цюрих | |
Открытые данные города Цюрих | |
BFS STAT-TAB — швейцарская федеральная статистика | |
Швейцарские федеральные геоданные (swisstopo) |
Лицензия MIT. Общественные деньги, общественный код.
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