# OpenHelvetia Gateway (remote · mcp.openhelvetia.swiss)

Swiss federal law (Fedlex) and political data (LINDAS) for agents, every answer with sources

- Trust score: 69/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-28

## Components

- remote · `mcp.openhelvetia.swiss`: 69/100 (this document), [markdown](https://verifymcp.io/servers/swiss-openhelvetia-gateway/mcp.md), [page](https://verifymcp.io/servers/swiss-openhelvetia-gateway/mcp)

## Channel facts

- Endpoint: `https://mcp.openhelvetia.swiss/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-28.

- **Endpoint Security**: 46/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 1 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 406, which proves neither a plaintext path nor enforcement.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 76/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 6723 tokens (~103/item across 65 items; 65 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 77/100
  - Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 90/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 70% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "publish.info" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 66 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the OpenHelvetia Gateway MCP server?

OpenHelvetia Gateway is a hosted endpoint at https://mcp.openhelvetia.swiss/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http swiss-openhelvetia-gateway 'https://mcp.openhelvetia.swiss/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "swiss-openhelvetia-gateway": {
      "url": "https://mcp.openhelvetia.swiss/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "swiss-openhelvetia-gateway": {
      "type": "http",
      "url": "https://mcp.openhelvetia.swiss/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.swiss-openhelvetia-gateway]
url = "https://mcp.openhelvetia.swiss/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "swiss-openhelvetia-gateway": {
      "type": "remote",
      "url": "https://mcp.openhelvetia.swiss/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add swiss-openhelvetia-gateway --url 'https://mcp.openhelvetia.swiss/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  swiss-openhelvetia-gateway:
    url: "https://mcp.openhelvetia.swiss/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "swiss-openhelvetia-gateway": {
      "Transport": "http",
      "Url": "https://mcp.openhelvetia.swiss/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add swiss-openhelvetia-gateway -t streamable-http -u 'https://mcp.openhelvetia.swiss/mcp'
```

### Other

```json
{
  "mcpServers": {
    "swiss-openhelvetia-gateway": {
      "type": "http",
      "url": "https://mcp.openhelvetia.swiss/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-28 (score 69, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-27 (score 68, 0)

- [security] Tool “lindas.describe_cube” rewrote its description, which is the text the model reads
- [security] Tool “manifest.get” rewrote its description, which is the text the model reads
- [functional] Schema quality: excellent → good
- [cosmetic] “lindas.observations” reworded the description of “filters”

### 2026-09-26 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-25 (score 67, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-24 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-22 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-19 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (65)

### `directory.get` (~50 tokens)

The directory envelope (v0.2, authority: manifest). Real entries only — a data source enters on one of three admission routes (E21); an empty list is the honest state, never padded.

### `facts.badge` (~63 tokens)

shields.io endpoint JSON for one subject, derived from the fact table — «no facts» in grey when nothing is recorded, never rounded up.

Input parameters:

- `domain` (string, required)
- `subject` (string, required): Subject key (e.g. «slug#0»).

### `facts.latest` (~76 tokens)

Latest effective facts per subject+metric from the versioned fact table — the bitemporal as_of cutoff is exposed; an absent store is the honest empty view.

Input parameters:

- `as_of` (string|null): Optional bitemporal cutoff (RFC 3339).
- `domain` (string, required): Measured domain («checker», «benchmark»).

### `fedlex.check_in_force` (~64 tokens)

Check whether an act was in force on a date; false is a valid answer, never an error: use for «gilt das noch?» questions. norm.

Input parameters:

- `as_of` (string, required): ISO date YYYY-MM-DD.
- `eli` (string, required)

### `fedlex.check_quote` (~208 tokens)

Check a quote (Zitat) against the norm text of one element: use before citing, to prove the wording is in what was read (Belegkette). norm.

Input parameters:

- `eid` (string, required): The element that was read: an eId such as «art_6» or a path eId such as «art_6/para_1» or «annex_3/lvl_u1/lvl_2».
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>` — the version that was read.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.
- `quote` (string, required): The wording to check, verbatim; «…» or «[...]» marks an omission (each part must occur, in order).

### `fedlex.cite` (~156 tokens)

Cite an element as its canonical Fundstelle («Art. 7 Abs. 1 Bst. b LSV») from eli_version and eId: use to label a read place in the Belegkette. norm.

Input parameters:

- `eid` (string, required): The place to label: an eId such as «art_7/para_1/lbl_b», «art_23_a» or «annex_3/lvl_u1».
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Label language (de|fr|it|en|rm) — the manifestation read and the abbreviation used; default de.

### `fedlex.compare_versions` (~181 tokens)

Compare an element or every article between two Fassungen of an act — added, removed, changed paragraphs with wording: use for «was hat sich geändert?». norm.

Input parameters:

- `eid` (string|null): Optional scope: one element (article or path eId); default every article.
- `eli` (string, required): Fedlex ELI of the act (consolidation abstract).
- `from_version` (string, required): The older consolidation: a version IRI or a date (YYYY-MM-DD / YYYYMMDD).
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.
- `to_version` (string, required): The newer consolidation: a version IRI or a date.

### `fedlex.detect_foreign_content` (~119 tokens)

Detect what the text tools hide in a Fassung: sections in another language (xml:lang) and <foreign> islands (formulas, graphics): use before quoting. norm.

Input parameters:

- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.

### `fedlex.explore_node` (~91 tokens)

Explore a JOLux node's edges (predicates and neighbours, both directions, capped): use to debug what the graph holds about an IRI; never as proof. hint.

Input parameters:

- `iri` (string, required): Any Fedlex IRI (https://fedlex.data.admin.ch/…).
- `limit` (integer|null): Edges per direction (default 20, at most 50).

### `fedlex.extract_tables` (~152 tokens)

Extract the tables of a consolidation or of one element (annex limit values, tariffs) as header and rows: use when a norm is a table, not prose. norm.

Input parameters:

- `eid` (string|null): Optional scope: an eId (an annex level such as «annex_3/lvl_u1/lvl_2», an article).
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.

### `fedlex.find_related_topic` (~103 tokens)

Find acts in the same field of law via the legal taxonomy, by ELI or SR: use to discover neighbouring Erlasse; candidates only. hint.

Input parameters:

- `eli` (string|null): Fedlex ELI of the act — or give `sr`.
- `limit` (integer|null): Max candidates (default 20, at most 50).
- `sr` (string|null): SR number as an alternative entry, e.g. «832.10».

### `fedlex.find_treaties` (~122 tokens)

Find treaty processes (Staatsverträge) by a title word, partner country IRI or bilaterality: use to locate a treaty before get_treaty_info. hint.

Input parameters:

- `bilateral` (boolean|null): true = bilateral only, false = multilateral only.
- `country` (string|null): Partner country as a Fedlex country vocabulary IRI.
- `limit` (integer|null): Max hits (default 20, at most 50).
- `query` (string|null): A word of the treaty title (case-insensitive).

### `fedlex.get_article_history` (~96 tokens)

Trace which amendments and consolidations changed one Artikel (eId) of an act, with dates: use for «seit wann gilt Art. X so?». norm.

Input parameters:

- `eid` (string, required): Akoma-Ntoso eId of the element, e.g. «art_14a» or «art_2/para_1».
- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.get_citations` (~97 tokens)

List an act's relations: cites|cited_by (formal citations, act level) or in|out (foreseen impacts, mostly consultation drafts): use to see who cites X. norm.

Input parameters:

- `direction` (string, required): «in» | «out» (the foreseen-impact graph) or «cites» | «cited_by» (the formal citation graph, act level).
- `eli` (string, required)

### `fedlex.get_consultation_documents` (~57 tokens)

List the position statements and result reports of one consultation IRI: use after get_consultations to read the genesis record. norm.

Input parameters:

- `consultation` (string, required): The consultation IRI (from get_consultations).

### `fedlex.get_consultations` (~133 tokens)

List the consultations (Vernehmlassungen) of an act's drafts or of one draft, with status and dates: use for the genesis, never for law in force. hint.

Input parameters:

- `draft` (string|null): Or a draft IRI (from get_drafts).
- `eli` (string|null): Fedlex ELI of the act — its drafts are resolved first (at most five).
- `limit` (integer|null): Max consultations (default 20, at most 50).
- `status` (string|null): Optional status filter: the consultation-status IRI or its last segment.

### `fedlex.get_drafts` (~62 tokens)

List the legislative drafts (Entwürfe, eli/proj) an act came from, with the Curia Vista number: use as the entry to consultations and materials. norm.

Input parameters:

- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.get_fga_documents` (~64 tokens)

List the Federal Gazette (BBl) documents of an act's genesis — Botschaft, reports — with genre and date: use for materials, never for law in force. norm.

Input parameters:

- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.get_law_metadata` (~78 tokens)

Read the JOLux profile of an act (titles de/fr/it, status, dates, identifier) for an ELI: use to confirm a search hit before you cite. norm.

Input parameters:

- `as_of` (string|null): Optional ISO date; absent = today, echoed back resolved.
- `eli` (string, required)

### `fedlex.get_memorial` (~97 tokens)

List the AS/BBl issue (memorial) an oc publication appeared in and the acts of that issue: use after get_oc_act to locate the volume. norm.

Input parameters:

- `eli` (string, required): The AS publication ELI (https://fedlex.data.admin.ch/eli/oc/…), from get_oc_act.
- `limit` (integer|null): Max acts of the issue (default 20, at most 50).

### `fedlex.get_modifications` (~136 tokens)

List the amendment notes («Fassung gemäss …», AS refs) per element of a consolidation: use for «wann und wodurch wurde Art. X geändert?». norm.

Input parameters:

- `eid` (string|null): Optional scope: only notes anchored at this eId or below.
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.

### `fedlex.get_oc_act` (~64 tokens)

Resolve an act's binding AS/RO publication (oc ELI, date, genre, office, memorial) from its consolidation ELI: use to cite the Amtliche Sammlung. norm.

Input parameters:

- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.get_references` (~175 tokens)

List the references (Verweise) an act's text makes, with ELI where linked, optionally within one eId: use to follow cross-references. hint.

Input parameters:

- `eid` (string|null): Optional scope: only references made from this eId or below.
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.
- `limit` (integer|null): Page size (default 200, at most 1000).
- `offset` (integer|null): Continuation: the `next_offset` of the previous answer.

### `fedlex.get_structure` (~141 tokens)

Outline one consolidation (sections, articles with eId, num and heading): use when you know the act but not the article number. norm.

Input parameters:

- `depth` (string|null): «article» (default: the skeleton down to articles) or «full» (the whole tree down to paragraphs and items).
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.

### `fedlex.get_subdivisions` (~62 tokens)

List the subdivisions JOLux knows for an act (amended elements only, a gap catalogue): use to see which Artikel carry amendments; outline: get_structure. norm.

Input parameters:

- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.get_taxonomy` (~60 tokens)

Classify an act in the systematic collection (SR branch chain, notation, labels de/fr/it): use for «zu welchem Rechtsgebiet gehört X?». norm.

Input parameters:

- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.get_treaty_info` (~105 tokens)

Read a treaty process profile (title, signature, bilateral, partner countries, approving decree) for an eli/treaty IRI: use after find_treaties. norm.

Input parameters:

- `eli` (string, required): The treaty process IRI (https://fedlex.data.admin.ch/eli/treaty/…), from find_treaties.
- `lang` (string|null): Preferred title language (de|fr|it|en|rm); default de.

### `fedlex.list_annexes` (~119 tokens)

List the annexes (Anhänge) of a consolidation with titles and path eIds (annex_u1/…): use before reading an Anhang with read_article. norm.

Input parameters:

- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.

### `fedlex.list_expressions` (~62 tokens)

List the language versions and manifestations (XML, PDF) of one consolidation: use before reading to see whether a Fassung is PDF-only. norm.

Input parameters:

- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.

### `fedlex.list_versions` (~54 tokens)

List every dated consolidation (Fassung) of an act, future ones included: use to pick the eli_version the reading tools need. norm.

Input parameters:

- `eli` (string, required): Fedlex ELI of the consolidation abstract.

### `fedlex.parse_reference` (~122 tokens)

Parse a citation («Art. 7 Abs. 1 lit. b LSV») into act, article eId and path proposal: use to turn a quoted Fundstelle into what read_article can open. hint.

Input parameters:

- `text` (string, required): A citation in plain text, e.g. «Art. 7 Abs. 1 lit. b LSV», «Anhang 3 Ziff. 2 LSV», «Art. 8 EMRK i.V.m. Art. 36 BV», «SR 832.10».

### `fedlex.read_article` (~173 tokens)

Read one element (Artikel, Absatz, Anhang) of a dated consolidation by eId, e.g. art_6 or annex_u1/lvl_u1: use to quote a norm. norm.

Input parameters:

- `eid` (string, required): Akoma-Ntoso eId, e.g. «art_10a», or a path eId such as «art_2/para_1» or «annex_u1/lvl_u1».
- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.

### `fedlex.read_document` (~155 tokens)

Read a whole small act or Verordnung as capped Markdown (truncated flag, continuation offset): use for short acts; quote via read_article. norm.

Input parameters:

- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.
- `max_chars` (integer|null): Character budget (default 120 000, at most 400 000).
- `offset` (integer|null): Continuation: the `next_offset` of the previous answer.

### `fedlex.resolve_consolidation_at` (~64 tokens)

Resolve which consolidation (Fassung) of an act governed on an ISO date: use before reading text for a past or future Stichtag. norm.

Input parameters:

- `as_of` (string, required): ISO date YYYY-MM-DD.
- `eli` (string, required)

### `fedlex.resolve_sr` (~71 tokens)

Resolve an SR number (e.g. 832.10) to the act's ELI, titles and in-force status: use when a question names an SR; predecessors stay visible. norm.

Input parameters:

- `sr` (string, required): Systematic (SR) number, e.g. «832.10».

### `fedlex.resolve_vocabulary_label` (~133 tokens)

Look up a Fedlex vocabulary term (enforcement-status, language, …) by label or IRI: use to decode a coded value from another answer. hint.

Input parameters:

- `lang` (string|null): Label language (de|fr|it|en|rm); default de.
- `query` (string, required): A label fragment (case-insensitive, any language) or a vocabulary IRI to decode.
- `vocabulary` (string, required): Scheme id: «enforcement-status», «subdivision-type», «legal-taxonomy», «impact-type», «resource-type», «language», …

### `fedlex.search_law` (~65 tokens)

Search acts by title keyword or official abbreviation (KVG, StPO, OR): use when you know the name but not the SR or ELI; in-force acts rank first. hint.

Input parameters:

- `limit` (integer|null)
- `query` (string, required)

### `fedlex.search_text` (~149 tokens)

Find where a word occurs inside ONE consolidation (hits with eId and Artikel): use before read_article when the article is unknown. hint.

Input parameters:

- `eli_version` (string, required): Dated consolidation: `<abstract-eli>/<YYYYMMDD>`.
- `lang` (string|null): Manifestation language (de|fr|it|en|rm); default de. Which languages a version carries as XML is the graph's answer — fedlex.list_expressions shows it before a read.
- `limit` (integer|null): Max hits (default 20, at most 100); `total` counts beyond it.
- `query` (string, required): Word or phrase; case-insensitive substring.

### `i14y.api_status` (~47 tokens)

Check whether the I14Y catalogue answers, register by register, so «no data» and «source down» stay apart: use before retrying a failed call. norm.

### `i14y.get_concept` (~75 tokens)

Show one concept's record — type, value type, version, validity (Konzept, Codeliste): use before reading a code list's entries. norm.

Input parameters:

- `concept_id` (string, required): The concept's `id` from `i14y.list_concepts`.
- `lang` (string|null)

### `i14y.get_data_service` (~74 tokens)

Show one registered interface's record — endpoints, OpenAPI links, licence, served datasets (API, Endpunkt): use to reach the service. norm.

Input parameters:

- `data_service_id` (string, required): The service's `id` from `i14y.list_data_services`.
- `lang` (string|null)

### `i14y.get_dataset` (~83 tokens)

Show one dataset's full record — contact, coverage, every distribution with its licence and download address (Lizenz, Download): use before reuse. norm.

Input parameters:

- `dataset_id` (string, required): The record's `id` as a hit or a list row carries it — a GUID, never the publisher's `identifier`.
- `lang` (string|null)

### `i14y.get_dataset_distributions` (~88 tokens)

List a dataset's distributions — format, licence, download and access address (Datei, Lizenz, Format): use for «where do I get the data». norm.

Input parameters:

- `dataset_id` (string, required): The record's `id` as a hit or a list row carries it — a GUID, never the publisher's `identifier`.
- `lang` (string|null)

### `i14y.list_catalogs` (~84 tokens)

List the catalogues that feed I14Y, each one body's collection (Katalog, opendata.swiss, Bundesamt): use to see who contributes. norm.

Input parameters:

- `lang` (string|null)
- `limit` (integer|null): Catalogues per page, 1–100, default 50.
- `page` (integer|null)

### `i14y.list_concepts` (~91 tokens)

List the harmonised concepts and code lists of the administration (Konzept, Codeliste, Nomenklatur, Merkmal): use to find a code list by publisher. norm.

Input parameters:

- `lang` (string|null)
- `limit` (integer|null)
- `page` (integer|null)
- `publisher` (string|null)
- `registration_status` (string|null)

### `i14y.list_data_services` (~92 tokens)

List the registered machine interfaces of Swiss public bodies with their endpoints (API, Schnittstelle, Datendienst): use before building a scraper. norm.

Input parameters:

- `access_rights` (string|null)
- `lang` (string|null)
- `limit` (integer|null)
- `page` (integer|null)
- `publisher` (string|null)
- `registration_status` (string|null)

### `i14y.list_datasets` (~203 tokens)

List the registered datasets, paged, with publisher, themes and access right (Datensätze, Metadaten, Open Data): use for a census or a publisher's list. norm.

Input parameters:

- `access_rights` (string|null): PUBLIC | RESTRICTED | NON_PUBLIC | CONFIDENTIAL. A listing is metadata, never a grant of access.
- `lang` (string|null): Label language (de|fr|it|en|rm); default de.
- `limit` (integer|null): Records per page, 1–100, default 25.
- `page` (integer|null): 1-based page, default 1.
- `publisher` (string|null): Publisher code («CH_BAZG»), from `i14y.list_publishers`.
- `registration_status` (string|null): One of the eight: Incomplete, Candidate, Recorded, Qualified, Standard, PreferredStandard, Superseded, Retired.

### `i14y.list_public_services` (~81 tokens)

List the registered public services with their channels (Behördenleistung, Dienstleistung, Verwaltung): use for what an authority offers citizens. norm.

Input parameters:

- `lang` (string|null)
- `limit` (integer|null)
- `page` (integer|null)
- `publisher` (string|null)
- `registration_status` (string|null)

### `i14y.list_publishers` (~128 tokens)

List the bodies that publish into I14Y with identifier and Swiss UID (Herausgeber, Bundesamt, Kanton, UID): use to find a publisher's code for a filter. norm.

Input parameters:

- `identifier` (string|null): Exact publisher code («CH_BAZG»).
- `lang` (string|null)
- `limit` (integer|null): Publishers per page, 1–100, default 50.
- `page` (integer|null)
- `uid` (string|null): Exact Swiss UID as the register writes it («CHE116244755»).

### `i14y.search_catalog` (~259 tokens)

Search the national data catalogue I14Y by words (Datensatz, Schnittstelle, API, Behördenleistung, Codeliste): use first, to find who publishes what. hint.

Input parameters:

- `lang` (string|null): The language searched AND served (de|fr|it|en|rm); default de.
- `limit` (integer|null): Hits per page, 1–100, default 25.
- `page` (integer|null): 1-based page, default 1.
- `publishers` (array|null): Publisher CODES — the `identifier` `i14y.list_publishers` serves («CH1» is the Federal Statistical Office) — never a name.
- `query` (string, required): Free text, e.g. «Sonderpädagogik», «Zoll», «API»; empty lists the whole index one page at a time. Matched in `lang`.
- `themes` (array|null): Theme CODES as a hit carries them under `themes[].code` («103» is Bildung) — never a word.
- `types` (array|null): Restrict to resource types: Dataset | DataService | PublicService | Concept | MappingTable. Each of them answers.

### `i14y.search_codelist_entries` (~168 tokens)

List the codes of one code-list concept, paged, with names and validity (Code, Codeliste, Kanton, Geschlecht, Nomenklatur): use to resolve official codes. norm.

Input parameters:

- `concept_id` (string, required): The `id` of a concept whose `concept_type` is CodeList.
- `lang` (string|null): The language matched and served (de|fr|it|en|rm); default de.
- `limit` (integer|null): Entries per page, 1–200, default 50.
- `page` (integer|null)
- `query` (string|null): A word of an entry's name, `*` for any characters; absent = every entry. Matched in `lang` only.

### `lindas.describe` (~85 tokens)

Show everything the holding says about one IRI (a cube, an observation, a Kanton): use to follow an address you were handed. norm.

Input parameters:

- `iri` (string, required): Any IRI — the store is asked about it; no host is fetched.
- `lang` (string|null)
- `limit` (integer|null)
- `offset` (integer|null)

### `lindas.describe_cube` (~96 tokens)

Show a cube's declared dimensions and profile — the record may carry more: use to learn the filters a question needs. hint.

Input parameters:

- `cube` (string, required): A cube IRI of the served scope, e.g. `https://politics.ld.admin.ch/political-rights/popular-vote/1`.
- `lang` (string|null)
- `limit` (integer|null)
- `offset` (integer|null)

### `lindas.dimension_values` (~98 tokens)

List the values one dimension takes (Kantone, Abstimmungstypen, Geschäftsstände): use to filter by IRI instead of by text. hint.

Input parameters:

- `cube` (string, required)
- `dimension` (string, required): The dimension IRI as `lindas.describe_cube` served it — never built by appending to the cube IRI.
- `lang` (string|null)
- `limit` (integer|null)

### `lindas.find_cube` (~90 tokens)

Find the cube behind a question by a word of its name («Volksinitiative», «Petition», «Parteienregister»): use before reading rows. hint.

Input parameters:

- `lang` (string|null)
- `limit` (integer|null)
- `query` (string, required): A word of the cube's name, 2–100 characters («Abstimmung», «Interessenbindung»).

### `lindas.list_cubes` (~140 tokens)

List the 44 political data cubes of the Confederation (Abstimmungen, Wahlen, Bundesrat, Interessenbindungen): use to see what data exists. norm.

Input parameters:

- `family` (string|null): One of `fc`, `fch/apg`, `national-council-election`, `political-rights`; absent = all 44.
- `lang` (string|null): Label language (de|fr|it|en|rm); default de. The answer names the language it served, and «und» where a name carries no tag.
- `limit` (integer|null)
- `offset` (integer|null)

### `lindas.list_versions` (~73 tokens)

List the versions of a cube family (Nationalratswahl 2019/2023/2027): use before reading a year; nothing links old to new. norm.

Input parameters:

- `cube` (string, required): Any version of the family, e.g. `…/national-council-election/candidates/2019`.

### `lindas.observations` (~263 tokens)

Read a cube's rows with filters (Abstimmung, Referendum, Volksinitiative, Ständemehr, Kanton, Datum): use for the figures themselves. norm.

Input parameters:

- `cube` (string, required)
- `dimensions` (array|null): The dimension IRIs to project — the cells a row comes back with. Absent = every cell the row carries, which is up to 51 in the vote cube; naming the three or four a question needs is one call instead…
- `filters` (array|null): Filters, one per entry: the object `{dimension, value}` — `{"dimension": "https://politics.ld.admin.ch/political-rights/popular-vote/date", "value": "1971-02-07"}` — or, equally accepted, the string…
- `lang` (string|null)
- `limit` (integer|null)
- `offset` (integer|null)

### `lindas.resolve_label` (~74 tokens)

Resolve an IRI to its label in one language with a fallback (Kanton, Partei, Gremium, Interessenbindung): use to name a value. hint.

Input parameters:

- `iri` (string, required): Any IRI, of any host (canton, country, legal form, gender).
- `lang` (string|null)

### `manifest.get` (~55 tokens)

One entry's manifest by slug. A slug the directory does not hold is a not-found error carrying the E21 admission rule.

Input parameters:

- `slug` (string, required): Entry slug (filename = @id slug, oh-validate-enforced).

### `meta.capabilities` (~29 tokens)

The platform capability register with published per-client coverage — tool names on this server ARE the capability ids.

### `meta.schemas` (~76 tokens)

Stage two of two-stage discovery: the full input schemas of the named tools, byte-identical to what tools/list carries, because both are read from the same router. An unknown id is refused by name rather than silently dropped.

Input parameters:

- `names` (array, required): The capability ids whose input schemas are wanted, as stage one listed them.

### `meta.tools` (~80 tokens)

Stage one of two-stage discovery: every mounted tool with its capability id, domain, one-line summary and budget weight — and NO input schemas. Ask this first to learn what exists, then pull the schemas of the few tools you intend to call (meta.schemas). Context economy as a capability, not a client convention (E16 Ziff. 1).

### `publish.info` (~32 tokens)

The publishing path — the only way into the directory: the three E21/E13 routes plus the honest interim state.

### `standard.artifacts` (~35 tokens)

The manifest standard's sealed artifact register: path, canonical IRI, draft/published status and SHA-256 per contract file.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/swiss-openhelvetia-gateway/mcp#diagnostics

## Score history

- 2026-09-28: 69
- 2026-09-27: 68
- 2026-09-26: 68
- 2026-09-25: 67
- 2026-09-24: 67
- 2026-09-23: 66
- 2026-09-22: 66
- 2026-09-21: 65
- 2026-09-20: 65
- 2026-09-19: 65
- 2026-09-18: 64
- 2026-09-17: 64
- 2026-09-16: 63
- 2026-09-15: 63
- 2026-09-14: 62
- 2026-09-13: 62
- 2026-09-12: 61
- 2026-09-11: 61
- 2026-09-10: 60
- 2026-09-09: 60
- 2026-09-08: 59
- 2026-09-07: 59
- 2026-09-06: 59
- 2026-09-05: 58

## Common questions

### What is the OpenHelvetia Gateway MCP server?

OpenHelvetia Gateway is an MCP server listed in the public MCP registry as swiss.openhelvetia/gateway. Swiss federal law (Fedlex) and political data (LINDAS) for agents, every answer with sources. This page covers its hosted endpoint (https://mcp.openhelvetia.swiss/mcp).

### Is the OpenHelvetia Gateway MCP server safe to use?

OpenHelvetia Gateway scores 69 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the OpenHelvetia Gateway MCP server expose?

OpenHelvetia Gateway exposes 65 tools: directory.get, facts.badge, facts.latest, fedlex.check_in_force, fedlex.check_quote, and 60 more. Their descriptions and schemas cost roughly 6,678 tokens of context every time the server is loaded.

### Does the OpenHelvetia Gateway MCP server require authentication?

No. We connected to OpenHelvetia Gateway without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the OpenHelvetia Gateway MCP server still maintained?

OpenHelvetia Gateway is still listed as active in the MCP registry. We last reached this channel on 28 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.openhelvetia.swiss/mcp
- Website: https://openhelvetia.swiss/
- Changelog RSS feed: https://verifymcp.io/servers/swiss-openhelvetia-gateway/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/swiss-openhelvetia-gateway/mcp.json
- HTML version of this page: https://verifymcp.io/servers/swiss-openhelvetia-gateway/mcp
