
Register Mcp
io.github.malkreide由 GitHub 帳號 malkreide 發布v0.7.0更新於 Oct 24, 2026
Zefix commercial register with a company-UID join to amtsblattportal.ch (SHAB + cantonal gazettes)
發布方自己的服務:Register.gy
概覽
讓助理依名稱或 UID 查詢瑞士商業登記公司,並讀取與該 UID 相關的官方公報發布內容。
- 可以做什麼
- 透過以公司 UID 串接的兩個瑞士聯邦資料來源,提供九個唯讀工具。六個 Zefix 工具可依名稱、州或法律形式搜尋公司,依 EHRAID 或 UID 取得公司檔案,檢查存續或註銷狀態,並列出法律形式與市鎮。三個公報工具會傳回某公司 UID 的所有發布內容、依發布 id 取得含 XML 全文的單筆發布,並回報資料來源可達性與快取時間。
- 適用情境
- 適合瑞士公共行政或採購流程中的供應商查核、合約對象盡職調查與供應商導入,讓助理確認公司是否在商業登記冊中,並查看官方公報對其發布的內容,例如登記變更、債權人催告或破產公告。
- 執行需求
- 以 uvx 或 pip 作為本機程序執行;需要 Python 3.11+ 以及 uv 或 pip。預設 stdio 方式不需要 API 金鑰。選用的 HTTP 傳輸需要 MCP_API_KEY,未設定則拒絕啟動;用戶端接著送出 Authorization: Bearer。需要連線 www.zefix.admin.ch 與 amtsblattportal.ch,對外允許清單可用 MCP_ALLOWED_HOSTS 覆寫。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Register Mcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
🇨🇭 Part of the Swiss Public Data MCP Portfolio
register-mcp
[Version] [License: MIT] [Python 3.11+] [MCP] [No Auth Required] [CI]
MCP Server for the Swiss Federal Commercial Register (Zefix/Handelsregister), with a company-UID join to the official gazettes (SHAB + cantonal Amtsblätter)
Overview
register-mcp provides AI-native access to two Swiss federal data sources, joined on the UID, all without authentication:
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:
Features
- 🏛️ 9 tools across two sources — company search & verification (Zefix) + the company-scoped gazette join (SHAB/cantonal)
- 🔗
gazette_company_publications— the UID join: everything published about a company - 🛡️ Data-protection-safe by construction — the only gazette entry points are UID- or id-scoped; no person-name search entry exists (see Data Protection & Scope)
- 🔍
zefix_verify_company— quick active/dissolved status check - 🌐 Bilingual output (Markdown / JSON) with per-source attribution +
provenance - 🔓 No API key required — open data from zefix.admin.ch and amtsblattportal.ch
- ☁️ Transports — stdio (Claude Desktop) + Streamable HTTP at
/mcp(cloud, native MCP spec2026-07-28); SSE kept for existing deployments
Prerequisites
- Python 3.11+
- uv (recommended) or pip
Installation
Or with uvx (no permanent installation):
Quickstart
HTTP / Cloud Deployment
Two HTTP transports are available:
streamable-http runs stateless with JSON responses: no Mcp-Session-Id, no
session held in a single process, so a second instance needs no sticky
sessions.
⚠️ Upgrade note (0.7.0): the container image and
compose.yamlnow default tostreamable-http. Clients configured with…/ssemust switch to…/mcp, or the deployment setsMCP_TRANSPORT=sseexplicitly.
With either HTTP transport, the server enforces:
-
Bearer-token auth — set
MCP_API_KEYto a secret string. Clients must sendAuthorization: Bearer <key>on every request. Missing or wrong → HTTP 401. The server refuses to start withoutMCP_API_KEYset. -
Rate limiting — sliding window per bearer-token hash. Defaults: 60 req / 60 s. Tunable via
MCP_RATE_LIMITandMCP_RATE_WINDOW. Exceeding the limit returns HTTP 429 withRetry-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 withLOG_LEVEL(defaultINFO). -
Reference-data cache — Zefix legal-forms are cached for 24h (
LEGAL_FORMS_TTLseconds) to avoid an extra upstream call per tool invocation. -
Egress allow-list — outbound HTTP is restricted to
www.zefix.admin.chandamtsblattportal.chvia anhttpxrequest hook that also fires on redirects. ALocationheader pointing elsewhere raisesEgressDeniedand is never followed. Override withMCP_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 setOTEL_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.
Container deployment
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"
Configuration
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Or with uvx:
Config file locations:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Cloud Deployment (Streamable HTTP for browser access)
For use via claude.ai in the browser (e.g. on managed workstations without local software):
Render.com (recommended):
- Push/fork the repository to GitHub
- On render.com: New Web Service → connect GitHub repo
- Set start command
python -m register_mcp.serverand the environment variablesMCP_TRANSPORT=streamable-httpandMCP_API_KEY=<secret>(Render providesPORT) - In claude.ai under Settings → MCP Servers, add:
https://your-app.onrender.com/mcp
💡 "stdio for the developer laptop, Streamable HTTP for the browser."
Available Tools
Zefix — commercial register (6):
Amtsblattportal — the company-scoped gazette join (3):
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.
Example Use Cases
Architecture
Data Source Characteristics
The UID join — Zefix ↔ Amtsblatt
The two sources share exactly one key: the UID (CHE-XXX.XXX.XXX). That is
what turns them from two data sets into one workflow.
Two properties of the source shape this path (both verified in
docs/probe-shab.md):
- The bulk list carries no company UID (
meta.uidisnull). The company UID lives only in the single-publication fetch —meta.uidin the single JSON, or<uid>in the XML (which also carries the full text). So the join runs list → per-hit single fetch → match against the Zefix UID. gazette_company_publicationsfilters the corpus byuids=<UID>directly, so in practice you get the company's publications in one call without walking every record.
Procurement lives in the separate amtsblatt-mcp
Public procurement (Submissionen) is not a federal SHAB rubric and is not
covered by this server. It exists only as a cantonal OB-<canton> rubric,
only a few cantons publish it in this portal, and most — including Zürich —
route tenders through simap.ch, a separate platform.
Procurement, cantonal notices, and broad full-text search are scoped to the
proposed amtsblatt-mcp server, which applies
a fail-closed green-rubric allow-list. See that proposal for the full
OB-* coverage map and the rubric traffic-light table.
SB≠ Submissionen.SBis Schuldbetreibungen (debt collection), a person-data-heavy rubric this server never exposes as a search entry.
Data Protection & Scope
This section is not a footnote — it is the reason the server is shaped the way it is.
The Amtsblattportal systematically publishes rubrics containing personal data of
natural persons: bankruptcies (KK), debt-collection (SB), calls to
creditors (LS/SR), inheritance/estate calls (ES, TE-*), and building
applications with owner names. Those publications are public — but making them
systematically queryable by name through an AI agent is a repurposing the
publication never intended, and under the revised Swiss Federal Act on Data
Protection (revDSG) a "show me every debt-collection entry for person X" tool
is a profiling instrument. Deliberate design choices follow:
- No person-based search entry. No tool takes a natural person's name, birth
date or address. The only gazette entry points are keyed on a company UID
(
gazette_company_publications) or an opaque publication id (gazette_get_publication). A firm's own bankruptcy is returned via its UID — that is corporate data about a legal person, not name-based profiling. - No free-text gazette search here.
keywordandcantonsare not even on the internal query-parameter allow-list, so no future code change can smuggle a corpus-wide keyword search in. Broad search lives inamtsblatt-mcpbehind a fail-closed green allow-list (procurement, HR, official notices only). - No persistence of publication content. The server is a pass-through; only the rubric taxonomy and Zefix legal-forms list are cached in memory (24 h). Official publications carry statutory deletion periods — a store that outlived them would actively undermine those periods.
- Fail closed. Rubric codes are validated against the live taxonomy before any call; an unknown code is refused, not silently widened.
The broad-platform counterpart, its green/yellow/red rubric classification and
its fail-closed design are specified in
docs/amtsblatt-mcp-proposal.md.
Architecture decision
ARCH A — live-API-only, consistent with the existing Zefix integration (decided 2026-07-18).
The Amtsblattportal is queried live on every call. All endpoints respond in
0.2–2.0 s, and the use case — targeted company and topic research — does not
need a local bulk copy. A bulk dump would mean mirroring 2.79M records, with an
ongoing sync burden and staleness risk, for no benefit to the join-on-UID
workflow. The taxonomy (/rubrics) and the Zefix legal-forms list are the only
data cached, each for 24h in memory, because they change at most a few times a
year and every filtered call needs them.
Phased Implementation
Phase 2 will add: signatory details, share capital, full historical entries. Phase 3 will add: MwSt status, NOGA industry codes, cross-register validation.
Project Structure
Known Limitations
- Search by canton without a name filter may return API errors (Zefix API limitation)
- Phase 1 Zefix API may be rate-limited under heavy load; retry after a short delay
- ZefixPublicREST (new API) requires registration: email [email protected]
Amtsblattportal — verified behaviour (live-checked 2026-07-18)
Free-text (
keyword) and broadcantonssearch are not performed by this server — those probe results live indocs/probe-shab.mdand inform the separateamtsblatt-mcp.
Zefix — verified behaviour (live-checked 2026-08-15)
Found by the weekly live suite, not by the unit tests — which stayed green throughout.
Three shapes, one shipped bug each:
- No hits answer with HTTP 404, carrying the NORESULT envelope. Every call
therefore goes through
_zefix_post_search; a rawraise_for_status()makes the friendly branch unreachable. That is howzefix_verify_companyshipped answering "Eintrag nicht gefunden. Bitte EHRAID oder UID prüfen" to a name search, where neither an EHRAID nor a UID was in play. A fixture that puts the NORESULT body into a 200 makes exactly that dead branch look green. - A hit list is not an answer. UID lookup searches the name field with
searchType: CONTAINS, soCHE-999.999.999returns a real company under a UID that is not its own. Defence: exact digit match or nothing — nofirms[0]fallback. The former fallback produced a complete, plausible, formatted record about somebody else, indistinguishable from a correct answer. - Without
activeOnly: false, "dissolved" looks like "never existed". Zefix returns only active entries by default;zefix_verify_companysets the flag deliberately. A firm with no UID comes back as a string of blanks (uid: " ",uidFormatted: null), not asnull.
Three quirks are defended in code (details in the CHANGELOG under Known findings):
- Quirk 1 — Silent Ignore (critical). Unknown query parameters are dropped
silently and return the full 2.79M corpus with HTTP 200. Defence: query
strings are built exclusively from an
ALLOWED_GAZETTE_PARAMSallow-list, and every filtered response is plausibility-checked — atotalabove 2,000,000 is rejected as "filter ignored by upstream — result not trustworthy". - Quirk 2 — Silent Empty. An invalid rubric code returns HTTP 200 with an
empty result. Defence: the
/rubricstaxonomy is cached 24h and every code is validated before any call, failing with the five closest valid codes. - Quirk 3 — Two-step fetch. The JSON list carries only
meta; the content lives only in the per-rubric namespaced XML. Defence: namespace-agnostic defensive parsing (meta+publicationTextmandatory, HRcompanywhen present, everything else inadditional_fields).
Safety & Limits
Rate Limits
Data Privacy
- Read-only access — all tools carry
readOnlyHint: True; the server performs no write, delete, or mutation operations against any API - No person-based search entry — no tool accepts a natural person's name, birth date or address; gazette access is UID- or publication-id-scoped only (see Data Protection & Scope). This is a deliberate revDSG-driven design choice, not an accident of the API
- No persistence of publication content — the server is a stateless pass-through; only the rubric taxonomy and Zefix legal-forms list are cached in memory (24 h), never publication bodies, so statutory deletion periods are respected
- Public register data only — the Zefix Handelsregister is a public federal register (HRegV); gazette data returned is likewise legally public, retrieved per company UID
- No personal tracking — the server does not transmit user identity, query history, or session data to the upstream sources
Terms of Service & Data Sources
- Zefix API ToS: Usage of the Zefix REST API is governed by the zefix.admin.ch terms of use. The data is published under the Open Government Data (OGD) Switzerland principles.
- SHAB: Swiss Official Gazette of Commerce — published by the Federal Chancellery (BK). Public by law.
- Institutional use: This server is designed for read-only queries in public administration workflows. Not suitable for mass harvesting or automated surveillance use cases.
Security
- No credentials are stored or transmitted (Phase 1)
- Phase 2 credentials (
ZEFIX_USER,ZEFIX_PASSWORD) are passed via environment variables only — never hardcoded - All HTTP calls use HTTPS exclusively
- Tool inputs are validated via Pydantic v2 before any API call is made
Demo
📽️ Terminal GIF coming soon — see
docs/demo/to generate it locally with vhs
Example interaction:
→ More use cases by audience →
To generate the demo GIF locally:
MCP Protocol Version
This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.
Both revisions are pinned in
tests/test_protocol_version.py and asserted
against the installed SDK, so a Dependabot bump of mcp cannot move either one
silently. tests/test_streamable_http.py
measures both on the wire: it sends server/discover, tools/list and
tools/call as 2026-07-28 requests and an initialize asking for a future
revision through the app main() serves, and reads the responses. The CI
docker job sends the same tools/list to the running image.
Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern
era, not for the handshake era — pinning against it alone would leave the era
that current clients actually negotiate free to drift.
Update policy. When the gate fails, do not edit the constant blindly: read
the spec changelog between the two revisions, verify the server still behaves,
then move the constant, this section, README.de.md and
CHANGELOG.md together.
Testing
The unit-test payloads are recorded, not invented. Source, retrieval date,
selection rule, redaction and SHA-256 per file are in
tests/fixtures/PROVENANCE.md.
Two things are stated there rather than papered over. Personal data: the
gazette carries debt-collection notices and Zefix carries the full SHAB text
naming registered persons with their place of residence — the recorded payloads
keep the shape and redact those values, with the complete list of redacted
fields alongside. Zefix needs no credentials: until 2026-08-08 this
repository recorded no Zefix fixtures because the recording script measured
HTTP 401. The measurement was right about the wrong address — the script asked
ZefixPublicREST, while the server speaks to ZefixREST, which answers with no
authentication at all.
The live suite
ci.yml runs -m "not live": a foreign 503 must not redden a stranger's pull
request, because a suite that does gets switched off, and a switched-off suite
checks nothing. The exclusion has a safety net —
.github/workflows/live-tests.yml runs
weekly (cron: "31 5 * * 1") plus workflow_dispatch.
The verdict is read from the JUnit XML rather than the exit code, by
scripts/classify_live_run.py, because a live
run has three answers and not two:
tests - skipped == 0 is unknown, not clear: pytest exits 0 when every test
was skipped, and a job that books that as green closes an issue on a comparison
that never happened.
One caveat when editing that workflow: the pull-request checks do not cover
it — it has no push or pull_request trigger, so a green PR says nothing about
it. Verify changes with a manual workflow_dispatch run on the branch before
merging.
Changelog
See CHANGELOG.md
Contributing
See CONTRIBUTING.md
Security
See SECURITY.md (Deutsch) for the security posture and how to report a vulnerability.
License
MIT License — see LICENSE
Author
Hayal Oezkan · malkreide
Credits & Related Projects
- Zefix: zefix.admin.ch — Swiss Federal Commercial Register (BJ/FOJ)
- Amtsblattportal: amtsblattportal.ch — SHAB and cantonal gazettes (SECO / Swiss Confederation)
- Protocol: Model Context Protocol — Anthropic / Linux Foundation
- Related: fedlex-mcp — Commercial register ordinance (HRegV)
- Related: zurich-opendata-mcp — Company seat + geodata
- Related: swiss-statistics-mcp — Industry statistics by NOGA
- Related: swiss-snb-mcp — Economic indicators
- Portfolio: Swiss Public Data MCP Portfolio
Installation
Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
來源:README.md,提交 d9b7656
工具
0版本歷史
2- v0.7.0最新Sep 27, 2026
- v0.6.1Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
其他 Register 整合
Register.gy
gy.register官方發布者
一個遠端 MCP 伺服器,用來查詢、註冊與管理 .gy(蓋亞那)網域,並把 AI 打造的網站接上網域,支援預覽與復原。
ONRC trade register
com.foreverworks
跟蹤您在羅馬尼亞貿易登記處的申報,包括相關檔案、費用通知和發票。AI 翻譯

US Federal Register Watch MCP
由 GitHub 帳號 donniertf-hub 發布
遠端 MCP 伺服器,依關鍵字或機關檢索美國聯邦公報中新的法規、擬議規則與公告,並列出開放徵詢意見的截止日期。

UK Visa Sponsor Register MCP
由 GitHub 帳號 donniertf-hub 發布
查詢英國 Home Office 持牌簽證擔保人登記冊:核實雇主、依城鎮或簽證類別列出擔保人,並追蹤名單變動。

Zovo Federal Register Digest
由 GitHub 帳號 theluckystrike 發布
Zovo Federal Register Digest 的託管 MCP 服務;無需登入;Streamable HTTP;2 個工具。