# OpenHelvetia Gateway

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

- name: swiss.openhelvetia/gateway
- version: 0.1.0
- connection class: R0 (autonomous)
- trust: 79/100 flags: no-repository
- quality: 86/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/swiss.openhelvetia%2Fgateway
- tools: https://api.protogrid.dev/v1/servers/swiss.openhelvetia%2Fgateway/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

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


## Trust

- hygiene: 80
- liveness: 99
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-97% ~updated-46d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 86/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 65 of 65 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: fedlex.resolve_sr (destructiveHint, idempotentHint, openWorldHint); fedlex.check_in_force (destructiveHint, idempotentHint, openWorldHint); fedlex.cite (destructiveHint, idempotentHint, openWorldHint); …
- warn `tools.token_cost`: about 9,660 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 3 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 65, about 9,660 tokens to load them all
- tool set hash: 9c1170f302d595ca59f7ee0e08b062de
- tools last changed: 2026-09-26T19:51:02.177Z
- badge: [![protogrid quality](https://protogrid.dev/badge/swiss.openhelvetia/gateway.svg)](https://protogrid.dev/servers/swiss.openhelvetia/gateway)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-09-26 `manifest.get` changed (description)
  - before: One entry's manifest by slug. While no entries exist the honest answer is a not-found error carrying the E21 admission rule.
  - after: One entry's manifest by slug. A slug the directory does not hold is a not-found error carrying the E21 admission rule.
- 2026-09-26 `lindas.observations` changed (inputSchema)
- 2026-09-26 `lindas.describe_cube` changed (description)
  - before: Show a cube's declared dimensions and profile — the record may carry more: use to learn the filters a question needs. norm.
  - after: Show a cube's declared dimensions and profile — the record may carry more: use to learn the filters a question needs. hint.

Full history: https://api.protogrid.dev/v1/servers/swiss.openhelvetia%2Fgateway/changes

## Remotes

- https://mcp.openhelvetia.swiss/mcp (streamable-http, auth none, reachable true, uptime30d 0.9661017)

## Packages

_none_

## Tools (65)

- `directory.get`: 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`: shields.io endpoint JSON for one subject, derived from the fact table — «no facts» in grey when nothing is recorded, never rounded up.
- `facts.latest`: 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.
- `fedlex.check_in_force`: 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.
- `fedlex.check_quote`: 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.
- `fedlex.cite`: 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.
- `fedlex.compare_versions`: 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.
- `fedlex.detect_foreign_content`: Detect what the text tools hide in a Fassung: sections in another language (xml:lang) and <foreign> islands (formulas, graphics): use before quoting. norm.
- `fedlex.explore_node`: 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.
- `fedlex.extract_tables`: 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.
- `fedlex.find_related_topic`: Find acts in the same field of law via the legal taxonomy, by ELI or SR: use to discover neighbouring Erlasse; candidates only. hint.
- `fedlex.find_treaties`: Find treaty processes (Staatsverträge) by a title word, partner country IRI or bilaterality: use to locate a treaty before get_treaty_info. hint.
- `fedlex.get_article_history`: Trace which amendments and consolidations changed one Artikel (eId) of an act, with dates: use for «seit wann gilt Art. X so?». norm.
- `fedlex.get_citations`: 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.
- `fedlex.get_consultation_documents`: List the position statements and result reports of one consultation IRI: use after get_consultations to read the genesis record. norm.
- `fedlex.get_consultations`: 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.
- `fedlex.get_drafts`: 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.
- `fedlex.get_fga_documents`: 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.
- `fedlex.get_law_metadata`: 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.
- `fedlex.get_memorial`: 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.
- `fedlex.get_modifications`: 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.
- `fedlex.get_oc_act`: 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.
- `fedlex.get_references`: List the references (Verweise) an act's text makes, with ELI where linked, optionally within one eId: use to follow cross-references. hint.
- `fedlex.get_structure`: Outline one consolidation (sections, articles with eId, num and heading): use when you know the act but not the article number. norm.
- `fedlex.get_subdivisions`: 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.
- `fedlex.get_taxonomy`: Classify an act in the systematic collection (SR branch chain, notation, labels de/fr/it): use for «zu welchem Rechtsgebiet gehört X?». norm.
- `fedlex.get_treaty_info`: Read a treaty process profile (title, signature, bilateral, partner countries, approving decree) for an eli/treaty IRI: use after find_treaties. norm.
- `fedlex.list_annexes`: List the annexes (Anhänge) of a consolidation with titles and path eIds (annex_u1/…): use before reading an Anhang with read_article. norm.
- `fedlex.list_expressions`: List the language versions and manifestations (XML, PDF) of one consolidation: use before reading to see whether a Fassung is PDF-only. norm.
- `fedlex.list_versions`: List every dated consolidation (Fassung) of an act, future ones included: use to pick the eli_version the reading tools need. norm.
- `fedlex.parse_reference`: 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.
- `fedlex.read_article`: 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.
- `fedlex.read_document`: Read a whole small act or Verordnung as capped Markdown (truncated flag, continuation offset): use for short acts; quote via read_article. norm.
- `fedlex.resolve_consolidation_at`: Resolve which consolidation (Fassung) of an act governed on an ISO date: use before reading text for a past or future Stichtag. norm.
- `fedlex.resolve_sr`: 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.
- `fedlex.resolve_vocabulary_label`: Look up a Fedlex vocabulary term (enforcement-status, language, …) by label or IRI: use to decode a coded value from another answer. hint.
- `fedlex.search_law`: 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.
- `fedlex.search_text`: Find where a word occurs inside ONE consolidation (hits with eId and Artikel): use before read_article when the article is unknown. hint.
- `i14y.api_status`: 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`: Show one concept's record — type, value type, version, validity (Konzept, Codeliste): use before reading a code list's entries. norm.
- `i14y.get_data_service`: Show one registered interface's record — endpoints, OpenAPI links, licence, served datasets (API, Endpunkt): use to reach the service. norm.
- `i14y.get_dataset`: Show one dataset's full record — contact, coverage, every distribution with its licence and download address (Lizenz, Download): use before reuse. norm.
- `i14y.get_dataset_distributions`: List a dataset's distributions — format, licence, download and access address (Datei, Lizenz, Format): use for «where do I get the data». norm.
- `i14y.list_catalogs`: List the catalogues that feed I14Y, each one body's collection (Katalog, opendata.swiss, Bundesamt): use to see who contributes. norm.
- `i14y.list_concepts`: List the harmonised concepts and code lists of the administration (Konzept, Codeliste, Nomenklatur, Merkmal): use to find a code list by publisher. norm.
- `i14y.list_data_services`: List the registered machine interfaces of Swiss public bodies with their endpoints (API, Schnittstelle, Datendienst): use before building a scraper. norm.
- `i14y.list_datasets`: 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.
- `i14y.list_public_services`: List the registered public services with their channels (Behördenleistung, Dienstleistung, Verwaltung): use for what an authority offers citizens. norm.
- `i14y.list_publishers`: 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.
- `i14y.search_catalog`: Search the national data catalogue I14Y by words (Datensatz, Schnittstelle, API, Behördenleistung, Codeliste): use first, to find who publishes what. hint.
- `i14y.search_codelist_entries`: List the codes of one code-list concept, paged, with names and validity (Code, Codeliste, Kanton, Geschlecht, Nomenklatur): use to resolve official codes. norm.
- `lindas.describe`: Show everything the holding says about one IRI (a cube, an observation, a Kanton): use to follow an address you were handed. norm.
- `lindas.describe_cube`: Show a cube's declared dimensions and profile — the record may carry more: use to learn the filters a question needs. hint.
- `lindas.dimension_values`: List the values one dimension takes (Kantone, Abstimmungstypen, Geschäftsstände): use to filter by IRI instead of by text. hint.
- `lindas.find_cube`: Find the cube behind a question by a word of its name («Volksinitiative», «Petition», «Parteienregister»): use before reading rows. hint.
- `lindas.list_cubes`: List the 44 political data cubes of the Confederation (Abstimmungen, Wahlen, Bundesrat, Interessenbindungen): use to see what data exists. norm.
- `lindas.list_versions`: List the versions of a cube family (Nationalratswahl 2019/2023/2027): use before reading a year; nothing links old to new. norm.
- `lindas.observations`: Read a cube's rows with filters (Abstimmung, Referendum, Volksinitiative, Ständemehr, Kanton, Datum): use for the figures themselves. norm.
- `lindas.resolve_label`: Resolve an IRI to its label in one language with a fallback (Kanton, Partei, Gremium, Interessenbindung): use to name a value. hint.
- `manifest.get`: One entry's manifest by slug. A slug the directory does not hold is a not-found error carrying the E21 admission rule.
- `meta.capabilities`: The platform capability register with published per-client coverage — tool names on this server ARE the capability ids.
- `meta.schemas`: 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.
- `meta.tools`: 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`: The publishing path — the only way into the directory: the three E21/E13 routes plus the honest interim state.
- `standard.artifacts`: The manifest standard's sealed artifact register: path, canonical IRI, draft/published status and SHA-256 per contract file.
