关于 registry-mcp — national company registries
registry-mcp 是面向 AI Agent 等客户端的 MCP 服务和 REST API,可查询英国、挪威和瑞典的公司登记信息。它以统一 JSON 格式返回数据,并提供申报期限依据及缓存新鲜度信息。
主要功能
- 01按国家标识符查询公司
- 02搜索支持的登记机构
- 03提供申报期限及其依据
- 04无需联网验证标识符
- 05返回缓存与更新时间
适用场景
- 01查看公司的登记记录
- 02检查即将到期的法定申报日期
- 03验证并规范化公司标识符
MCP 相关
向 MCP 客户端提供五个登记工具、两个 ChatGPT 连接器别名、登记规则资源和 explain_company 提示词。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://api.foretak.dev/mcpclaude mcp add --transport http foretak-registry https://api.foretak.dev/mcp{"mcpServers":{"foretak-registry":{"type":"http","url":"https://api.foretak.dev/mcp"}}}在 Cursor 中打开{"servers":{"foretak-registry":{"type":"http","url":"https://api.foretak.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"foretak-registry":{"type":"http","url":"https://api.foretak.dev/mcp"}}}{"mcpServers":{"foretak-registry":{"serverUrl":"https://api.foretak.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
7| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string | 是 | 公司的国家/地区标识符会自动规范化 — 挪威 organisasjonsnummer(orgnr)、Companies House 公司编号(CRN),或瑞典 organisationsnummer 或 personnummer。接受空格、句点、连字符、NO...MVA 后缀以及较短的 CRN;各国家/地区的准确格式请参阅 list_countries。 |
| country | string | 否 | ISO-3166-1 alpha-2 — NO 挪威、GB 英国、SE 瑞典。此处 UK 不是国家/地区代码,会被拒绝。请调用 list_countries 获取当前支持的国家/地区。 |
| include | array | 否 | 与基础报告一同获取的附件名称;默认为空,此时恰好只需一次上游请求。每项附件都是独立的第二次获取,附加在对应名称下并带有自己的来源信息;除非请求,否则为 null。此参数会解释七项附件各自的内容。'filings'(所有国家/地区):实体提交了什么以及何时提交 — Companies House 提供完整申报历史,Bolagsverket 提供已提交的年度报告,Regnskapsregisteret 提供已提交的年度账目;区块的 notes 会说明具体内容,total_count 表示登记簿中还保存了多少条。'charges'(GB):登记的抵押和其他担保权益,采用登记簿自己的表述。'insolvency'(GB):清盘和管理程序 — 成员自愿清算是*有偿付能力*的清盘,因此 is_liquidation: true 本身并不能证明存在财务困境。'financials'(NO 和 SE):登记簿记录的最近一个已提交会计期间数据 — 营业额、经营业绩、利润、资产负债表、权益、负债,每项数据均附货币单位,绝不提供比率或结论。挪威数据来自 'filings' 获取结果,瑞典数据来自实体自行提交的 K2 年度报告。已存在的区块中某个数值为 null,表示公司未申报该项目;区块缺失则表示你未请求、获取失败,或 — 在瑞典 — 公司尚未提交数字年度报告;notes 会说明具体情况。英国不公布此类数据,因此 GB 的 'financials' 会返回 bad_request,而不是空区块。'lei'(所有国家/地区,瑞典除外,因为其标识符可能属于自然人):由全球法人识别编码基金会 GLEIF 发布的 Legal Entity Identifier;CC0 且无需密钥。已存在区块中的 lei: null 表示 GLEIF 未持有该信息。'parents'(与 'lei' 支持相同的国家/地区):来自 GLEIF Level 2 数据的直接和最终母公司 — 即将该实体账目并入集团账目的实体,不一定是其多数股权股东。若 GLEIF 未披露,则对应一侧会带有实体自身声明的原因,采用诸如 'NATURAL_PERSONS' 这样的类别词 — 绝不是名称,且未经核实。'peppol'(挪威):通过 Peppol 网络能否向该实体发送电子发票;实时读取 SML/SMP 查询流程,方式与 ELMA 的解析相同,早于 2027 年 1 月 1 日 EHF(Peppol BIS Billing 3.0)义务。registered: null 表示没有权威答复 — 绝不能将其解读为“否”;只有 NXDOMAIN 或 SMP 404 才会得到 false。请先通过 list_countries 查看各国的 supported_includes:若请求该国未公布的项目,会返回指出其支持内容的 bad_request,而不是空结果。 |
详细介绍
registry-mcp — 企业登记 MCP
为 AI Agent 提供各国企业数据。 一个 MCP 服务和 REST API,目前支持三个国家的登记机构:英国的 Companies House,按企业编号查询;挪威的 Enhetsregisteret / Brønnøysundregistrene(brreg),按组织编号(orgnr)查询;以及瑞典的 Bolagsverket,按组织编号查询——无论查询哪个国家,返回的 JSON 结构都相同。
claude mcp add registry-mcp --transport http https://api.foretak.dev/mcp?src=readme
无需安装,通过 stdio 使用:
claude mcp add registry-mcp -- uvx registry-mcp
值得占用一个工具名额的理由:
- 截止日期会注明规则依据,而不只是日期。
company_deadlines会提供下一个申报日期,并在applies_because中说明原因——可能是挪威某种法律形式的法定义务,也可能是“Companies House 为该企业公布的日期”,即登记机构直接提供日期,而非由我们计算。引用原因,而不只是数字。 - 数据最长不超过 24 小时未更新,并明确说明。 每个响应都包含
cached和fetched_at。OpenCorporates 自己的知识库建议用户“允许 30 天”,让更正信息传到其网站——这是该领域现有服务商对自身数据时效差距的说明,差距达 30 倍。 - 七个工具,而非五十个——五个登记查询工具,加两个 ChatGPT 连接器别名。工具选择准确性会在 Agent 上下文中加载的工具超过 30-50 个后开始下降,有些客户端的上限约为 40 个。七个工具大约只占此名额的 17%;同类竞品为完成相同任务提供 23 到 78 个工具。
安全性。 始终只读——这里的任何操作都不会向登记机构或其他地方写入数据。调用方无需提供凭据;此部署自身的上游凭据(COMPANIES_HOUSE_API_KEY)从环境中读取,绝不会被记录或返回。基础查询只会调用三个指定的上游服务,不会调用其他服务:data.brreg.no、api.company-information.service.gov.uk 和 gw.api.bolagsverket.se。include=["lei"]/include=["parents"] 还会调用 api.gleif.org(GLEIF,CC0,无需密钥);include=["peppol"] 还会解析 Peppol SML 中的 DNS 记录,并调用该参与方对应的 SMP 主机;仅当两者均无响应时,才会回退到 Peppol Directory(directory.peppol.eu)——详见上方的附件。除各国登记机构已公开的实体自身信息外,不会处理其他个人数据;由于瑞典个体经营者的企业编号就是其 personnummer,对于标识符可能属于自然人的国家,使用日志不会存储任何标识符(legal/privacy.md)。此服务不进行制裁、PEP 或负面媒体筛查,也不验证银行账户详情。详情请见:SECURITY.md。
其他客户端(Claude Desktop、Cursor、VS Code、Cline、纯 JSON 配置):请参阅 docs/clients.md。
添加到 ChatGPT
ChatGPT 通过自定义连接器连接 MCP 服务,其深度研究模式只会调用两个工具——search 和 fetch。本服务除五个注册表工具外,还提供了这两个工具。在 ChatGPT 中,打开 Settings → Connectors,添加自定义连接器,并输入:
https://api.foretak.dev/mcp?src=readme
无需身份验证、密钥或账户。如果你的 ChatGPT 套餐在 Settings → Connectors 下没有显示自定义连接器,请先启用 Settings → Security and login → Developer mode,然后从 https://chatgpt.com/plugins 添加 URL。
search 接受一个自由文本查询——公司名称、国家标识符,或名称加国家(“Tesco United Kingdom”)——并返回可引用的条目;fetch 接受某条目的 id("NO:923609016"),并返回该公司的注册记录及其法定申报截止日期,两者的完整 JSON 均位于 metadata 中。
添加到 Claude Desktop
Claude Desktop 使用相同 URL 作为自定义连接器:Settings → Connectors → Add custom
connector,然后输入 https://api.foretak.dev/mcp?src=readme。无需密钥。若要改为本地 stdio 安装,请参阅配置。
状态:
0.4.2,已上线——GET /health返回{"version":"0.4.2","countries":["GB","NO","SE"]}。五个注册表工具及其响应格式已冻结;两个连接器别名(search、fetch)将它们封装起来供 ChatGPT 使用,不会引入新格式。托管 APIapi.foretak.dev已上线,并已列入官方 MCP 注册表,名称为io.github.foretak/registry-mcp。国家/地区:英国(Companies House)、挪威(brreg)、瑞典(Bolagsverket)——各国标识符格式及调用示例请参阅下文。
添加到 Claude Code
与上文相同的两个命令——Streamable HTTP 或本地 stdio。若要将其添加为项目级 .mcp.json 文件,而非通过 CLI 添加,请参阅配置。
返回内容
$ curl https://api.foretak.dev/v1/NO/company/923609016
{
"country": "NO", "registry": "brreg",
"id": "923609016", "id_formatted": "923 609 016", "id_scheme": "organisasjonsnummer", "euid": null,
"name": "EQUINOR ASA",
"legal_form_code": "ASA", "legal_form": "Public limited company", "legal_form_local": "Allmennaksjeselskap",
"status": "active", "is_active": true, "registered_at": "1995-03-12",
"vat_registered": true, "vat_number": "NO923609016MVA", "vat_registered_at": "1989-07-01",
"employees": 21239, "share_capital": 5976872600.0, "share_capital_currency": "NOK",
"business_address": {"lines": ["Forusbeen 50"], "postal_code": "4035", "city": "STAVANGER"},
"advertising_protected": null,
"source": "Enhetsregisteret (Brønnøysundregistrene)", "license": "NLOD 2.0"
}
精简版——完整的 CompanyReport 还包含 previous_names、industry_codes、registers、purpose、parent_id、confidence、cached、fetched_at 和 notes。每个字段都在 llms-full.txt §5 中有说明。
euid 是部分成员国登记机构公布的欧盟范围标识符(芬兰会公布;我们目前覆盖的其他国家都不会)——它绝不是 LEI,也绝不是由各部分拼凑而成。advertising_protected 的值为 true、false 或 null:表示登记机构是否将该实体标记为禁止用于直接营销;null 表示登记机构根本没有公布此类标记(目前包括挪威和英国)。如果值为 true(例如瑞典的 reklamspärr),notes 中会有一句话说明;在传递任何联系信息时,都必须一并保留该标记。
英国,结构相同,精简方式也相同:
$ curl https://api.foretak.dev/v1/GB/company/00445790
{
"country": "GB", "registry": "companies-house",
"id": "00445790", "id_formatted": null, "id_scheme": "company number", "euid": null,
"name": "TESCO PLC",
"legal_form_code": "plc", "legal_form": "Public limited company",
"status": "active", "is_active": true, "registered_at": "1947-11-27",
"vat_registered": null, "vat_number": null,
"employees": null, "employees_reported": false,
"registers": {"insolvency": false},
"industry_codes": [{"code": "47110", "description": null, "scheme": "SIC 2007", "rank": 1}],
"business_address": {"lines": ["Tesco House, Shire Park", "Kestrel Way"], "postal_code": "AL7 1GA", "city": "Welwyn Garden City"},
"advertising_protected": null,
"published_deadlines": [
{"kind": "annual_accounts", "due_date": "2027-08-26", "period_end": "2027-02-26", "overdue": false, "source": "accounts.next_accounts.due_on"},
{"kind": "confirmation_statement", "due_date": "2027-07-02", "period_end": "2027-06-18", "overdue": false, "source": "confirmation_statement.next_due"}
],
"source": "Companies House (UK)", "license": "Crown copyright — Companies House public register, free to re-use"
}
published_deadlines 包含登记机构自行公布的日期,并注明每个日期对应的上游字段。挪威和瑞典的值为 [],因为这两个国家的日期都由我们自行计算。
瑞典于 0.3.0 版本加入,这正是“统一结构”开始名副其实的地方:
$ curl https://api.foretak.dev/v1/SE/company/5560160680
{
"country": "SE", "registry": "bolagsverket",
"id": "5560160680", "id_formatted": "556016-0680", "id_scheme": "organisationsnummer", "euid": null,
"name": "Telefonaktiebolaget LM Ericsson",
"legal_form_code": "AB", "legal_form": "Private or public limited company", "legal_form_local": "Aktiebolag",
"status": "active", "is_active": true, "registered_at": "1918-08-19",
"vat_registered": null, "vat_number": null,
"employees": null, "employees_reported": false,
"industry_codes": [{"code": "70100", "description": "Verksamheter som utövas av huvudkontor", "scheme": "SNI 2007", "rank": 1}],
"postal_address": {"postal_code": "16483", "city": "STOCKHOLM", "country_code": "SE"},
"advertising_protected": null,
"published_deadlines": [],
"source": "Bolagsverket (bolagsverket.se)",
"license": "Free re-use (Bolagsverket/SCB high-value datasets, EU Open Data Directive) — the publisher names no licence"
}
Bolagsverket 没有为这些数据指定许可证,因此我们也不会指定:该字符串会说明许可内容,并明确指出没有可引用的许可证名称,因为在该字段中填写一个熟悉的名称就是捏造。
瑞典完全没有公布状态字段。status 根据三个独立信号推导而来——注销日期、正在进行的清算或重组程序,以及瑞典统计局的“经济活跃”标记——因此,is_active 表示仍在登记册上且未进入清算,这不等同于正在经营。只要其中任何信息不可用,结果就是 unknown,绝不会是 active。
系统会计算两个日期,每个日期都附有对应的法律条款:
$ curl "https://api.foretak.dev/v1/SE/company/5560160680/deadlines?today=2026-09-07"
{"kind": "general_meeting", "due_date": "2027-06-30", "days_until": 296, "rolled_forward": false, "period_label": "2026"}
{"kind": "annual_accounts", "due_date": "2027-07-31", "days_until": 327, "rolled_forward": false, "period_label": "2026"}
年度股东大会的期限为六个月(aktiebolagslagen 7 kap. 10 §),逾期费用开始生效前提交文件的期限为七个月(årsredovisningslagen 8 kap. 6 §)。如果日期落在周末,两者都不会顺延,因为瑞典没有任何来源说明需要顺延。两者默认都假设财年于 12 月 31 日结束——notes 中会有一句话准确说明这一点,并说明财年结束日期不同的时候如何调整这两个日期——但 Bolagsverket 的文件清单确实会公布已提交年度报告的财年结束日期:传入 include=["filings"](两个接口中的 company_deadlines 都接受此参数)即可读取该日期,并用登记机构公布的数据替换默认假设。瑞典的 search_company 会返回 not_implemented:免费 API 提供四种操作,但没有一种支持按名称搜索。
请注意其中的 null。Companies House 不会公布任何公司的 VAT 状态、员工人数或股本,因此这些字段为 null,而不是猜测值——null 表示“该登记机构没有说明”,绝不表示“没有”。跨国家统一采用这种结构,关键就在于诚实。
还有截止日期,这正是英国模块发挥作用的地方:
$ curl "https://api.foretak.dev/v1/GB/company/00445790/deadlines?today=2026-09-04"
{
"company_name": "TESCO PLC", "today": "2026-09-04",
"deadlines": [
{"kind": "confirmation_statement", "local_name": "Confirmation statement (CS01)",
"due_date": "2027-07-02", "period_end": "2027-06-18", "days_until": 301,
"applies_because": "Companies House publishes this date for the company itself; it is the register's own figure, not a calculation."},
{"kind": "annual_accounts", "local_name": "Annual accounts",
"due_date": "2027-08-26", "period_end": "2027-02-26", "days_until": 356,
"applies_because": "Companies House publishes this date for the company itself; it is the register's own figure, not a calculation."}
]
}
Companies House 公布日期的地方,我们会直接引用;未公布日期的地方,则会根据所引用的法规计算,并由 applies_because 说明原因。英国的截止日期不会因为周末或银行假日而顺延;对于登记机构仍显示为逾期的申报,days_until 会返回负数。
要自行运行? 托管服务 api.foretak.dev 已配置好所有凭据。自行托管的副本需要 GB 使用免费的 Companies House 密钥,还需要 SE 使用 Bolagsverket 提供的一对 OAuth 2 客户端凭据(BOLAGSVERKET_CLIENT_ID、BOLAGSVERKET_CLIENT_SECRET);如果缺少这些凭据,这两个国家会返回注明变量名称的 upstream_error,其他所有国家仍会正常响应。挪威不需要任何凭据。
工具
| 工具 | 功能 |
|---|---|
lookup_company(id, country="NO") | 按国家标识符查询一家公司的完整 CompanyReport |
search_company(name, country="NO", limit=10) | SearchResult — 按登记机构的相关性顺序列出的候选项,包含标识符且均有评分 |
company_deadlines(id, country="NO", today=None) | DeadlineReport — 每项法定申报义务的下一次截止日期 |
validate_company_id(id, country="NO") | ValidationResult — 不发起网络请求,验证并规范化标识符 |
list_countries() | 当前支持哪些国家登记机构 |
连接器别名 — ChatGPT 只能通过 search 和 fetch 访问 MCP 服务(添加到 ChatGPT);不会新增响应格式,也没有对应的 REST 接口。
| 工具 | 功能 |
|---|---|
search(query) | ChatGPT 连接器的 search_company 别名 — 接受一个自由文本查询,返回 {"results": [{"id", "title", "url"}]} |
fetch(id) | ChatGPT 连接器的 lookup_company + company_deadlines 别名 — 接受一个 "{COUNTRY}:{identifier}",返回一份在 metadata 中包含两份报告的 Markdown 文档 |
此外还有资源 registry://rules/{country}(标识符规则、法律形式和截止日期规则 — 读取一次即可,无需循环验证),以及提示词 explain_company。
附件 — 与基础报告并行获取的独立内容,按名称选择加入:MCP 使用 include=["filings"],REST 使用 ?include=filings。
filings— 实体已提交的文件及提交时间(GB、NO、SE)charges— 针对该实体登记的押记(仅限GB)insolvency— 清盘和破产管理程序(仅限GB)financials— 登记机构记录的最新已申报会计期间财务数据(营业额、利润、资产负债表、权益和负债),用于判断供应商是否看起来具有偿付能力 — 挪威数据来自其关键财务数据源,瑞典数据则从实体自行提交的年度报告中读取(NO、SE)lei— GLEIF 为该实体发布的法律实体识别编码(Legal Entity Identifier),采用 CC0 许可且无需密钥(除SE以外的所有国家)parents— GLEIF Level 2 数据披露的直接和最终公司母公司;如果未披露,则返回实体自行声明的原因 — 一个类别词,例如NATURAL_PERSONS,而非名称(与lei支持相同的国家)peppol— 该实体是否可通过 Peppol 网络接收电子发票;在 2027 年 1 月 1 日电子发票义务生效前,实时读取 SML/SMP 查询结果(仅限NO)
国家声明的支持集合见 list_countries / GET /v1/countries 中的 supported_includes;有关 filings 的两级可空性和各国家支持范围,请参阅 llms-full.txt。
挪威 CompanyReport 中的 parent_id 和 in_group 描述的是 Enhetsregisteret 对该实体的母公司/子单位关系 — 仅此而已。本服务没有查询公司集团层级的工具:向上追踪公司集团意味着反复对 parent_id 调用 lookup_company,而这种查询回答的是“登记机构将什么列为该实体的母公司?”,不是“谁是该公司的受益所有人或控制人?” — 本服务无法回答后一个问题。上文的 include=["parents"] 是获取相关信息的另一种途径 — 它反映 GLEIF 对谁合并该实体账目的判断,既不是 Enhetsregisteret 自身的层级关系,也不是受益所有权信息。请参阅 llms-full.txt §5。
Agent 为什么会核查公司
三项规定让这成为一项义务,而非锦上添花。Finanstilsynet 的 Rundskriv 15/2019 § 4.4.1 认可对 Enhetsregisteret 进行不早于三个月前的 oppslag;如果核查依据是客户提供的公司信息,则不得早于一个月;并要求对查询留存 notoritet:查阅了什么,以及何时查阅。从 2027 年 1 月 1 日起,挪威负有记账义务的企业必须互相开具电子发票,收件方需在 ELMA 中通过 0192: 加组织编号解析;这正是这些工具已经接受的标识符。从 2027 年 7 月 10 日起,AMLR 第 23(4) 条要求与法人建立每一项新业务关系时,都提供“有效的注册证明或近期签发的登记摘录”。
source_url、fetched_at、cached、license 和 applies_because 就是为此而设:查阅了哪条记录、何时读取、是否来自 24 h 缓存、适用哪些条款,以及截止日期是直接引用登记信息,还是根据某项明确列出的规则计算得出。
明确说明这些限制,而非含糊带过:不进行制裁名单或 PEP 筛查;不验证银行账户,而最常见的发票欺诈是转移付款,即供应商确实存在,只有账号是错的;也不提供最终受益所有人信息,因为 brreg 仅应申请发布此类信息,且申请人类别不包括产品供应商。完整版本见 llms-full.txt §9。
配置
Claude Code — 项目根目录中的 .mcp.json
{
"mcpServers": {
"registry-mcp": {
"command": "uvx",
"args": ["registry-mcp"],
"env": {
"REGISTRY_MCP_CONTACT_EMAIL": "[email protected]",
"COMPANIES_HOUSE_API_KEY": "your-companies-house-key"
}
}
}
}
如果只需要挪威的数据,可以移除 COMPANIES_HOUSE_API_KEY;其他所有国家都无需此密钥。
Cursor — ~/.cursor/mcp.json(或项目中的 .cursor/mcp.json)
{
"mcpServers": {
"registry-mcp": {
"command": "uvx",
"args": ["registry-mcp"],
"env": { "REGISTRY_MCP_CONTACT_EMAIL": "[email protected]" }
}
}
}
Claude Desktop — claude_desktop_config.json
macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"registry-mcp": {
"command": "uvx",
"args": ["registry-mcp"],
"env": { "REGISTRY_MCP_CONTACT_EMAIL": "[email protected]" }
}
}
}
npm 替代 uvx — 同一服务,使用 Node 启动器
{
"mcpServers": {
"registry-mcp": { "command": "npx", "args": ["-y", "registry-mcp"] }
}
}
npx registry-mcp 会调用 uvx registry-mcp(如果不可用,则回退到 pipx run registry-mcp),因此必须安装 Python 3.12+,以及 uv 或 pipx 其中之一。
托管服务,无需本地安装 — Streamable HTTP
{
"mcpServers": {
"registry-mcp": { "type": "http", "url": "https://api.foretak.dev/mcp?src=readme" }
}
}
环境变量 — 均为可选:
| 变量 | 含义 |
|---|---|
REGISTRY_MCP_CONTACT_EMAIL | 发送给国家注册机构的 User-Agent 中所用的联系邮箱地址,这是 Brønnøysundregistrene 对 API 客户端的要求。未设置时将使用匿名客户端,可能会被上游限流或屏蔽。 |
REGISTRY_MCP_CACHE_PATH | 本地 SQLite 响应缓存的路径(TTL 为 24 小时)。默认为 ./data/cache.sqlite3。 |
COMPANIES_HOUSE_API_KEY | 英国(GB)必需。密钥可免费即时获取。未设置时,GB 查询会返回 upstream_error,并提示此变量名称;其他所有国家仍可正常使用。 |
BOLAGSVERKET_CLIENT_ID、BOLAGSVERKET_CLIENT_SECRET | 瑞典(SE)必需。Bolagsverket 应请求签发的一对 OAuth 2 凭据;根据欧盟高价值数据集法规,数据本身免费。未设置时,SE 查询会返回 upstream_error 并指出这两个变量;其他所有国家仍可正常使用。 |
REST
每个工具都有一个 REST 对应项,返回完全相同的 JSON 文档。
# One company by organisasjonsnummer
curl https://api.foretak.dev/v1/NO/company/923609016
# Search by name
curl "https://api.foretak.dev/v1/NO/search?q=equinor&limit=5"
# Statutory filing deadlines, from a date you choose
curl "https://api.foretak.dev/v1/NO/company/923609016/deadlines?today=2026-01-15"
# Checksum-validate an identifier — no upstream call, instant
curl https://api.foretak.dev/v1/NO/validate/923609016
# Which countries are live, and which need an API key
curl https://api.foretak.dev/v1/countries
# The same five routes for the United Kingdom — GB, never UK
curl https://api.foretak.dev/v1/GB/company/00445790
curl "https://api.foretak.dev/v1/GB/search?q=tesco&limit=5"
curl "https://api.foretak.dev/v1/GB/company/00445790/deadlines?today=2026-09-04"
curl https://api.foretak.dev/v1/GB/validate/445790
# Sweden — four of the five. /search returns 501 not_implemented: the free
# Bolagsverket API has no name index, and the error's hint says so.
curl https://api.foretak.dev/v1/SE/company/5560160680
curl "https://api.foretak.dev/v1/SE/company/5560160680/deadlines?today=2026-09-07"
curl https://api.foretak.dev/v1/SE/validate/556016-0680
机器可读文档:/llms.txt、/llms-full.txt、/openapi.json。
添加你的国家
挪威对应一个文件夹。英国也是如此:registries/gb/ 仅通过添加四个文件和一行导入代码就已加入,随后 GB 自动出现在 list_countries、每个工具、/openapi.json 以及 registry://rules/GB 中。瑞典也一样——registries/se/ 于 0.3.0 版发布,无需更改 core/,包括瑞典最不符合抽象模型的部分:注册机构不发布状态字段、上游不提供的操作(search_company 会返回 not_implemented),以及可能是自然人国家身份证号的标识符。
将 src/registry_mcp/registries/xx/ 复制到 registries/<cc>/,实现四个方法,再添加一行导入代码——core/ 无需任何更改,两个接口和各项清单都会自动启用新国家。
→ CONTRIBUTING.md —“添加你的国家”,并可先通过 新国家问题模板认领一个国家。
开发
uv sync --all-extras
uv run pytest # `-m "not live"` to skip the tests that hit the real registry
uv run mypy .
uv run ruff check .
目录结构:
src/registry_mcp/core/ country-neutral models, Registry ABC, rules, date helpers
src/registry_mcp/registries/ one folder per country — no/ (Norway), gb/ (UK), se/ (Sweden), xx/ (template)
src/registry_mcp/api/ FastAPI REST surface
src/registry_mcp/mcp/ FastMCP server (stdio + Streamable HTTP at /mcp)
文档
NORBIZ_SPEC.md— 挪威模块技术规范UK_SPEC.md— 英国模块技术规范SWEDEN_SPEC.md— 瑞典模块技术规范DECISIONS.md— 接口和架构决策KEYWORDS.md— 标准别名列表SUBMISSIONS.md— 注册机构提交状态legal/terms.md— 使用条款和数据归属说明
数据来源与许可
挪威数据来自 Enhetsregisteret(Brønnøysundregistrene),以 NLOD 2.0 发布——须注明来源。英国数据来自 Companies House 公共登记册,受 Crown copyright 保护,可免费重复使用,且无须注明来源;我们仍会注明来源。瑞典数据来自 Bolagsverket,同一数据载荷中还包含第二个数据提供方瑞典统计局(SCB)的数据;根据欧盟高价值数据集制度,这些数据可作为 värdefull datamängd 免费重复使用——Bolagsverket 的原话是 "Det krävs inget avtal för att du ska få använda vårt API för värdefulla datamängder" 和 "Värdefulla datamängder är avgiftsfritt"——而且 Bolagsverket 未指定许可,因此我们也不指定:license 字符串会说明使用权限,并明确指出没有可引用的许可名称。每个响应都包含 source、source_url 和 license,以便来源信息随数据一同传递。本项目自身的代码采用 MIT 许可。我们与 Brønnøysundregistrene、Companies House 或 Bolagsverket 均无关联,也未获其认可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。