Skip to main content
Glama
malkreide

swiss-school-calendar-mcp

by malkreide

🇨🇭 Part of the Swiss Public Data MCP Portfolio

This is a private project. It is independent of any employer or institutional affiliation and represents no official position of any authority.

🇨🇭 Swiss Public Data MCP Portfolio의 일부

이 프로젝트는 개인 프로젝트입니다. 어떤 고용주나 기관과도 무관하며, 어떤 기관의 공식 입장을 대변하지 않습니다.

📅 swiss-holidays-mcp

License: MIT Python 3.10+ MCP CI No Auth Required Data Source

AI 에이전트를 위한 스위스 휴일 달력 — 26개 전 주(州)의 공휴일, 학교 휴일, 연휴(롱 위켄드) 및 주 간 비교 기능. 학교 휴일은 Schulart(학교 유형)별로 구분되며, 이는 언뜻 보기보다 훨씬 중요합니다. API 키가 필요 없습니다.

🇩🇪 Deutsche Version


개요

swiss-holidays-mcp는 Claude와 같은 AI 어시스턴트를 위한 스위스 휴일 달력입니다 — 26개 전 주의 공휴일, 학교 휴일, 연휴를 제공하며 API 키가 필요 없습니다. 공휴일은 주(州) 단위로 다릅니다(Berchtoldstag, Fronleichnam 등은 연방 최소 기준뿐만 아니라 주마다 다릅니다). 학교 휴일은 주 단위로, 때로는 구(district) 단위로 설정되며, 6개 주에서는 학교 유형별로 별도로 설정됩니다. 단일한 연방 달력은 존재하지 않으므로, 주 경계를 넘어 계획을 세우는 사람은 그렇지 않으면 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를 모두 사용하며, 주 간 조정에서 매 계획 주기마다 반복되는 질문에 답합니다. → 대상별 추가 사용 사례

데모

Demo: Claude using find_common_free_window and compare_school_holidays


Related MCP server: mcp-nager-holidays

기능

  • 🏫 학교 휴일 — 주 및 날짜 범위별 기간, Schulart(VS / MS / BS / EO)로 구분

  • 🎌 공휴일 — 연방 최소 기준뿐만 아니라 주별 공휴일 세트(Berchtoldstag 등)

  • 🔍 날짜 확인 — 특정 날짜가 해당 주의 학교 휴일 또는 공휴일인가?

  • 🔗 주 간 비교 — 주 간 휴일 일수의 쌍별 중복 매트릭스

  • 🪟 공통 여유 기간 — 나열된 모든 주가 동시에 휴일인 날짜 범위

  • 🌉 연휴 및 브리지 데이 — 연방 공휴일(Nager.Date)에서 계산

  • 🏘️ 지역 및 지방자치단체 휴일 — 취리히의 Sechseläuten과 Knabenschiessen 같은 구·지자체 수준의 세부 사항, 주 전체로 오인되지 않도록 scope 표시 포함

  • 📆 iCal / ICS 내보내기 — 특정 연도의 주 휴일을 바로 가져올 수 있는 .ics 캘린더로

  • 🔖 휴일 피드 리소스 — Markdown 요약이 포함된 holidays://<canton>/<year> MCP 리소스

  • 📌 "오늘은 휴일인가?" — 일상적인 질문을 위한 원콜 편의 기능

  • 🩺 소스 상태 — 두 업스트림의 연결 가능성과 지연 시간, 항상 평가 가능

  • 🔑 인증 불필요 — 두 데이터 소스 모두 공개적으로 접근 가능

  • ☁️ 이중 전송 — Claude Desktop용 stdio, 클라우드 배포용 Streamable HTTP/SSE

  • 🧾 모든 응답에 출처 표시live_api | cached | degraded, 절대 조용한 빈 목록 없음


데이터 소스

소스

데이터

라이선스

OpenHolidays API

주, Schularten, 학교 휴일, 공휴일

CC BY 4.0

Nager.Date

연휴 및 필요한 브리지 데이

MIT

두 소스 모두 공개적으로 접근 가능하며 인증이 필요 없습니다. 출처 표시 의무: OpenHolidays(CC BY 4.0)와 Nager.Date의 데이터를 사용할 때는 출처로 명시해야 합니다.


도구

도구

용도

데이터 소스

list_cantons

ISO 코드와 공식 언어를 포함한 26개 주

OpenHolidays

list_school_types

주별 Schulart 그룹(CH-ZH-VS 등)

OpenHolidays

get_school_holidays

한 주와 날짜 범위에 대한 학교 휴일

OpenHolidays

get_public_holidays

한 주와 연도에 대한 공휴일

OpenHolidays

get_local_holidays

한 지자체 또는 구에 대한 공휴일, 지역 특수일 포함

OpenHolidays

check_date

특정 날짜가 학교 휴일 또는 공휴일인가?

OpenHolidays

compare_school_holidays

주 간 쌍별 중복 매트릭스

OpenHolidays

find_common_free_window

나열된 모든 주가 휴일인 기간

OpenHolidays

next_school_holidays

다음으로 다가오는 휴일 기간

OpenHolidays

get_long_weekends

연휴 및 필요한 브리지 데이

Nager.Date

export_holidays_ics

한 주의 연간 휴일을 iCalendar(.ics) 문서로 내보내기

OpenHolidays

is_holiday_today

오늘이 해당 주의 학교 휴일 또는 공휴일인가?

OpenHolidays

source_status

두 업스트림의 연결 가능성과 지연 시간

내장

리소스

리소스 URI

내용

holidays://{canton}/{year}

모든 공휴일 + 학교 휴일의 Markdown 요약, 예: holidays://CH-ZH/2026

모든 도구는 전체 주석 세트를 갖습니다 — readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true(외부 API에 접근). 어떤 도구도 어디에도 쓰지 않습니다. 입력은 스키마 검증됩니다(주 코드는 26개 알려진 주와 대조, 날짜는 YYYY-MM-DD, year는 범위 제한, language/school_type은 허용 목록).

예시 사용 사례

쿼리

도구

"어떤 주들이 있고, 그 코드는 무엇인가?"

list_cantons

"취리히의 의무교육 학교 2026년 봄 휴일을 보여줘"

get_school_holidays

"2026년 4월 3일이 티치노의 공휴일인가?"

check_date

"취리히와 추크의 학교 휴일이 올해 겹치나?"

compare_school_holidays

"ZH, ZG, AG 모두가 공동 휴일 주간을 계획할 수 있는 때는 언제인가?"

find_common_free_window

"바젤슈타트 학교의 다음 휴일은 언제인가?"

next_school_holidays

"2026년에는 어떤 연휴가 있고, 어떤 브리지 데이가 필요한가?"

get_long_weekends

"취리히 시가 주의 나머지 지역과 달리 지키는 지역 휴일은 무엇인가?"

get_local_holidays

"취리히의 2026년 휴일을 가져올 수 있는 .ics 캘린더로 내보내줘"

export_holidays_ics

"오늘은 아르가우에서 휴일인가?"

is_holiday_today


🛡️ 안전 및 제한

측면

세부 사항

접근

읽기 전용(readOnlyHint: true) — 서버는 어떤 데이터도 수정하거나 삭제할 수 없음

개인 데이터

개인 데이터 없음 — 모든 소스는 집계된 공개 휴일 달력

캐싱

12시간 인메모리 TTL(휴일 테이블은 연간 몇 번만 변경됨)

재시도

지수 백오프 2초 / 4초 / 8초; 429를 제외한 4xx는 재시도하지 않음

타임아웃

API 호출당 20초(상태 프로브는 8초)

인증

API 키 불필요 — 두 업스트림 모두 공개적으로 접근 가능

성능 저하

업스트림 실패 시 설명 note가 포함된 degraded 봉투를 반환하며, 절대 조용한 빈 목록을 반환하지 않음

서비스 약관

각 데이터 소스의 약관 적용: 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 라이브 검증):

  • 문서화된 10개의 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

상태

레코드

참고

/Countries

200

✅ 정상 동작

36

/Subdivisions?countryIsoCode=CH

200

✅ 정상 동작

26

공식 주(州) 수와 일치

/Groups?countryIsoCode=CH

200

✅ 정상 동작

11

Schulart 그룹, 6개 주만 해당

/PublicHolidays (CH, 2026)

200

✅ 정상 동작

39

주(州) 범위 포함

/SchoolHolidays (CH, 2026)

200

✅ 정상 동작

193

학교 유형 구분 후 183개 고유 값

/SchoolHolidaysByDate

200

✅ 정상 동작

/SchoolHolidays?countryIsoCode=XX

200

⚠️ 오류 없이 빈 결과

0

잘못된 국가 ≠ 오류

/Subdivisions?languageIsoCode=ZZ

200

⚠️ 오류 없이 EN 대체

26

잘못된 언어 ≠ 오류

/SchoolHolidays 날짜 범위 없음

400

✅ 올바른 오류

RFC 9110 problem+json

Nager /PublicHolidays/2026/CH

200

✅ 정상 동작

33

29개 행에 counties 포함

Nager /LongWeekend/2026/CH

200

✅ 정상 동작

3

Nager /PublicHolidays/2026/XX

404

✅ 올바른 오류

OpenHolidays보다 엄격함

알려진 발견 사항

  1. 겉보기에 중복된 항목은 학교 유형이다. 취리히는 Frühlingsferien 2026을 두 번 반환한다. 한 번은 CH-ZH-VS(Volksschulen, Recommended 태그)용, 다른 한 번은 CH-ZH-BS + CH-ZH-MS(Berufsfach- 및 Mittelschulen)용이다. 중복 제거 대신 school_type 매개변수(VS / MS / BS / EO)를 사용하라.

  2. 학교 유형을 구분하는 주는 6개뿐이다 (AI, AR, BE, GR, SO, ZH). 그 외 지역에서는 groups가 없고 하나의 테이블이 모든 것을 포괄한다. 따라서 필터는 groups 필드가 없으면 "모두에 적용"으로 처리한다.

  3. 하위 구분 코드는 수준이 혼합되어 있다. 레코드에 CH-AI-AP 또는 CH-BE-TH-BL이 포함될 수 있다. 항상 CH-XX 접두사로 매칭하고, 문자열 동등 비교는 절대 사용하지 마라.

  4. 빈 목록은 답변이 아니다. 알 수 없는 국가 또는 주 코드는 HTTP 200과 []를 반환한다. 이 서버는 "휴일 없음"과 "잘못된 필터"를 구분할 수 있도록 설명적인 note를 설정한다.


사전 요구 사항

  • Python 3.10 이상

  • uv / uvx (권장) 또는 pip

  • 인터넷 접속 (두 API 모두 공개적으로 사용 가능)


설치

uvuvx로 실행 — 클론이나 수동 설치가 필요 없음:

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_mcp

SDK는 /mcp가 아닌 /sse에서 SSE를 노출한다.

변수

기본값

설명

MCP_TRANSPORT

stdio

전송 방식: stdio, sse, streamable-http (일명 http)

PORT / MCP_PORT

8000

HTTP 전송용 포트

MCP_HOST

127.0.0.1

HTTP 전송용 바인드 주소. 기본값은 루프백이며, 0.0.0.0은 옵트인 방식으로 경고를 기록한다 — 인증 리버스 프록시 뒤에서 실행하라.

MCP_CORS_ORIGINS

(비어 있음)

브라우저 클라이언트용 추가 CORS 오리진(쉼표로 구분) (감사 SDK-004). 루프백 오리진은 항상 허용되며, UI가 제공되는 공개 오리진을 추가하라(예: https://ui.example.ch). 절대 *를 사용하지 마라.

HTTP 전송은 Mcp-Session-Id 헤더를 노출하는 명시적 CORS 계층을 추가하므로, 브라우저 MCP 클라이언트가 세션 ID를 읽고 후속 요청을 보낼 수 있다. 허용 목록은 절대 와일드카드가 아니다.

로드 밸런서 뒤에서 HTTP 인스턴스를 두 개 이상 실행하려면 Mcp-Session-Id를 키로 하는 고정 세션이 필요하다 — nginx/Traefik/Kubernetes 예시는 docs/scaling.md를 참조하라. 단일 인스턴스(일반적인 경우)는 선호도 구성이 필요 없다.

💡 "개발자 노트북에는 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_toolop_*)이며, 모든 연산은 동일한 소규모 헬퍼 집합(_to_period, _matches_school_type, _require_known_canton, …)과 하나의 HolidayClient를 공유한다. 이를 여러 파일로 분할하면 공유 코어가 흩어지고 격리 이점 없이 import가 중복될 뿐이다 — 파일은 균일하게 섹션으로 나뉘어 있으며(별칭 → 헬퍼 → op_* 로직 → 도구 래퍼 → 리소스) 모든 op_*는 전송 방식 없이 직접 단위 테스트된다. tools/ 분할은 오직 Phase 2에서 도구 수가 실질적으로 더 늘어날 경우에만 계획된 단계이다.


수명주기 단계

이 서버는 Phase 1(읽기 전용) 에 있다 — 모든 도구는 읽기 전용이며, 인증이 없고, 부작용이 없다. 13개 도구 예산(권장 최대 15–20개 중)은 여전히 여유가 있다. 취리히의 Sechseläuten과 Knabenschiessen을 포함한 지역 및 지자체 세부 사항은 get_local_holidays를 통해 OpenHolidays에서 직접 다룬다(실시간 프로브 결과 상류에 Gemeinde 수준으로 게시되어 있음). 따라서 별도의 도시 데이터 소스가 필요하지 않다.


MCP 프리미티브 및 프로토콜 버전

  • 프리미티브 — 도구 + 리소스. 13개 도구는 멱등적이고 부작용이 없는 GET이다. 리소스는 안정적인 URI 피드(holidays://<canton>/<year>)를 노출하여 클라이언트가 도구 호출 없이 주(州)의 달력을 캐시 가능한 컨텍스트로 읽을 수 있게 한다. 반복적인 템플릿 워크플로가 없으므로 프롬프트는 사용되지 않는다(변경 시 재검토).

  • MCP 프로토콜 버전 — 두 시대. mcp 2.x는 동일한 서버에서 둘 다 제공하며, 연결 시 클라이언트의 첫 요청이 어느 것이 적용될지 결정한다: initialize 핸드셰이크는 2025-11-25 에서 상한이 정해지고, 요청별 봉투는 2026-07-28 에 도달한다.

    source_statusmcp_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와 대조하여 확인한다 — 그것이 비롯된 상수가 아니라. 와이어 버전은 고정된 mcp SDK(mcp>=2.0.0,<3)에 의해 협상된다.

  • 업데이트 정책. SDK 및 의존성 업데이트는 Dependabot(주간)을 통해 반영된다. 프로토콜 버전 또는 도구 정의 변경은 CHANGELOG.md에 버전 번호와 함께 기록된다.

데이터 분류

모든 데이터는 Öffentlich / 공개 공공 데이터이다 — 집계된 휴일 달력이며, 개인 데이터가 없다(DSG/DSGVO). 이는 서버가 처리하는 최고 분류이며, 전체 모델은 docs/security.md에 있다.

알려진 제한 사항

  • 비공식 소스. OpenHolidays는 주(州) 차원의 공표를 집계한다. 법적 구속력이 있는 날짜의 경우 주(州) 당국이 여전히 권위 있는 소스이다. 모든 응답이 이를 명시한다.

  • 지자체 범위는 상류에 달려 있다. OpenHolidays는 실제로 구(district) 및 지자체 수준의 공휴일(예: CH-ZH-ZH-ZH의 Sechseläuten, Knabenschiessen)을 제공하며, get_local_holidays를 통해 노출된다. Gemeinde 수준의 완전성은 상류 데이터만큼만 좋으며, 주(州)에 따라 다르다. 지자체 학교 휴일은 별도로 모델링되지 않는다.

  • Nager 연휴(long weekend)는 주(州) 공휴일을 무시한다. 전국 공휴일만 기준으로 계산된다.

  • 과거 깊이 보장 없음. 대략 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(EU 호스팅 OGD 프로젝트)와 Nager.Date로 전송된다. 개인 데이터는 환경을 떠나지 않으며, 휴일 달력만 요청된다.

  • 로깅: 로그는 stderr에 기록된다. 이에 따라 IT 보존 정책을 구성하라.

  • HTTP 전송은 인증 및 IP별 속도 제한이 있는 리버스 프록시 뒤에서 실행해야 한다 — 서버에는 내장 인증이 없다.


라이선스

MIT 라이선스 — LICENSE 참조

소스 데이터는 OpenHolidays(CC BY 4.0) 및 Nager.Date(MIT)의 조건을 따르며, 해당 데이터를 사용할 때는 이 소스에 대한 출처 표시가 필요하다.


저자

Hayal Oezkan · github.com/malkreide


크레딧 및 관련 프로젝트

Server

설명

zh-education-mcp

취리히 주 교육 데이터

zurich-opendata-mcp

취리히 시 공개 데이터

swiss-statistics-mcp

BFS STAT-TAB — 스위스 연방 통계

swisstopo-mcp

스위스 연방 지리 데이터 (swisstopo)

MIT 라이선스. 공공 자금, 공공 코드.

Available Tools

13 tools
check_dateA
Read-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?"

ParametersJSON Schema
NameRequiredDescriptionDefault
cantonYesISO code, e.g. CH-ZH
languageNoDE
school_typeNo
check_date_isoYesDate as YYYY-MM-DD

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
cantonYes
sourceYesAttribution string of the upstream source.
matchesYes
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
checked_dateYes
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.
is_public_holidayYes
is_school_holidayYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_holidaysA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
cantonsYes
languageNoDE
school_typeNoVS

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
rowsYes
yearYes
sourceYesAttribution string of the upstream source.
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.
school_type_filterYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_icsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
cantonYesISO code, e.g. CH-ZH
includeNoall
languageNoDE
school_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
icsYesThe full iCalendar (text/calendar) document.
noteNoHuman-readable caveat, set when provenance is 'degraded'.
yearYes
cantonYes
sourceYesAttribution string of the upstream source.
filenameYesSuggested file name, e.g. holidays-CH-ZH-2026.ics.
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
event_countYesNumber of VEVENTs in the calendar.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_windowA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
cantonsYes
languageNoDE
min_daysNo
school_typeNoVS

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
sourceYesAttribution string of the upstream source.
windowsYes
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_holidaysA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
cantonYesISO code, e.g. CH-ZH
languageNoDE
municipalityYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
countYes
sourceYesAttribution string of the upstream source.
holidaysYes
match_typeNoHow 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).
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_weekendsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
yearYes
sourceYesAttribution string of the upstream source.
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.
long_weekendsYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_holidaysA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
cantonYesISO code, e.g. CH-ZH
languageNoDE

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
countYes
sourceYesAttribution string of the upstream source.
holidaysYes
match_typeNoHow 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).
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_holidaysA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cantonYesISO code, e.g. CH-ZH
languageNoDE
valid_toYesDate as YYYY-MM-DD
valid_fromYesDate as YYYY-MM-DD
school_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
countYes
sourceYesAttribution string of the upstream source.
holidaysYes
match_typeNoHow 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).
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_todayA
Read-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?".

ParametersJSON Schema
NameRequiredDescriptionDefault
cantonYesISO code, e.g. CH-ZH
languageNoDE
school_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
cantonYes
sourceYesAttribution string of the upstream source.
matchesYes
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
checked_dateYes
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.
is_public_holidayYes
is_school_holidayYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_cantonsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNoDE

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
sourceYesAttribution string of the upstream source.
cantonsYes
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_typesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cantonNo
languageNoDE

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
sourceYesAttribution string of the upstream source.
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.
school_typesYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_holidaysA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cantonYesISO code, e.g. CH-ZH
languageNoDE
school_typeNoVS

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
countYes
sourceYesAttribution string of the upstream source.
holidaysYes
match_typeNoHow 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).
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_statusA
Read-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".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHuman-readable caveat, set when provenance is 'degraded'.
sourceYesAttribution string of the upstream source.
sourcesYes
provenanceYeslive_api = freshly fetched, cached = in-memory cache, degraded = upstream unreachable, stale or empty payload.
all_healthyYes
retrieved_atYesISO-8601 UTC timestamp of the underlying fetch.
mcp_protocol_versionYesMCP wire protocol version this server is built and tested against.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

A4.2/5.0
Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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