.vscode — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited .vscode (MCP Server) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server that connects AI assistants to the [Swiss I14Y Interoperability Platform](https://www.i14y.admin.ch).
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.
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:
| Tool | Description |
|---|---|
list_datasets | List datasets with filters (publisher, status, level) |
get_dataset | Get full metadata for a dataset |
get_dataset_structure | Export dataset schema (JSON-LD, Turtle, RDF) |
list_dataservices | List data services (APIs) with filters |
get_dataservice | Get full metadata for a data service |
list_concepts | List concepts (codelists, dictionaries) with filters |
get_concept | Get concept details, optionally with codelist entries |
get_concept_codelist | Export all codelist entries (JSON or CSV) |
list_publicservices | List public services with filters |
get_publicservice | Get full metadata for a public service |
get_catalog | Export a catalog in DCAT-AP format (Turtle or RDF/XML) |
list_mappingtables | List mapping tables (source → target codelist correspondences) |
get_mappingtable | Get full metadata for a mapping table |
get_mappingtable_relations | Export all mapping relations (value correspondences) as JSON or CSV |
catalog_search | Full-text search across all resource types (server-side, via CORE API) |
get_dataset_by_identifier | Get a dataset by its short identifier (not UUID) |
check_dataset_has_structure | Check whether a dataset has a structural model defined |
get_dataset_model_graph | Get the dataset schema as a schema graph (nodes/edges) |
get_dataservice_by_identifier | Get a data service by its short identifier |
get_publicservice_by_identifier | Get a public service by its short identifier |
get_publicservice_relations | Get related public services |
get_concept_by_identifier | Get concept(s) by short identifier (e.g. "HGDE_KT") |
get_codelist_entries | Paginated codelist entries with full annotations |
get_codelist_entry_by_code | Look up a single codelist entry by code value |
get_codelist_entries_children | Navigate hierarchical codelists (children of a code) |
search_codelist_entries | Search entries within a specific codelist |
list_catalogs | List all DCAT catalogs |
get_catalog_records | Get records (resources) from a catalog |
get_catalog_themes | Get themes used in a catalog (DCAT-AP alignment) |
list_agents | List all publishing organisations (with identifiers for filtering) |
get_agent | Get full metadata for a publishing organisation |
list_vocabularies | List all controlled vocabularies (themes, licenses, formats…) |
get_vocabulary | Get all entries of a controlled vocabulary for RDF/DCAT-AP use |
get_distribution_content | Fetch the actual content of a distribution file (CSV, JSON, XML…) |
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.
git clone https://github.com/fgouzi/mcp-i14y.git
cd mcp-i14y
uv sync
uv run python main.pycurl http://localhost:8400/health
# → {"status":"ok","platform":"i14y","version":"0.1.0"}The MCP endpoint is http://localhost:8400/mcp (Streamable HTTP / JSON-RPC).
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"
}
}
}/mcp add i14y http://localhost:8400/mcpRequires 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:
.vscode/mcp.jsonMCP: List Servers from the Command Palette)Ctrl+Shift+I / Cmd+Shift+I) and switch to Agent modeTo configure manually in another project, create .vscode/mcp.json:
{
"servers": {
"i14y": {
"type": "http",
"url": "http://localhost:8400/mcp"
}
}
}i14yhttp://localhost:8400/mcpAdd 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.
npx @modelcontextprotocol/inspector http://localhost:8400/mcp#### list_datasets List datasets from the I14Y platform with optional filters.
| Parameter | Type | Default | Description |
|---|---|---|---|
publisher_identifier | string | — | Filter by publisher organisation ID |
registration_status | string | — | Initial, Candidate, Recorded, Qualified, Standard, PreferredStandard, Superseded, Retired |
publication_level | string | — | Internal or Public |
access_rights | string | — | Access restriction code |
dataset_identifier | string | — | Filter by dataset identifier |
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_dataset
| Parameter | Type | Description |
|---|---|---|
dataset_id | string | Dataset unique identifier |
#### get_dataset_structure
| Parameter | Type | Default | Description |
|---|---|---|---|
dataset_id | string | — | Dataset unique identifier |
format | string | JsonLd | JsonLd, Ttl, or Rdf |
#### list_dataservices Same filter parameters as list_datasets (with dataservice_identifier instead of dataset_identifier).
#### get_dataservice
| Parameter | Type | Description |
|---|---|---|
dataservice_id | string | Data service unique identifier |
#### list_concepts
| Parameter | Type | Default | Description |
|---|---|---|---|
publisher_identifier | string | — | Filter by publisher |
concept_identifier | string | — | Filter by concept identifier |
version | string | — | Filter by version |
registration_status | string | — | Registration status filter |
publication_level | string | — | Internal or Public |
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_concept
| Parameter | Type | Default | Description |
|---|---|---|---|
concept_id | string | — | Concept unique identifier |
include_codelist_entries | boolean | false | Embed codelist entries in response |
#### get_concept_codelist
| Parameter | Type | Default | Description |
|---|---|---|---|
concept_id | string | — | Concept unique identifier |
format | string | json | json or csv |
#### list_publicservices Same filter parameters as list_datasets (with publicservice_identifier).
#### get_publicservice
| Parameter | Type | Description |
|---|---|---|
publicservice_id | string | Public service unique identifier |
#### get_catalog
| Parameter | Type | Default | Description |
|---|---|---|---|
catalog_id | string | — | Catalog unique identifier |
format | string | ttl | ttl (Turtle) or rdf (RDF/XML) |
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 |
|---|---|---|---|
publisher_identifier | string | — | Filter by publisher organisation ID |
mappingtable_identifier | string | — | Filter by mapping table identifier |
version | string | — | Filter by version string |
registration_status | string | — | Initial, Candidate, Recorded, Qualified, Standard, PreferredStandard, Superseded, Retired |
publication_level | string | — | Internal or Public |
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_mappingtable
| Parameter | Type | Description |
|---|---|---|
mappingtable_id | string | Mapping table unique identifier (UUID) |
#### get_mappingtable_relations
| Parameter | Type | Default | Description |
|---|---|---|---|
mappingtable_id | string | — | Mapping table unique identifier (UUID) |
format | string | Json | Json or Csv |
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 |
|---|---|---|---|
query | string | — | Free-text search query (any language) |
types | list | — | Filter by type(s): Dataset, DataService, PublicService, Concept, MappingTable |
publishers | list | — | Filter by publisher identifier(s), e.g. ["CH1"] |
statuses | list | — | Filter by registration status(es) |
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_concept_by_identifier
| Parameter | Type | Description |
|---|---|---|
identifier | string | Short identifier string (e.g. "HGDE_KT", "CL_NOGA") |
#### get_codelist_entries
| Parameter | Type | Default | Description |
|---|---|---|---|
concept_id | string | — | Concept UUID |
page | integer | 1 | Page number |
page_size | integer | 100 | Results per page |
#### get_codelist_entry_by_code
| Parameter | Type | Description |
|---|---|---|
concept_id | string | Concept UUID |
code | string | Code value to look up (e.g. "1", "CH") |
#### get_codelist_entries_children
| Parameter | Type | Default | Description |
|---|---|---|---|
concept_id | string | — | Concept UUID |
parent_code | string | — | Parent code whose children to retrieve |
page | integer | 1 | Page number |
page_size | integer | 100 | Results per page |
#### search_codelist_entries
| Parameter | Type | Default | Description |
|---|---|---|---|
concept_id | string | — | Concept UUID |
query | string | — | Search term |
language | string | fr | Language for label matching: fr, de, it, en |
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_dataset_by_identifier
| Parameter | Type | Description |
|---|---|---|
identifier | string | Dataset short identifier (e.g. "px-x-0602010000_109") |
#### check_dataset_has_structure
| Parameter | Type | Description |
|---|---|---|
dataset_id | 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 |
|---|---|---|
dataset_id | 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.
#### get_dataservice_by_identifier
| Parameter | Type | Description |
|---|---|---|
identifier | string | Data service short identifier |
#### get_publicservice_by_identifier
| Parameter | Type | Description |
|---|---|---|
identifier | string | Public service short identifier |
#### get_publicservice_relations
| Parameter | Type | Description |
|---|---|---|
publicservice_id | string | Public service UUID |
#### list_catalogs
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_catalog_records
| Parameter | Type | Default | Description |
|---|---|---|---|
catalog_id | string | — | Catalog UUID |
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_catalog_themes
| Parameter | Type | Default | Description |
|---|---|---|---|
catalog_id | string | — | Catalog UUID |
page | integer | 1 | Page number |
page_size | integer | 100 | Results per page |
#### list_agents
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
page_size | integer | 25 | Results per page |
#### get_agent
| Parameter | Type | Description |
|---|---|---|
agent_id | string | Agent UUID |
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 |
|---|---|---|
identifier | string | Vocabulary identifier (e.g. "Concept_DATASET_THEME", "VOCAB_EU_FREQUENCY") |
#### get_distribution_content Fetch the actual data content of a DCAT distribution file.
Typical workflow:
get_dataset(dataset_id) → find distributions[n].downloadUrl.uriget_distribution_content(url) → returns the file contentSupported 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 |
|---|---|---|---|
download_url | string | — | The downloadUrl.uri value from a distribution object |
max_kb | integer | 200 | Maximum content size in KB — larger files are truncated with a warning |
Once connected, try asking your LLM assistant:
git clone https://github.com/fgouzi/mcp-i14y.git
cd mcp-i14y
uv sync
cp .env.example .env# Unit tests only (no network required)
uv run pytest
# Including integration tests (hits live I14Y test API)
uv run pytest -m integrationuv run ruff check --fix .
uv run ruff format .uv run pre-commit installCopy .env.example to .env and adjust:
| Variable | Default | Description |
|---|---|---|
MCP_HOST | 0.0.0.0 | Bind address (127.0.0.1 for local-only) |
MCP_PORT | 8400 | Server port |
I14Y_API_ENV | prod | prod or test |
LOG_LEVEL | INFO | Logging level |
SENTRY_DSN | _(empty)_ | Optional Sentry DSN |
MIT — see LICENSE.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.