Zefix commercial register and UID lookup
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
π¨π Part of the Swiss Public Data MCP Portfolio
MCP Server for the Swiss Federal Commercial Register (Zefix/Handelsregister), with a company-UID join to the official gazettes (SHAB + cantonal AmtsblΓ€tter)
register-mcp provides AI-native access to two Swiss federal data sources, joined on the UID, all without authentication:
| Source | Data | API |
|---|---|---|
| Zefix (Handelsregister) | Swiss companies, legal forms, registered-office data | ZefixREST v1 |
| Amtsblattportal | Everything published about a specific company (by its UID): HR mutations, calls to creditors, bankruptcy | amtsblattportal.ch v1 |
The two sources share one key β the UID. The value is in the join: Zefix tells you whether a company exists; the gazette tells you what has been published about it.
The gazette access here is deliberately company-scoped only β keyed on a company UID or a specific publication id. There is no free-text / person-name gazette search in this server; that would be a profiling tool over the gazette's person-data rubrics (bankruptcy, debt-collection, inheritance). Broad Amtsblatt platform search (procurement, cantonal notices, full-text) is proposed as a separate amtsblatt-mcp β see docs/amtsblatt-mcp-proposal.md and the Data Protection & Scope section below.
Designed for Swiss public administration use cases: vendor verification, contract partner due diligence, and supplier onboarding β all via natural language queries.
Anchor demo query: "Before we sign a framework agreement with Lehrmittelverlag ZΓΌrich AG: is the company active in the commercial register, what is its UID and stated purpose β and, via that UID, what has the official gazette published about it (HR mutations, calls to creditors, any bankruptcy)?"
That single question walks the whole tool chain across both sources:
gazette_company_publications β the UID join: everything published about a companyzefix_verify_company β quick active/dissolved status checkprovenanceOr with uvx (no permanent installation):
When running with MCP_TRANSPORT=sse, the server enforces:
Bearer-token auth β set MCP_API_KEY to a secret string. Clients must send
Authorization: Bearer <key> on every request. Missing or wrong β HTTP 401.
The server refuses to start without MCP_API_KEY set.
Rate limiting β sliding window per bearer-token hash. Defaults: 60 req / 60 s.
Tunable via MCP_RATE_LIMIT and MCP_RATE_WINDOW. Exceeding the limit returns
HTTP 429 with Retry-After.
Structured JSON logging β every tool call emits one line to stderr with
tool, status, latency_ms. Auth failures and rate-limit events are logged
at WARNING level. Configure verbosity with LOG_LEVEL (default INFO).
Reference-data cache β Zefix legal-forms are cached for 24h
(LEGAL_FORMS_TTL seconds) to avoid an extra upstream call per tool invocation.
Egress allow-list β outbound HTTP is restricted to www.zefix.admin.ch
and amtsblattportal.ch via an httpx request hook that also fires on
redirects. A Location header pointing elsewhere raises EgressDenied and is
never followed. Override with MCP_ALLOWED_HOSTS=host1,host2 (comma-separated,
lower-case).
β οΈ Upgrade note (0.2.x β 0.3.0):
amtsblattportal.chwas added to the default allow-list when the gazette tools shipped. If your deployment pinsMCP_ALLOWED_HOSTS, that value overrides the default entirely β addamtsblattportal.chto it, or everygazette_*call will raiseEgressDenied.
Optional OpenTelemetry tracing β install with pip install register-mcp[otel]
and set OTEL_EXPORTER_OTLP_ENDPOINT (e.g. http://otel-collector:4318/v1/traces).
Without the extra or without the env var the server stays silent β no hard
dependency on the OTel SDK.
For multi-instance deployments, place a real gateway (Cloudflare, Railway internal networking, an API-Gateway with Redis-backed rate limiting) in front of the in-memory limiter, which is per-process by design.
A minimal multi-stage Dockerfile ships with the repo. The image runs as a
non-root mcp user; dependencies are resolved from uv.lock (uv sync --frozen), so the build is reproducible.
For local iteration there is a compose.yaml with read_only, cap_drop: ALL
and no-new-privileges:
See SECURITY.md for hardening notes (egress restriction, key rotation, SIEM forwarding).
Try it immediately in Claude Desktop:
"Is Lehrmittelverlag ZΓΌrich AG active in the commercial register?" "Look up the company with UID CHE-108.954.978" "List all Swiss legal forms"
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Or with uvx:
Config file locations:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonFor use via claude.ai in the browser (e.g. on managed workstations without local software):
Render.com (recommended):
python -m register_mcp.server --http --port 8000https://your-app.onrender.com/sseπ‘ "stdio for the developer laptop, SSE for the browser."
Zefix β commercial register (6):
| Tool | Description |
|---|---|
zefix_search_companies | Search companies by name, canton, legal form |
zefix_get_company | Full company profile by internal EHRAID |
zefix_get_company_by_uid | Company lookup by UID (CHE-xxx.xxx.xxx) |
zefix_verify_company | Quick active/dissolved status check |
zefix_list_legal_forms | All Swiss legal forms with IDs |
zefix_list_municipalities | Swiss municipalities with BFS IDs |
Amtsblattportal β the company-scoped gazette join (3):
| Tool | Description |
|---|---|
gazette_company_publications | The UID join. All gazette publications for a company UID, newest first, optional (validated) rubric/time filters |
gazette_get_publication | Single publication incl. XML full text, defensively parsed (by publication id) |
gazette_source_status | Reachability of both sources + cache ages (rubrics, legal forms) |
The prefix is gazette_, not shab_, because the source covers SHAB and the cantonal gazettes. Every entry point is UID- or id-scoped β see Data Protection & Scope. Broad, non-company gazette search (procurement, cantonal full-text) is scoped to the separate amtsblatt-mcp.
| Query | Tool |
|---|---|
| "Is Lehrmittelverlag ZΓΌrich AG active?" | zefix_verify_company |
| "Look up CHE-108.954.978" | zefix_get_company_by_uid |
| "Find companies named Migros in canton ZH" | zefix_search_companies |
| "What has been published about CHE-116.115.052?" | gazette_company_publications |
| "Show the full official text of that HR deletion notice" | gazette_get_publication |
| "Are both data sources reachable right now?" | gazette_source_status |
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/register-mcp)<a href="https://allmcps.com/mcp/register-mcp"><img src="https://allmcps.com/api/badge/register-mcp?style=directory" alt="Register MCP on AllMCPs" /></a>