Skip to main content
ClaudeWave

MCP server for TERMDAT — official multilingual terminology of the Swiss Federal Administration (DE/FR/IT/EN). Validated authority names, legal act titles and abbreviations for AI agents.

MCP ServersOfficial Registry1 stars0 forksPythonMITUpdated today
Install in Claude Code / Claude Desktop
Method: UVX (Python) · termdat-mcp
Claude Code CLI
claude mcp add termdat-mcp -- uvx termdat-mcp
claude_desktop_config.json (Claude Desktop)
{
  "mcpServers": {
    "termdat-mcp": {
      "command": "uvx",
      "args": ["termdat-mcp"]
    }
  }
}
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
Use cases

MCP Servers overview

> 🇨🇭 Part of the [**Swiss Public Data MCP Portfolio**](https://github.com/malkreide/swiss-public-data-mcp) — open-source MCP servers connecting AI agents to Swiss public and open data.
> This is a private project. It is independent of any employer or institutional affiliation.

# 🏷️ termdat-mcp

[![Version](https://img.shields.io/badge/version-0.1.1-blue.svg)](CHANGELOG.md)
[![CI](https://github.com/malkreide/termdat-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/malkreide/termdat-mcp/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![MCP](https://img.shields.io/badge/MCP-Model_Context_Protocol-8A2BE2.svg)](https://modelcontextprotocol.io/)
[![Auth: none](https://img.shields.io/badge/auth-none-brightgreen.svg)](#architecture-decision)
[![Portfolio](https://img.shields.io/badge/portfolio-swiss--public--data--mcp-informational)](https://github.com/malkreide/swiss-public-data-mcp)

> Official, validated Swiss administrative designations across DE / FR / IT / EN — with source references and validation status.

[🇩🇪 Deutsche Version](README.de.md)

## Overview

MCP server for **TERMDAT**, the terminology database of the Swiss Federal Administration, maintained by the Federal Chancellery. It gives an AI agent the officially validated designations of Swiss authorities, departments and legal acts across DE / FR / IT / EN — with source references and validation status.

Discovered through [`i14y-mcp`](https://github.com/malkreide/i14y-mcp), which catalogues TERMDAT as data service `ff0c37eb-2f7c-4ff6-996e-d22b77bf52fc`.

**What this is — and what it is not.** TERMDAT is not a subject dictionary. It is a **certified name-plate archive**: it will not tell you what «Sonderpädagogik» means, but it will tell you the official name of the authority responsible for it, and what that authority is called in French.

Measured coverage (live, 2026-07-19, German search over the Terminus field):

| Search term | Hits |
|---|---|
| Departement | 20 |
| Bildung | 13 |
| Verordnung | 8 |
| Schule | 5 |
| Behörde | 4 |
| Sonderpädagogik | 3 |
| Volksschule · Lehrperson · Schulleitung · Unterricht · Kindergarten | **0** |

The thirteen «Bildung» hits are organisational names — Bildungsdirektion, Erziehungsdepartement, Departement für Volkswirtschaft und Bildung — not pedagogical concepts. Plan accordingly: this server is strong for **authority naming, official titles and abbreviations**, and largely silent on domain vocabulary.

## Features

- Seven read-only tools over the official TERMDAT public v2 API.
- Official designations across **DE / FR / IT / EN**, with source reference and validation status on every response.
- Communication QA: check up to 25 terms in one call against validated designations.
- Vocabulary cache (24 h TTL) for the 140 collections and 23 classifications, with stale-serve fallback.
- Retry with exponential backoff (2/4/8 s); explicit `MaxEntryCount` to avoid silent truncation.
- Dual transport: `stdio` (local) and SSE (cloud).
- No authentication required — public, unauthenticated API (No-Auth-First).

## 🎯 Anchor demo query

> *«What are the official French and Italian names of the education directorates of the German-speaking cantons?»*

Resolved with `list_classifications` → `search_terms` → `translate_term`.

### Demo

![Demo: Claude using search_terms and translate_term](docs/assets/demo.svg)

## Prerequisites

- Python 3.10+
- [`uv` / `uvx`](https://docs.astral.sh/uv/) (recommended) or `pip`
- Network access to `api.termdat.bk.admin.ch` — no API key needed

## Installation

```bash
uvx termdat-mcp
```

Claude Desktop (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "termdat": {
      "command": "uvx",
      "args": ["termdat-mcp"]
    }
  }
}
```

## Quickstart

```bash
# Run locally over stdio (default transport)
uvx termdat-mcp

# From a checkout, without installing
PYTHONPATH=src python -m termdat_mcp
```

## Configuration

All configuration is via environment variables. Defaults are safe for local use.

| Variable | Default | Purpose |
|---|---|---|
| `TERMDAT_MCP_TRANSPORT` | `stdio` | Transport: `stdio` (local) or `sse` / `streamable-http` / `http` (cloud) |
| `HOST` | `127.0.0.1` | Bind host (SSE transport only). Loopback by default; set `HOST=0.0.0.0` **only** inside a container |
| `PORT` | `8000` | Bind port (SSE transport only) |
| `TERMDAT_MCP_CORS_ORIGINS` | `[]` | SSE only: explicit allowed browser origins (default-deny; never a wildcard in production) |
| `TERMDAT_MCP_LOG_LEVEL` | `INFO` | structlog level (JSON to stderr) |
| `TERMDAT_MCP_VOCAB_TTL` | `86400` | Vocabulary cache TTL in seconds |

Configuration is loaded once into a typed `Settings` object (pydantic-settings).

Cloud (Render / Railway):

```bash
TERMDAT_MCP_TRANSPORT=sse PORT=8000 termdat-mcp   # exposes /sse
```

## Available Tools

| Tool | Purpose |
|---|---|
| `search_terms` | Search TERMDAT with field flags, collection and classification filters |
| `translate_term` | Official equivalent of an administrative term in another national language |
| `check_terms` | Communication QA: check up to 25 terms against validated designations |
| `get_entries` | Fetch known entries by numeric ID |
| `list_collections` | The ~140 terminology collections (filter values) |
| `list_classifications` | The 23 subject classifications, e.g. `BILD` = education |
| `api_status` | Availability; never returns silently empty |

All tools are annotated `readOnlyHint: true`, `destructiveHint: false`.

**MCP primitives.** This server uses only the **Tools** primitive. TERMDAT answers
are live queries with no stable resource hierarchy to expose as *Resources*, and
there are no server-authored *Prompts*. The seven tools are small and closely
related, so they live in a single `server.py` rather than a `tools/` package.

## Architecture

```
┌─────────────────┐   stdio / SSE    ┌──────────────────────────┐
│  MCP host       │ ───────────────► │  termdat-mcp             │
│  (Claude, IDE)  │ ◄─────────────── │                          │
└─────────────────┘                  │  vocabulary cache (24 h) │
                                     │  140 collections         │
                                     │   23 classifications     │
                                     └────────────┬─────────────┘
                                                  │ httpx + retry (2/4/8 s)
                                                  ▼
                              https://api.termdat.bk.admin.ch/v2
                              ├── /Search          (SearchTerm + InLanguageCode)
                              ├── /Entry           (EntryIds)
                              ├── /Collection      (140 values)
                              └── /Classification  ( 23 values, incl. BILD)
```

## Architecture decision

This server uses **Architecture A (live API only)**, with caching limited to the two controlled vocabularies.

Rationale (verified live on 2026-07-19):

- The API publishes a complete **OpenAPI 3.0.4 specification** at `/swagger/v2/swagger.json` and declares **no security schemes** — unauthenticated access, No-Auth-First satisfied.
- Server-side search works properly, including 11 field flags and filters by collection and classification. There is no reason to mirror the database locally, and no bulk dump is offered.
- `/Collection` (140 entries) and `/Classification` (23 entries) change rarely and are needed to make filter arguments legible to an agent, so they are cached with a 24-hour TTL and a stale-serve fallback.

Consequences:

- Every search is a live call; `provenance` is `live_api` except for vocabulary lookups.
- Validation errors arrive as clean RFC 9110 payloads and are surfaced rather than swallowed.

## Project Structure

```
termdat-mcp/
├── src/termdat_mcp/
│   ├── __init__.py
│   ├── __main__.py       # entry point; dual transport (stdio / SSE)
│   ├── client.py         # httpx client, retry, vocabulary cache
│   ├── models.py         # Pydantic models
│   └── server.py         # MCP tool definitions
├── tests/
│   ├── test_client.py    # offline, respx-mocked
│   └── test_live.py       # hits the real TERMDAT API
├── README.md
├── README.de.md
├── CHANGELOG.md
├── LICENSE
└── pyproject.toml
```

## Safety & Limits

- **Read-only.** Every tool is annotated `readOnlyHint: true`, `destructiveHint: false`; the server never writes to TERMDAT.
- **No credentials handled.** The API is unauthenticated; the server stores and forwards no secrets.
- **No silent empties.** `api_status` and error paths surface failures instead of returning an empty result that looks complete.
- **Truncation is explicit.** `MaxEntryCount` is always sent and `truncated` is reported (see Known Limitations).
- **Licence caution.** TERMDAT content carries no licence statement; every response repeats this in `source`. Clarify terms with the Federal Chancellery before republishing downstream.
- **Egress allow-list.** Requests can only reach `api.termdat.bk.admin.ch` (HTTPS), enforced before every call by a frozen `ALLOWED_HOSTS` set — no user input can redirect egress. See [`docs/network-egress.md`](docs/network-egress.md).
- **Loopback by default.** SSE binds to `127.0.0.1`; `0.0.0.0` is an explicit container opt-in that warns on stderr. SSE also sets default-deny CORS, exposing only `Mcp-Session-Id`.
- **Errors are masked.** Upstream/internal error detail is logged to stderr (structlog JSON) and never returned to the model.
- **Accepted risks (ADRs):** DNS pinning ([ADR 0001](docs/adr/0001-dns-pinning.md)) and stateful load balancing ([ADR 0002](docs/adr/0002-scaling-and-deployment.md)) are deliberately deferred — low risk for a single-instance, single-host, no-auth server.
- **Container.** A hardened, non-root [`Dockerfile`](Dockerfile) is provided for SSE deployments.

## Known Limitations

- **A
llmmcpmodel-context-protocolmultilingualpythonswiss-open-dataswiss-public-data-mcptermdatterminology

What people ask about termdat-mcp

What is malkreide/termdat-mcp?

+

malkreide/termdat-mcp is mcp servers for the Claude AI ecosystem. MCP server for TERMDAT — official multilingual terminology of the Swiss Federal Administration (DE/FR/IT/EN). Validated authority names, legal act titles and abbreviations for AI agents. It has 1 GitHub stars and was last updated today.

How do I install termdat-mcp?

+

You can install termdat-mcp by cloning the repository (https://github.com/malkreide/termdat-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.

Is malkreide/termdat-mcp safe to use?

+

malkreide/termdat-mcp has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.

Who maintains malkreide/termdat-mcp?

+

malkreide/termdat-mcp is maintained by malkreide. The last recorded GitHub activity is from today, with 1 open issues.

Are there alternatives to termdat-mcp?

+

Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.

Deploy termdat-mcp to your cloud

Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.

Maintain this repo? Add a badge to your README

Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.

Featured on ClaudeWave: malkreide/termdat-mcp
[![Featured on ClaudeWave](https://claudewave.com/api/badge/malkreide-termdat-mcp)](https://claudewave.com/repo/malkreide-termdat-mcp)
<a href="https://claudewave.com/repo/malkreide-termdat-mcp"><img src="https://claudewave.com/api/badge/malkreide-termdat-mcp" alt="Featured on ClaudeWave: malkreide/termdat-mcp" width="320" height="64" /></a>

More MCP Servers

termdat-mcp alternatives