mcp-i14y
Enables querying Swiss government data catalog (datasets, APIs, codelists, public services) through Copilot Chat in VS Code or CLI.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-i14ylist datasets about education in Switzerland"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-i14y
An MCP server that connects AI assistants to the Swiss I14Y Interoperability Platform.
Ask Claude, Gemini, or GitHub Copilot to explore Swiss government datasets, APIs, codelists, and public services in natural language — powered by the Model Context Protocol.
Inspired by the French datagouv-mcp project, adapted for the Swiss I14Y platform.
What is I14Y?
The I14Y Interoperability Platform (operated by the Swiss Federal Statistical Office) is Switzerland's national catalog for government data. It standardises and publishes metadata for:
Datasets — data published by federal and cantonal bodies
Data Services — APIs exposing government data
Concepts — reusable data definitions, codelists, and data dictionaries
Public Services — administrative services offered to citizens and businesses
Related MCP server: swiss-academic-libraries-mcp
Features
Tool | Description |
| List datasets with filters (publisher, status, level) |
| Get full metadata for a dataset |
| Export dataset schema (JSON-LD, Turtle, RDF) |
| List data services (APIs) with filters |
| Get full metadata for a data service |
| List concepts (codelists, dictionaries) with filters |
| Get concept details, optionally with codelist entries |
| Export all codelist entries (JSON or CSV) |
| List public services with filters |
| Get full metadata for a public service |
| Export a catalog in DCAT-AP format (Turtle or RDF/XML) |
| List mapping tables (source → target codelist correspondences) |
| Get full metadata for a mapping table |
| Export all mapping relations (value correspondences) as JSON or CSV |
| Full-text search across all resource types (server-side, via CORE API) |
| Get a dataset by its short identifier (not UUID) |
| Check whether a dataset has a structural model defined |
| Get the dataset schema as a schema graph (nodes/edges) |
| Get a data service by its short identifier |
| Get a public service by its short identifier |
| Get related public services |
| Get concept(s) by short identifier (e.g. "HGDE_KT") |
| Paginated codelist entries with full annotations |
| Look up a single codelist entry by code value |
| Navigate hierarchical codelists (children of a code) |
| Search entries within a specific codelist |
| List all DCAT catalogs |
| Get records (resources) from a catalog |
| Get themes used in a catalog (DCAT-AP alignment) |
| List all publishing organisations (with identifiers for filtering) |
| Get full metadata for a publishing organisation |
| List all controlled vocabularies (themes, licenses, formats…) |
| Get all entries of a controlled vocabulary for RDF/DCAT-AP use |
| Fetch the actual content of a distribution file (CSV, JSON, XML…) |
Quick Start
Option 1: Docker Compose (recommended)
git clone https://github.com/fgouzi/mcp-i14y.git
cd mcp-i14y
cp .env.example .env
docker compose up -dThe server will be available at http://localhost:8400/mcp.
Option 2: Local setup with uv
git clone https://github.com/fgouzi/mcp-i14y.git
cd mcp-i14y
uv sync
uv run python main.pyVerify
curl http://localhost:8400/health
# → {"status":"ok","platform":"i14y","version":"0.1.0"}Connect to your AI assistant
The MCP endpoint is http://localhost:8400/mcp (Streamable HTTP / JSON-RPC).
Claude Desktop
Add to claude_desktop_config.json:
macOS/Linux:
~/.claude/claude_desktop_config.json· Windows:%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"i14y": {
"type": "http",
"url": "http://localhost:8400/mcp"
}
}
}Claude Code (CLI)
/mcp add i14y http://localhost:8400/mcpGitHub Copilot (VS Code)
Requires VS Code 1.112+ with the GitHub Copilot Chat extension.
A .vscode/mcp.json file is already included in this repository. After starting the server:
Open the repo in VS Code — a "Start" button appears at the top of
.vscode/mcp.jsonClick Start (or run
MCP: List Serversfrom the Command Palette)Open Copilot Chat (
Ctrl+Shift+I/Cmd+Shift+I) and switch to Agent modeClick the Tools icon to confirm the i14y tools are available
To configure manually in another project, create .vscode/mcp.json:
{
"servers": {
"i14y": {
"type": "http",
"url": "http://localhost:8400/mcp"
}
}
}Mistral Le Chat
Open Le Chat → side panel → Intelligence → Connectors
Click + Add Connector → Custom MCP Connector
Fill in:
Connector name:
i14yConnection server URL:
http://localhost:8400/mcpAuthentication: None
Click Connect
Enable it in any conversation via the Tools icon (four squares) below the chat input
Mistral Vibe (CLI agent)
Add to your config.toml:
[[mcp_servers]]
name = "i14y"
transport = "streamable-http"
url = "http://localhost:8400/mcp"Tools are then available as i14y_list_datasets, i14y_get_concept, etc.
MCP Inspector (testing)
npx @modelcontextprotocol/inspector http://localhost:8400/mcpAvailable Tools
Datasets
list_datasets
List datasets from the I14Y platform with optional filters.
Parameter | Type | Default | Description |
| string | — | Filter by publisher organisation ID |
| string | — |
|
| string | — |
|
| string | — | Access restriction code |
| string | — | Filter by dataset identifier |
| integer |
| Page number |
| integer |
| Results per page |
get_dataset
Parameter | Type | Description |
| string | Dataset unique identifier |
get_dataset_structure
Parameter | Type | Default | Description |
| string | — | Dataset unique identifier |
| string |
|
|
Data Services
list_dataservices
Same filter parameters as list_datasets (with dataservice_identifier instead of dataset_identifier).
get_dataservice
Parameter | Type | Description |
| string | Data service unique identifier |
Concepts
list_concepts
Parameter | Type | Default | Description |
| string | — | Filter by publisher |
| string | — | Filter by concept identifier |
| string | — | Filter by version |
| string | — | Registration status filter |
| string | — |
|
| integer |
| Page number |
| integer |
| Results per page |
get_concept
Parameter | Type | Default | Description |
| string | — | Concept unique identifier |
| boolean |
| Embed codelist entries in response |
get_concept_codelist
Parameter | Type | Default | Description |
| string | — | Concept unique identifier |
| string |
|
|
Public Services
list_publicservices
Same filter parameters as list_datasets (with publicservice_identifier).
get_publicservice
Parameter | Type | Description |
| string | Public service unique identifier |
Catalogs
get_catalog
Parameter | Type | Default | Description |
| string | — | Catalog unique identifier |
| string |
|
|
Mapping Tables
A mapping table defines a correspondence between two codelists (source → target), enabling semantic alignment across classification systems (e.g. old canton codes → new codes, Swiss codes → European standards).
list_mappingtables
Parameter | Type | Default | Description |
| string | — | Filter by publisher organisation ID |
| string | — | Filter by mapping table identifier |
| string | — | Filter by version string |
| string | — |
|
| string | — |
|
| integer |
| Page number |
| integer |
| Results per page |
get_mappingtable
Parameter | Type | Description |
| string | Mapping table unique identifier (UUID) |
get_mappingtable_relations
Parameter | Type | Default | Description |
| string | — | Mapping table unique identifier (UUID) |
| string |
|
|
Search
Since the I14Y API has no full-text search endpoint, these tools fetch pages progressively and rank results client-side.
catalog_search
Full-text search across all I14Y resource types (server-side, via CORE API).
Parameter | Type | Default | Description |
| string | — | Free-text search query (any language) |
| list | — | Filter by type(s): |
| list | — | Filter by publisher identifier(s), e.g. |
| list | — | Filter by registration status(es) |
| integer |
| Page number |
| integer |
| Results per page |
Concepts (CORE)
get_concept_by_identifier
Parameter | Type | Description |
| string | Short identifier string (e.g. |
get_codelist_entries
Parameter | Type | Default | Description |
| string | — | Concept UUID |
| integer |
| Page number |
| integer |
| Results per page |
get_codelist_entry_by_code
Parameter | Type | Description |
| string | Concept UUID |
| string | Code value to look up (e.g. |
get_codelist_entries_children
Parameter | Type | Default | Description |
| string | — | Concept UUID |
| string | — | Parent code whose children to retrieve |
| integer |
| Page number |
| integer |
| Results per page |
search_codelist_entries
Parameter | Type | Default | Description |
| string | — | Concept UUID |
| string | — | Search term |
| string |
| Language for label matching: |
| integer |
| Page number |
| integer |
| Results per page |
Datasets (CORE)
get_dataset_by_identifier
Parameter | Type | Description |
| string | Dataset short identifier (e.g. |
check_dataset_has_structure
Parameter | Type | Description |
| string | Dataset UUID |
Returns true if a structural model exists, false otherwise. Use this before calling get_dataset_structure() to filter datasets that have a documented schema.
get_dataset_model_graph
Parameter | Type | Description |
| string | Dataset UUID |
Returns the dataset schema as a graph (nodes/edges) — suited for programmatic processing. Complements get_dataset_structure() which returns RDF/JSON-LD.
Data Services (CORE)
get_dataservice_by_identifier
Parameter | Type | Description |
| string | Data service short identifier |
Public Services (CORE)
get_publicservice_by_identifier
Parameter | Type | Description |
| string | Public service short identifier |
get_publicservice_relations
Parameter | Type | Description |
| string | Public service UUID |
Catalogs (CORE)
list_catalogs
Parameter | Type | Default | Description |
| integer |
| Page number |
| integer |
| Results per page |
get_catalog_records
Parameter | Type | Default | Description |
| string | — | Catalog UUID |
| integer |
| Page number |
| integer |
| Results per page |
get_catalog_themes
Parameter | Type | Default | Description |
| string | — | Catalog UUID |
| integer |
| Page number |
| integer |
| Results per page |
Agents
list_agents
Parameter | Type | Default | Description |
| integer |
| Page number |
| integer |
| Results per page |
get_agent
Parameter | Type | Description |
| string | Agent UUID |
Vocabularies
Controlled vocabularies define valid values for DCAT-AP metadata fields (themes, access rights, licenses, media types, etc.).
list_vocabularies
No parameters. Returns all available vocabulary configurations with their identifiers.
get_vocabulary
Parameter | Type | Description |
| string | Vocabulary identifier (e.g. |
Distributions
get_distribution_content
Fetch the actual data content of a DCAT distribution file.
Typical workflow:
Call
get_dataset(dataset_id)→ finddistributions[n].downloadUrl.uriCall
get_distribution_content(url)→ returns the file content
Supported formats: JSON, CSV, XML, RDF/Turtle, GeoJSON, plain text. Binary formats (PDF, ZIP, Excel, images) are rejected with an error message.
Parameter | Type | Default | Description |
| string | — | The |
| integer |
| Maximum content size in KB — larger files are truncated with a warning |
Example Prompts
Once connected, try asking your LLM assistant:
"List all public datasets published by the Federal Statistical Office."
"What data services are available with status Standard?"
"Show me the codelist for Swiss canton codes."
"Get the full details for dataset with ID
abc-123.""Export the catalog of the OFS in Turtle format."
"What public administrative services are registered on I14Y?"
"Search for datasets about employment by canton."
"Find the concept codelist for 'Secteur économique'."
"List all mapping tables that link old canton codes to new ones."
"Export the mapping relations for mapping table
xyz-456as CSV.""Find the dataset with identifier
px-x-0602010000_109.""Get the valid values for DCAT themes (data subjects)."
"Which organisations publish data on I14Y?"
"Get all child codes of canton 1 in the commune hierarchy."
Development
Setup
git clone https://github.com/fgouzi/mcp-i14y.git
cd mcp-i14y
uv sync
cp .env.example .envRun tests
# Unit tests only (no network required)
uv run pytest
# Including integration tests (hits live I14Y test API)
uv run pytest -m integrationLint & format
uv run ruff check --fix .
uv run ruff format .Install pre-commit hooks
uv run pre-commit installConfiguration
Copy .env.example to .env and adjust:
Variable | Default | Description |
|
| Bind address ( |
|
| Server port |
|
|
|
|
| Logging level |
| (empty) | Optional Sentry DSN |
License
MIT — see LICENSE.
Credits
Inspired by datagouv-mcp by the data.gouv.fr team
Built on FastMCP and the MCP Python SDK
Data provided by the Swiss Federal Statistical Office (OFS/BFS) via I14Y
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- 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/fgouzi/mcp-i14y'
If you have feedback or need assistance with the MCP directory API, please join our Discord server