mcpField
R
registry-mcp — national company registries

registry-mcp — national company registries

远程服务
api.foretak.dev商业与营销07 周前更新

关于 registry-mcp — national company registries

registry-mcp 是面向 AI Agent 等客户端的 MCP 服务和 REST API,可查询英国、挪威和瑞典的公司登记信息。它以统一 JSON 格式返回数据,并提供申报期限依据及缓存新鲜度信息。

主要功能

  1. 01按国家标识符查询公司
  2. 02搜索支持的登记机构
  3. 03提供申报期限及其依据
  4. 04无需联网验证标识符
  5. 05返回缓存与更新时间

适用场景

  1. 01查看公司的登记记录
  2. 02检查即将到期的法定申报日期
  3. 03验证并规范化公司标识符

MCP 相关

向 MCP 客户端提供五个登记工具、两个 ChatGPT 连接器别名、登记规则资源和 explain_company 提示词。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://api.foretak.dev/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

安装包
pypiregistry-mcp0.4.2
npmregistry-mcp0.4.2

工具

7
参数类型必填说明
idstring是公司的国家/地区标识符会自动规范化 — 挪威 organisasjonsnummer(orgnr)、Companies House 公司编号(CRN),或瑞典 organisationsnummer 或 personnummer。接受空格、句点、连字符、NO...MVA 后缀以及较短的 CRN;各国家/地区的准确格式请参阅 list_countries。
countrystring否ISO-3166-1 alpha-2 — NO 挪威、GB 英国、SE 瑞典。此处 UK 不是国家/地区代码,会被拒绝。请调用 list_countries 获取当前支持的国家/地区。
includearray否与基础报告一同获取的附件名称;默认为空,此时恰好只需一次上游请求。每项附件都是独立的第二次获取,附加在对应名称下并带有自己的来源信息;除非请求,否则为 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

PyPI PyPI alias npm CI License: MIT Listed on mcpservers.org Rated A on Glama

为 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。

一键安装,用于远程流式 HTTP 服务: 在 VS Code 中安装 在 VS Code Insiders 中安装 在 Cursor 中安装

其他客户端(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 使用,不会引入新格式。托管 API api.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)

文档

数据来源与许可

挪威数据来自 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 均无关联,也未获其认可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。