swiss-school-calendar-mcp
🇨🇭 属于 Swiss Public Data MCP Portfolio 的一部分
这是一个私人项目。它与任何雇主或机构隶属关系无关,也不代表任何官方机构的立场。
📅 swiss-holidays-mcp
面向 AI 代理的瑞士假期日历 —— 覆盖全部 26 个州的公共假日、学校假期和长周末,支持跨州比较。学校假期按 Schulart(学校类型)区分,这一点比表面看起来更重要。无需 API 密钥。
概述
swiss-holidays-mcp 是面向 Claude 等 AI 助手的瑞士假期日历 —— 覆盖全部 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日历形式提供🔖 假日订阅资源 ——
holidays://<canton>/<year>MCP 资源,提供 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 年春季义务教育学校的假期" |
|
"2026 年 4 月 3 日在提契诺州是公共假日吗?" |
|
"苏黎世和楚格的学校假期今年有重叠吗?" |
|
"ZH、ZG、AG 什么时候可以共同安排一周的学校假期?" |
|
"巴塞尔城市州学校接下来的假期是什么?" |
|
"2026 年有哪些长周末,它们需要哪些桥假日?" |
|
"苏黎世市有哪些州内其他地方没有的地方假日?" |
|
"将苏黎世 2026 年的假日导出为我可以导入的 .ics 日历" |
|
"今天在阿尔高州是假日吗?" |
|
🛡️ 安全与限制
方面 | 详情 |
访问权限 | 只读( |
个人数据 | 无个人数据 —— 所有来源均为聚合的公共假日日历 |
缓存 | 12 小时内存 TTL(假日表每年仅变动几次) |
重试 | 指数退避 2 秒 / 4 秒 / 8 秒;除 429 外的 4xx 不重试 |
超时 | 每次 API 调用 20 秒(健康探测 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)。上游故障返回带解释性
note的degraded封装,绝不静默返回空列表。source_status始终返回可评估的健康报告。
实时探测发现(2026-07-19)
端点 | HTTP | 状态 | 记录数 | 备注 |
| 200 | ✅ 正常 | 36 | |
| 200 | ✅ 正常 | 26 | 与官方州数量一致 |
| 200 | ✅ 正常 | 11 | 学校类型分组,仅 6 个州 |
| 200 | ✅ 正常 | 39 | 包含州级范围 |
| 200 | ✅ 正常 | 193 | 按学校类型拆分后为 183 条去重记录 |
| 200 | ✅ 正常 | – | |
| 200 | ⚠️ 静默返回空列表 | 0 | 无效国家 ≠ 报错 |
| 200 | ⚠️ 静默回退英文 | 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 均为公开可用)
安装
通过 uv 的 uvx 运行——无需克隆或手动安装:
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 而非 /mcp 暴露 SSE。
变量 | 默认值 | 描述 |
|
| 传输方式: |
|
| HTTP 传输的端口 |
|
| HTTP 传输的绑定地址。默认为回环地址; |
| (空) | 供浏览器客户端使用的逗号分隔的额外 CORS 来源(审计 SDK-004)。回环来源始终允许;请添加您的 UI 所服务的公共来源,例如 |
HTTP 传输附加了一个显式的 CORS 层,暴露
Mcp-Session-Id 头,使浏览器 MCP 客户端能够读取会话 ID 并
发起后续请求。允许列表绝不使用通配符。
在负载均衡器后运行多个 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/ 包。每个工具都是对传输无关的 op_*
操作的薄而统一的外层封装(@mcp.tool → @_safe_tool → op_*),
且每个操作共享同一小组辅助函数
(_to_period、_matches_school_type、_require_known_canton 等)以及同一个
HolidayClient。将这些拆分到多个文件会分散共享核心并
重复导入,却无隔离收益——该文件统一分区
(别名 → 辅助函数 → op_* 逻辑 → 工具封装 → 资源),且每个 op_*
都无需传输层即可直接进行单元测试。仅当 Phase 2 将工具数量
大幅推高时,tools/ 拆分才是计划中的步骤**。
生命周期阶段
本服务器处于 Phase 1(只读)——所有工具均为只读,无认证,无副作用。
13 个工具的上限(在推荐的 15–20 个最大值内)仍有
余量。地方和市镇级细节——包括苏黎世的 Sechseläuten 和
Knabenschiessen——通过 get_local_holidays 直接从 OpenHolidays 获取
(实时探测显示这些数据已在上游以 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派生自 SDK 的LATEST_HANDSHAKE_VERSION而非硬编码,因此不会像过去那样漂移——它曾 在两个修订版本中停留在2025-06-18,而每次调用都将其报告为事实。tests/test_protocol_version.py将两个 时代与 SDK 对照,并检查交付的字段也与 SDK 对照,而非 与它来源的常量对照。 线上版本由固定的mcpSDK(mcp>=2.0.0,<3)协商。更新策略。 SDK 和依赖升级通过 Dependabot(每周)落地; 协议版本或工具定义的变更记录在
CHANGELOG.md中并附带版本号提升。
数据分类
所有数据均为 Öffentlich / 公共开放数据——聚合的假期日历,
不包含个人数据(DSG/DSGVO)。这是服务器处理的最高分类;
完整模型见 docs/security.md。
已知限制
非官方来源。 OpenHolidays 聚合了各州的公开出版物。对于具有法律约束力的日期,州当局仍为权威来源。每个响应都会说明这一点。
市镇级覆盖取决于上游。 OpenHolidays 确实包含区和市镇级的公共假期(例如
CH-ZH-ZH-ZH下的 Sechseläuten、Knabenschiessen),通过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 密钥;安全模型请参见上文 安全与限制 部分。
变更日志
参见 CHANGELOG.md
瑞士公共行政部署
如果您为瑞士学校当局或市镇用例自行托管此服务器:
数据驻留: 查询模式本身(公务员比较哪些州)可能揭示正在进行的规划,最好保留在瑞士或可信的基础设施上。
上游调用 发送至 OpenHolidays(欧盟托管的 OGD 项目)和 Nager.Date。您的环境中不会离开任何个人数据;仅请求假期日历。
日志: 日志写入 stderr;请相应配置您的 IT 保留策略。
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,先重试再放弃。
Server | Description |
苏黎世州教育数据 | |
苏黎世市开放数据 | |
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