Module · Machine access
MCP-Gateway
The platform's machine door: the same tools over MCP and a JSON shell — 52 capabilities from two domains — with a call budget and typed refusals.
prepared Machine access licence not declared in the crate (corpus: Apache-2.0) no public endpoint
L2.3 · mcp/gateway
Start now
Requirements:
- Rust (stable via rustup) and Git; every command runs from the root of the corpus checkout.
cargo run --locked --manifest-path mcp/gateway/Cargo.toml -- --root . --http 8700 --fedlex-fixtures mcp/servers/fedlex/tests/fixtures --lindas-fixtures mcp/servers/lindas/tests/fixturesExpected: gateway on 127.0.0.1:8700
With the fixture flags both interfaces answer from recorded files, without network. Without them the gateway asks the federal public endpoints.
Download
- Source
- not yet The source becomes public with the publication lane; the repository is not yet switched public. · mcp/gateway
- Release
- not yet No tagged release yet; the first follows the publication lane.
- Container image
- not yet No container image published yet.
- Crate
- not applicable — the module is not a library crate
Dependencies
- Needs
- fedlex-Engine prepared · Politikdaten-Engine prepared · API-Spine prepared
- Needed by
- A2A-Agent prepared
- Documentation
- the page in the documentation
State and evidence
prepared — built and tested, not publicly served.
Every piece of evidence carries its source. Values marked «recounted» are counted from the source at every build; if the figure differs, the build fails.
| Measure | Value | Source |
|---|---|---|
| Capabilities in the inventory | 52 52, aufgeteilt auf 8 Domänen: 35 fedlex, 8 lindas, 3 meta, 2 facts, je 1 directory, manifest, publish, standard recounted: jq 'getpath([]) | length' mcp/gateway/tool-inventory.json |
mcp/gateway/tool-inventory.json |
| Tests | 48, none of them skipped (5 in lib, 14 e2e, 14 http_shell, 6 inventory, 3 policy, 6 resource) | mcp/gateway |
| What holds the inventory from drifting | Three surfaces, one source: the tool router, the committed tool-inventory.json and the API spine's REST endpoint must be identical — as a test and again as a diff in the check gate | mcp/gateway |
| What the budget does | A hard weighted cap per session (--budget n): a local register read weighs 1, every call into a mounted domain (fedlex.*, lindas.*) weighs 2; it never recovers, and without the flag it is unlimited | mcp/gateway |
| What the rate limit does | A token bucket per client, in the same weight units: 60 per minute by default with a burst of 20 (never below 2, or no domain call would get through); it recovers on its own, the refusal names retry_after_ms, and the counters live in process memory only | mcp/gateway |
| Public endpoint | Not served. The identifier mcp.openhelvetia.swiss/mcp is in the code; the two own entries have been in the register since 02.09.2026 and carry the verification state «never checked» until the endpoint answers | mcp/gateway |
What is missing
- until in operation: The public endpoint is missing: the streamable-HTTP door exists in the code, but there is no zone, no route and no deployment — and the daily liveness probe as well as the publication of both prepared entries hang on exactly that. Budget and rate counters live in process memory only, no authorization server exists for the declared RFC 9728 chain, and the orchestrator whose first step two-stage discovery is has not been built.
Documentation
- MCP-Gateway in the documentation: what it does, run, test, call
- Run it yourself · Test · Call