protogrid

Search / io.github.foretak/registry-mcp

registry-mcp — national company registries

R0· no sign-in

The company registry MCP: brreg orgnr, Companies House, Bolagsverket organisationsnummer.

v0.4.2 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality94strong
Trust94of 100
Uptime, 30 days100%
Latency p50427 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "registry-mcp": {
      "type": "http",
      "url": "https://api.foretak.dev/mcp"
    }
  }
}
claude mcp add --transport http registry-mcp https://api.foretak.dev/mcp
[mcp_servers.registry-mcp]
url = "https://api.foretak.dev/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "registry-mcp": {
      "type": "remote",
      "url": "https://api.foretak.dev/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "registry-mcp": {
      "type": "http",
      "url": "https://api.foretak.dev/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=registry-mcp&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYXBpLmZvcmV0YWsuZGV2L21jcCJ9"
}
{
  "servers": {
    "registry-mcp": {
      "type": "http",
      "url": "https://api.foretak.dev/mcp"
    }
  }
}
{
  "mcpServers": {
    "registry-mcp": {
      "httpUrl": "https://api.foretak.dev/mcp"
    }
  }
}
extensions:
  "registry-mcp":
    enabled: true
    name: "registry-mcp"
    type: streamable_http
    uri: "https://api.foretak.dev/mcp"
    timeout: 300

Quality 94 / 100strong

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length4 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations7 of 7 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 4,323 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependencies100 · weight 15
  • pass
    deps.known_vulnsno known advisory in 77 resolved packages
  • pass
    deps.mcp_sdk_versionmcp 2.2.0, no known advisory
  • pass
    deps.resolvable[email protected], [email protected] resolved: 77 packages

7 tools, about 4,323 tokens to load them all · tool set 4b14d5cd7252 · checked 2026-10-20 09:31 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 94 / 100

provenance90
liveness100
freshness85
hygiene100

+repository +namespace-matches-repo +website +reachable +uptime-100% ~updated-40d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

[email protected] PyPI75 dependencies, resolved · MCP SDK mcp 2.2.0 · advisories checked 2026-10-19

No known advisory affects this dependency graph.

[email protected] npm0 dependencies, resolved · advisories checked 2026-10-19

No known advisory affects this dependency graph.

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://api.foretak.dev/mcp streamable-httpnoneyes100%427 ms2026-07-282026-10-20
packageregistryversionruntimesecrets
registry-mcppypi0.4.2uvxCOMPANIES_HOUSE_API_KEY, BOLAGSVERKET_CLIENT_ID, BOLAGSVERKET_CLIENT_SECRET
registry-mcpnpm0.4.2npxCOMPANIES_HOUSE_API_KEY, BOLAGSVERKET_CLIENT_ID, BOLAGSVERKET_CLIENT_SECRET

Tools (7)

company_deadlinesread-onlyGive the next occurrence of each statutory filing deadline a company faces. `country="NO"` covers the Norwegian calendar (Regnskapsregisteret, Skatteetaten) for a company looked up by organisasjonsnummer (orgnr, org.nr) in Brønnøysundregistrene / Enhetsregisteret (brreg): årsregnskap, generalforsamling, skattemelding, aksjonærregisteroppgaven, mva-melding, a-melding. `country="GB"` covers the two Companies House obligations for a company number (CRN): the annual accounts filing and the confirmation statement (CS01). `country="SE"` covers the two Swedish obligations of an aktiebolag (AB) or ekonomisk förening (EK) looked up by organisationsnummer at Bolagsverket: the ordinary general meeting (ordinarie bolagsstämma / årsstämma) at six months from the financial year end, and the annual report (årsredovisning) at seven, where the late-filing fee (förseningsavgift) begins. Pass `today` (`YYYY-MM-DD`) for a reproducible answer; it defaults to the server's current UTC date. Quote `due_date`, not `statutory_date`, and quote each deadline's `applies_because` rather than presenting a date as unconditional fact — that sentence carries the legal form or flag the date rests on, its statute, any assumption still in it, and for the UK whether it is Companies House's own figure or one computed here. `days_until` goes negative for a filing Companies House still shows as overdue. Swedish dates assume a financial year ending 31 December unless you pass `include=["filings"]`, which substitutes the year end of the last filed annual report where Bolagsverket's document list holds one; the filing date is an outer limit regardless, since a company whose general meeting was earlier must file earlier. An empty `deadlines` list is a real answer — a bankrupt, deleted or compulsorily-liquidated entity, a branch/sub-unit, or any company whose status is not active — and `notes` explains why. `registry://rules/{country}` carries each country's full deadline rules, roll-forward treatment and legal sources. `rules_last_reviewed` names the date this country's statutes and day-count arithmetic were last checked against the law — a deadline computed long after that date should be re-verified before anyone acts on it. Errors are the `{"error": {"code", "message", "hint"}}` envelope this server's instructions set out code by code; `hint` names the next call. This tool looks the entity up first, so any `lookup_company` error code can surface here too.
fetchread-onlyChatGPT connector alias; other clients should prefer `lookup_company` plus `company_deadlines`, which return the CompanyReport and DeadlineReport shapes directly. Takes one `id` from `search` — "{COUNTRY}:{identifier}", e.g. "NO:923609016" — and returns that company's register record and statutory filing deadlines as readable text, both full JSON documents in `metadata`.
list_countriesread-onlyList every national company registry this service can answer for right now, with each one's identifier scheme, source URL, licence, `supported_includes`, and whether the upstream register needs a credential (`requires_api_key`, `api_key_env`). Call it before your first lookup in a country you have not used here, whenever a user names a country you are unsure of, or before guessing an `include` value — never hard-code a country list of your own, since it grows as modules are added. Stub modules are hidden; only registries that actually answer are listed. No error mode.
lookup_companyread-onlyLook up a company by its national identifier and get the full CompanyReport — legal form, status, address, VAT registration where the register publishes it, board and accounts duties, employees, and more. `country="NO"` is the norway company lookup for the norwegian business registry: Brønnøysundregistrene / Enhetsregisteret (brreg), by organisasjonsnummer (orgnr, org.nr). `country="GB"` is the uk company lookup at Companies House, by company number (company registration number, CRN) — "UK" is not a country code here. `country="SE"` is the swedish company lookup at Bolagsverket, by organisationsnummer or a sole trader's (enskild näringsidkare) personnummer, and by identifier only, since Bolagsverket's free API has no name search. `include=[...]` attaches seven second fetches, each with its own provenance and `null` unless you ask: `filings` (filing history — do they file, and on time), `charges` (registered mortgages and security interests), `insolvency` (winding-up and administration), `financials` (annual accounts — turnover, operating result, profit, balance sheet: the solvency question), `lei` (the GLEIF Legal Entity Identifier), `parents` (direct and ultimate parent — this entity's group — from GLEIF) and `peppol` (whether an e-invoice would reach them, ahead of Norway's 1 January 2027 EHF duty). The `include` argument explains each: what it returns, which countries declare it, how to read its nulls. Use it once you have the identifier — from the user, an invoice, a contract, or a `search_company` hit's `id`. Read the returned `notes` before acting: it carries caveats such as bankruptcy, dissolution, a deleted entity, an unclassified legal form, or an attachment whose own fetch failed. This tool does not perform sanctions, PEP or adverse-media screening, and it does not verify bank account details — it returns identity and filing data from the national register only, never a compliance clearance or a confirmed payment detail. Errors are the `{"error": {"code", "message", "hint"}}` envelope this server's instructions set out code by code (D-007); `hint` names the next call. A failed *attachment* fetch is not one of them: the base report still comes back, that block is left `null`, and `notes` says which attachment failed and why.
searchread-onlyChatGPT connector alias; other clients should prefer `search_company`, which takes an explicit `country` and returns the full SearchResult. One free-text query — a name, an identifier, or either plus a country — across Norway, the United Kingdom and Sweden. Returns {"results": [{"id", "title", "url"}]}; pass a result's `id` to `fetch`.
search_companyread-onlySearch a national company register by name, when you have a name rather than an identifier. `country="NO"` searches Brønnøysundregistrene / Enhetsregisteret (brreg) — the norway company lookup for the norwegian business registry when the organisasjonsnummer (orgnr, org.nr) is not yet known; `country="GB"` is the uk company search at Companies House, returning each hit's company number (company registration number, CRN). **Sweden cannot be searched by name.** Bolagsverket's free API has four operations and none takes a company name, so `country="SE"` raises `not_implemented` — a fact about the register, not a temporary gap, and it will not start working. Sweden supports lookup by identifier only: call `lookup_company` with the ten-digit organisationsnummer (or a sole trader's twelve-digit personnummer), or `validate_company_id` first to check the shape for free. Bolagsverket publishes the whole register as bulk downloadable files for callers who must search by name. Then call `lookup_company` with the `id` of the right hit for the full report — a search hit is deliberately thin (name, legal form, status, city) and must not be acted on directly. Hits arrive in the register's own relevance order, so read each hit's `confidence` rather than assuming the first row is best. Zero hits is not an error, and `hint` says what to try next — Norwegian names are registered upper-case and often carry an 'AS', 'ASA' or 'NUF' suffix, UK names a 'LIMITED', 'LTD', 'PLC' or 'LLP' one, worth dropping before concluding a company does not exist. Errors are the `{"error": {"code", "message", "hint"}}` envelope this server's instructions set out code by code; `hint` names the next call. Call `list_countries` if you are unsure a country is supported.
validate_company_idread-onlyCheck whether a national company identifier is well-formed — no network call. `country="NO"` checksum-checks a Norwegian organisasjonsnummer (orgnr, org.nr) for Brønnøysundregistrene / Enhetsregisteret (brreg) — the cheap norway company lookup pre-check for the norwegian business registry. `country="GB"` shape-checks and normalises a UK company number (company registration number, CRN) for Companies House ('445790' → '00445790', 'oc303675' → 'OC303675'); a CRN has no check digit, so a GB `valid: true` means the shape is right and nothing more. `country="SE"` shape-checks and normalises a Swedish organisationsnummer for Bolagsverket ('556016-0680' and 'SE556016068001' both become '5560160680') and accepts a sole trader's twelve-digit personnummer; Sweden's check digit is **not** enforced here (`registry://rules/SE` says why), so an `SE` `valid: true` means the shape is right, `reason` may carry a caveat, and the register's own verdict arrives on the lookup. It is the cheapest way to tell a ten-digit Swedish organisationsnummer from a nine-digit Norwegian organisasjonsnummer. Use it on user input or a spreadsheet column before spending a real `lookup_company` call, since it is instant and free. Returns a ValidationResult and never raises for a malformed identifier: `valid: false` comes with `reason` and `hint` rather than a tool error — this tool answers a question, it does not fail on bad input (D-010). A valid identifier does not mean the entity exists; follow it with `lookup_company` if you need facts. The only error it raises is `unsupported_country`, in the usual `{"error": {"code", "message", "hint"}}` envelope — call `list_countries`.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "io.github.foretak/registry-mcp",
  "_meta": {
    "io.modelcontextprotocol.registry/publisher-provided": {
      "tool": "registry-mcp T15c",
      "license": "MIT",
      "keywords": [
        "brreg",
        "brønnøysund",
        "brønnøysundregistrene",
        "enhetsregisteret",
        "organisasjonsnummer",
        "orgnr",
        "org.nr",
        "norway company lookup",
        "norwegian business registry",
        "foretak",
        "companies house",
        "companies house api",
        "company number",
        "company registration number",
        "uk company lookup",
        "uk company search",
        "confirmation statement",
        "company registry",
        "company registry mcp",
        "mcp",
        "bolagsverket",
        "organisationsnummer",
        "swedish company lookup",
        "swedish company number"
      ],
      "countries": [
        "GB",
        "NO",
        "SE"
      ],
      "dataLicense": "NLOD 2.0 (Enhetsregisteret, Brønnøysundregistrene); Crown copyright, free to re-use (Companies House public register); free re-use, publisher names no licence (Bolagsverket/SCB high-value datasets, EU Open Data Directive)",
      "documentation": {
        "llmsTxt": "https://api.foretak.dev/llms.txt",
        "openapi": "https://api.foretak.dev/openapi.json",
        "llmsFullTxt": "https://api.foretak.dev/llms-full.txt"
      },
      "schemaFetchedAt": "2026-09-03"
    }
  },
  "icons": [
    {
      "src": "https://api.foretak.dev/icon.png",
      "sizes": [
        "400x400"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "registry-mcp — national company registries",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://api.foretak.dev/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.4.2",
  "packages": [
    {
      "version": "0.4.2",
      "transport": {
        "type": "stdio"
      },
      "identifier": "registry-mcp",
      "runtimeHint": "uvx",
      "registryType": "pypi",
      "registryBaseUrl": "https://pypi.org",
      "environmentVariables": [
        {
          "name": "REGISTRY_MCP_CONTACT_EMAIL",
          "format": "string",
          "description": "Contact address sent in the User-Agent to the national registry, as Brønnøysundregistrene asks of API clients. Unset means an anonymous client, which may be blocked upstream.",
          "placeholder": "[email protected]"
        },
        {
          "name": "REGISTRY_MCP_CACHE_PATH",
          "format": "filepath",
          "description": "Path to the local SQLite response cache (24 h TTL). Defaults to ./data/cache.sqlite3.",
          "placeholder": "./data/cache.sqlite3"
        },
        {
          "name": "COMPANIES_HOUSE_API_KEY",
          "format": "string",
          "isSecret": true,
          "description": "Companies House REST API key, required for the United Kingdom (GB). Free from developer.company-information.service.gov.uk. Unset means GB lookups return an upstream_error naming this variable; every other country still answers."
        },
        {
          "name": "BOLAGSVERKET_CLIENT_ID",
          "format": "string",
          "isSecret": true,
          "description": "Bolagsverket OAuth 2 client id, required for Sweden (SE) together with BOLAGSVERKET_CLIENT_SECRET. Free, no contract: request both from Bolagsverket's kundanmälan form. Unset means SE lookups return an upstream_error naming both variables; every other country still answers."
        },
        {
          "name": "BOLAGSVERKET_CLIENT_SECRET",
          "format": "string",
          "isSecret": true,
          "description": "Bolagsverket OAuth 2 client secret, the other half of BOLAGSVERKET_CLIENT_ID. Both are needed before Sweden (SE) can answer."
        },
        {
          "name": "BOLAGSVERKET_ENVIRONMENT",
          "format": "string",
          "description": "Which Bolagsverket environment the Swedish credentials belong to: 'production' (default) or 'test'. It selects the data host and the token host as a pair, so the two can never be mixed."
        }
      ]
    },
    {
      "version": "0.4.2",
      "transport": {
        "type": "stdio"
      },
      "identifier": "registry-mcp",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "REGISTRY_MCP_CONTACT_EMAIL",
          "format": "string",
          "description": "Contact address sent in the User-Agent to the national registry, as Brønnøysundregistrene asks of API clients. Unset means an anonymous client, which may be blocked upstream.",
          "placeholder": "[email protected]"
        },
        {
          "name": "COMPANIES_HOUSE_API_KEY",
          "format": "string",
          "isSecret": true,
          "description": "Companies House REST API key, required for the United Kingdom (GB). Free from developer.company-information.service.gov.uk. Unset means GB lookups return an upstream_error naming this variable; every other country still answers."
        },
        {
          "name": "BOLAGSVERKET_CLIENT_ID",
          "format": "string",
          "isSecret": true,
          "description": "Bolagsverket OAuth 2 client id, required for Sweden (SE) together with BOLAGSVERKET_CLIENT_SECRET. Free, no contract: request both from Bolagsverket's kundanmälan form. Unset means SE lookups return an upstream_error naming both variables; every other country still answers."
        },
        {
          "name": "BOLAGSVERKET_CLIENT_SECRET",
          "format": "string",
          "isSecret": true,
          "description": "Bolagsverket OAuth 2 client secret, the other half of BOLAGSVERKET_CLIENT_ID. Both are needed before Sweden (SE) can answer."
        },
        {
          "name": "BOLAGSVERKET_ENVIRONMENT",
          "format": "string",
          "description": "Which Bolagsverket environment the Swedish credentials belong to: 'production' (default) or 'test'. It selects the data host and the token host as a pair, so the two can never be mixed."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/foretak/registry-mcp",
    "source": "github"
  },
  "websiteUrl": "https://api.foretak.dev",
  "description": "The company registry MCP: brreg orgnr, Companies House, Bolagsverket organisationsnummer."
}