i14y-mcp

i14y-mcp

MCP server for Switzerland's national metadata catalogue, enabling AI agents to discover datasets, APIs, public services, and publishers through free-text search and structured queries.

Category
Visit Server

README

Part of the Swiss Public Data MCP Portfolio β€” a collection of open-source MCP servers connecting AI agents to Swiss public and open data. This is a private project. It is not affiliated with, endorsed by, or operated on behalf of any employer or public authority.

i14y-mcp

License: MIT Python 3.10+ MCP Data: I14Y

MCP server for the I14Y interoperability platform β€” Switzerland's national metadata catalogue.

πŸ‡©πŸ‡ͺ Deutsche Version


Why this server exists

The other servers in this portfolio answer Β«what does the data say?Β». This one answers the question that comes first: Β«who publishes data on this topic, through which interface, under which licence?Β»

I14Y is the national data catalogue maintained by the Federal Statistical Office. It describes datasets, registered APIs, public services and harmonised concepts from the Confederation, cantons and communes, using the DCAT-AP-CH profile (eCH-0200).

Mnemonic: Β«Catalogue before shelf.Β» Without a catalogue, an agent has to already know a data source exists. With one, it can find it.


🎯 Anchor Demo Query

Β«Which authority publishes data on special needs education, through which interface is it available, and under which licence?Β»

search_catalog(query="SonderpΓ€dagogik")
  β†’ Β«Statistik der SonderpΓ€dagogikΒ» β€” Federal Statistical Office (BFS), theme: Bildung

get_dataset_distributions(dataset_id=...)
  β†’ 2 distributions, licence: Β«Opendata BY ASK β€” attribution required,
    commercial use only with permission from the data supplierΒ»

get_dataset(dataset_id=...)
  β†’ contact: auskunftsdienst@bfs.admin.ch

Three tool calls turn a vague topic into a named authority, a download URL and a licence you can act on.


Architecture

                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚      MCP Host (Claude)       β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚ stdio | streamable-http
                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚          i14y-mcp            β”‚
                 β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
                 β”‚  β”‚ server.py  (13 tools)  β”‚  β”‚
                 β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
                 β”‚  β”‚ mappers.py             β”‚  β”‚  DCAT β†’ flat, one language
                 β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
                 β”‚  β”‚ models.py  (Pydantic)  β”‚  β”‚  source + provenance envelope
                 β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
                 β”‚  β”‚ client.py              β”‚  β”‚  retry 2s/4s/8s, no-retry 4xx
                 β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚ HTTPS, no auth
                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚  api.i14y.admin.ch/api       β”‚
                 β”‚  datasets Β· dataservices Β·   β”‚
                 β”‚  concepts Β· publicservices Β· β”‚
                 β”‚  catalogs Β· agents Β· search  β”‚
                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Architecture decision

This server uses Architecture A (live API only).

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

  • All read endpoints respond without authentication and paginate correctly.
  • No bulk download of catalogue metadata is offered, and none is needed.
  • Error responses follow RFC 7807, so failure modes are distinguishable.

Consequences:

  • Every HTTP call retries transient failures with 2 s / 4 s / 8 s backoff.
  • search_catalog caps results client-side because the upstream ignores paging.
  • api_status always returns an evaluable state instead of empty records.

Full probe report: docs/probe-i14y.md.


Tools

Tool Purpose
search_catalog Free-text search across the catalogue. Entry point.
list_datasets Paginated dataset register (complete, unlike search).
get_dataset Full metadata record for one dataset.
get_dataset_distributions Download URLs, formats and licences.
list_data_services Register of official Swiss APIs with endpoint URLs.
get_data_service Full record for one registered interface.
list_public_services Administrative services for citizens.
list_concepts Harmonised concepts and code lists.
get_concept One concept definition.
search_codelist_entries Individual codes of a code list.
list_publishers Publishing bodies, with Swiss UID.
list_catalogs Contributing catalogues.
api_status Reachability check with graceful degradation.

All tools are annotated readOnlyHint: true. Write operations exist in the upstream API but are deliberately not exposed.


Installation

uvx i14y-mcp

Or from source:

git clone https://github.com/malkreide/i14y-mcp
cd i14y-mcp
pip install -e ".[dev]"

Claude Desktop

{
  "mcpServers": {
    "i14y": {
      "command": "uvx",
      "args": ["i14y-mcp"]
    }
  }
}

Remote deployment (Render, Railway)

I14Y_MCP_TRANSPORT=sse PORT=8000 i14y-mcp

I14Y_MCP_TRANSPORT accepts stdio (default), sse or streamable-http.


Join keys

I14Y is a connector layer. Two identifiers make it composable with the rest of the portfolio:

Key Field Joins to
Swiss UID Publisher.uid register-mcp (Zefix)
Endpoint URL DataServiceSummary.endpoint_urls any portfolio server wrapping that API

Known limitations

Verified live on 2026-07-21.

  1. The search index covers roughly half the register. search_catalog returns at most 1013 records; list_datasets reaches about 2003. Use list_datasets when completeness matters.
  2. Search returns Datasets only. Filtering by types=["Concept"] or types=["DataService"] yields zero results even though those entities exist. Use list_concepts and list_data_services instead.
  3. The upstream ignores paging on search. The full result set is always returned; this server caps it at 200 records and sets truncated: true.
  4. Licences vary per distribution, not per dataset. Most carry Β«Opendata BY ASKΒ», which requires attribution and restricts commercial use. Always read the licence field before reuse.
  5. Some metadata fields are simply empty. Frequency, temporal coverage and distribution format are optional and frequently unset by publishers. This is a data-quality property of the catalogue, not a bug in this server.
  6. Not every entry with an endpoint has a URL. Entries labelled only Β«OpenAPI SpezifikationΒ» without a URI are surfaced as (no URI) <label> rather than dropped.

Testing

PYTHONPATH=src pytest tests/ -m "not live"   # offline, used in CI
PYTHONPATH=src pytest tests/ -m "live"       # hits the real API
PYTHONPATH=src pytest tests/                 # everything
python -m ruff check src tests

The live tests are not decoration: fundstΓΌck 4 in the probe report β€” keywords nesting their language object under label β€” was caught by a live test after the unit tests were already green.


Credits & related projects

Licence: MIT. The catalogue data remains subject to the terms declared by each publisher.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured