# registry-mcp — national company registries (remote · api.foretak.dev)

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

- Trust score: 79/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- remote · `api.foretak.dev`: 79/100 (this document), [markdown](https://verifymcp.io/servers/foretak-registry-mcp/api.md), [page](https://verifymcp.io/servers/foretak-registry-mcp/api)
- npm · `registry-mcp`: 50/100, [markdown](https://verifymcp.io/servers/foretak-registry-mcp/registry-mcp.md), [page](https://verifymcp.io/servers/foretak-registry-mcp/registry-mcp)
- pypi · `registry-mcp`: 64/100, [markdown](https://verifymcp.io/servers/foretak-registry-mcp/registry-mcp-2.md), [page](https://verifymcp.io/servers/foretak-registry-mcp/registry-mcp-2)

## Channel facts

- Endpoint: `https://api.foretak.dev/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.4.2`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-21.

- **Endpoint Security**: 74/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 75/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4301 tokens (~430/item across 10 items; 7 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 57/100
  - Stability observed for 17 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the registry-mcp — national company registries server?

registry-mcp — national company registries is a hosted endpoint at https://api.foretak.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http foretak-registry-mcp 'https://api.foretak.dev/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "foretak-registry-mcp": {
      "url": "https://api.foretak.dev/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "foretak-registry-mcp": {
      "type": "http",
      "url": "https://api.foretak.dev/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.foretak-registry-mcp]
url = "https://api.foretak.dev/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "foretak-registry-mcp": {
      "type": "remote",
      "url": "https://api.foretak.dev/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add foretak-registry-mcp --url 'https://api.foretak.dev/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  foretak-registry-mcp:
    url: "https://api.foretak.dev/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "foretak-registry-mcp": {
      "Transport": "http",
      "Url": "https://api.foretak.dev/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add foretak-registry-mcp -t streamable-http -u 'https://api.foretak.dev/mcp'
```

### Other

```json
{
  "mcpServers": {
    "foretak-registry-mcp": {
      "type": "http",
      "url": "https://api.foretak.dev/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-12 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 74, +1)

- [security] Tool “company_deadlines” rewrote its description, which is the text the model reads
- [functional] Server version: 0.4.1 → 0.4.2

### 2026-09-09 (score 73, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “search” rewrote its description, which is the text the model reads
- [security] Tool “search_company” rewrote its description, which is the text the model reads
- [security] Tool “validate_company_id” rewrote its description, which is the text the model reads
- [security] Tool “fetch” rewrote its description, which is the text the model reads
- [security] Tool “list_countries” rewrote its description, which is the text the model reads
- [security] Tool “company_deadlines” rewrote its description, which is the text the model reads
- [security] Tool “lookup_company” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 394 → 597
- [functional regression] Schema quality: 394 → 454
- [functional] New prompt “register_coverage”
- [functional] New prompt “counterparty_check”
- [functional] Server version: 0.4.0 → 0.4.1
- [functional] Server version: 0.3.0 → 0.4.0
- [cosmetic] “company_deadlines” added an optional parameter “include”
- [cosmetic] “lookup_company” added an optional parameter “include”
- [cosmetic] “company_deadlines” reworded the description of “today”
- [cosmetic] “search” reworded the description of “query”
- [cosmetic] “search_company” reworded the description of “limit”
- [cosmetic] “company_deadlines” reworded the description of “include”
- [cosmetic] “company_deadlines” reworded the description of “country”
- [cosmetic] “company_deadlines” reworded the description of “id”
- [cosmetic] “lookup_company” reworded the description of “country”
- [cosmetic] “lookup_company” reworded the description of “id”
- [cosmetic] “lookup_company” reworded the description of “include”
- [cosmetic] “search_company” reworded the description of “country”
- [cosmetic] “validate_company_id” reworded the description of “country”
- [cosmetic] “validate_company_id” reworded the description of “id”

### 2026-09-08 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (7)

### `lookup_company` (~1264 tokens)

Look up a company in a national business register

Look 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": {"c…

Input parameters:

- `country` (string): ISO-3166-1 alpha-2 — NO Norway, GB United Kingdom, SE Sweden. UK is not a country code here and is rejected. Call list_countries for the live set.
- `id` (string, required): The company's national identifier, normalised for you — a Norwegian organisasjonsnummer (orgnr), a Companies House company number (CRN), or a Swedish organisationsnummer or personnummer. Spaces, dots…
- `include` (array): Attachment names to fetch alongside the base report; empty by default, which costs exactly one upstream request. Each is a second, independent fetch attached at that name with its own provenance, nul…

Output parameters:

- `activity`: Free-text description of actual activity.
- `advertising_protected`: Whether the register marks this entity as protected against direct-marketing use (Danish CVR-loven § 19 'reklamebeskyttelse', Swedish 'reklamspärr'). True: the register marks it. False: the register…
- `bankruptcy_date`: Date bankruptcy was opened.
- `business_address`: Visiting/registered office.
- `business_register_registered_at`: Date entered in the commercial/business register, where that is separate.
- `cached` (boolean): True when served from our cache rather than a live fetch.
- `charges`: Registered charges (mortgages / security interests) against this entity. `None` unless `charges` was passed in `include=[...]` — and, even then, `None` if that fetch failed (see `notes` for which att…
- `confidence` (number): How sure we are this record is the entity the caller meant (D-005).
- `confidence_basis`: Why that confidence, e.g. 'exact identifier lookup'.
- `country` (string): ISO-3166-1 alpha-2, upper-case, e.g. 'NO'.
- `deregistered_at`: Date the entity was deleted from the register.
- `email`: Contact email as registered.
- `employees`: Registered number of employees. None = not reported.
- `employees_reported`: Whether the registry holds an employee figure at all (distinguishes 0 from unknown).
- `euid`: European Unique Identifier (EUID, Commission Implementing Regulation (EU) 2021/1042 Article 9), where the register publishes one, e.g. Finland's 'FIFPRO.0112038-9'. None for a register that does not…
- `fetched_at`: UTC timestamp of the live fetch this record came from.
- `filings`: What this entity has filed with its register, and when. `None` unless `filings` was passed in `include=[...]` — and, even then, `None` if that fetch failed (see `notes` for which attachment and why).…
- `financials`: Key figures from this entity's filed annual accounts. `None` unless `financials` was passed in `include=[...]` — and, even then, `None` if that fetch failed (see `notes` for which attachment and why)…
- `founded_at`: Incorporation / foundation date.
- `has_annual_accounts_duty`: True when this legal form must file annual accounts with the state.
- `has_board_duty`: True when this legal form must have a registered board.
- `id` (string): Canonical national identifier, digits/letters only, no spaces or dots.
- `id_formatted`: The identifier as a local would write it, e.g. '923 609 016'.
- `id_scheme`: Name of the identifier scheme, e.g. 'organisasjonsnummer'.
- `in_business_register`: Listed in the commercial register (Norway: Foretaksregisteret).
- `in_group`: Part of a corporate group.
- `industry_codes` (array): Industry classifications, primary first.
- `insolvency`: Insolvency proceedings the register publishes against this entity. `None` unless `insolvency` was passed in `include=[...]`, or that fetch failed. A *present* block with `cases: []` means the registe…
- `is_active` (boolean): Convenience mirror of `status == active`, so agents need no enum table.
- `is_subunit` (boolean): True when this record is a branch/sub-unit, not a legal entity.
- `last_annual_accounts_year`: Most recent financial year for which accounts were filed.
- `legal_form`: English label, e.g. 'Private limited company'.
- `legal_form_code`: National legal-form code, e.g. 'AS', 'ASA', 'ENK'.
- `legal_form_local`: Local label, e.g. 'Aksjeselskap'.
- `lei`: This entity's Legal Entity Identifier record, from GLEIF — not a national register (D-026(c), D-045(e)). `None` unless `lei` was passed in `include=[...]` — and, even then, `None` if that fetch faile…
- `license`: Licence of the upstream data, e.g. 'NLOD 2.0'.
- `limited_liability`: True when owners are not personally liable for debts.
- `name` (string): Current registered name.
- `notes` (array): Caveats an agent should surface to the user, plain English, one per item.
- `parent_id`: Identifier of the parent/owning entity, if any.
- `parents`: Corporate parents from GLEIF Level 2 — accounting consolidation, not shareholding (see `ParentBlock`'s own docstring). `None` unless `parents` was passed in `include=[...]` — and, even then, `None` i…
- `peppol`: Whether this entity can be reached over the Peppol e-invoicing network. `None` unless `peppol` was passed in `include=[...]` — and, even then, `None` only if the attachment could not be built at all…
- `phone`: Contact phone as registered.
- `postal_address`: Postal address.
- `previous_names` (array): Former registered names, newest first.
- `published_deadlines` (array): Filing dates the upstream register publishes for this entity itself, carried verbatim. Empty for a register that publishes none — most of them. This is the input `Registry.deadlines(report, today)` n…
- `purpose`: Statutory purpose / objects clause, joined into one string.
- `registered_at`: Date first entered in the central register.
- `registers` (object): Other national sub-registers this entity is or is not in, keyed by a lower-case slug, e.g. {'stiftelsesregisteret': false}.
- `registry` (string): Registry slug, e.g. 'brreg'.
- `sector`: Institutional sector description.
- `sector_code`: Institutional sector code.
- `share_capital`: Registered share capital.
- `share_capital_currency`: ISO-4217 code for `share_capital`.
- `source`: Human-readable source name, e.g. 'Enhetsregisteret (brreg.no)'.
- `source_url`: Direct URL of the upstream record, for citation.
- `status` (string): Normalised lifecycle status.
- `status_detail`: One sentence in English explaining the status and the flag it came from.
- `vat_number`: VAT identifier if it differs from `id` (Norway: id + 'MVA').
- `vat_registered`: Registered for VAT (Norway: Merverdiavgiftsregisteret).
- `vat_registered_at`: Date of VAT registration.
- `website`: Website as registered.

### `search_company` (~546 tokens)

Search a national company register by name

Search 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.

Input parameters:

- `country` (string): ISO-3166-1 alpha-2 — NO Norway, GB United Kingdom, SE Sweden. UK is not a country code here and is rejected. Call list_countries for the live set.
- `limit` (integer): Maximum hits to return, 1-100; default 10. Outside that range is a bad_request, not a silent clamp.
- `name` (string, required): Company name to search for, free text — not an identifier. Use lookup_company once you have the id of the right hit.

Output parameters:

- `cached` (boolean): Served from cache.
- `country` (string): ISO-3166-1 alpha-2, upper-case.
- `fetched_at`: UTC timestamp of the fetch.
- `hint`: What to do next, e.g. 'call lookup_company with the id of the right hit'.
- `hits` (array): Best matches, best first: always sorted by `confidence` descending. Hits that score equally keep the order the upstream register returned them in.
- `query` (string): The name that was searched for.
- `registry` (string): Registry slug.
- `total` (integer): Total matches upstream, which may exceed len(hits).
- `truncated` (boolean): True when `total` exceeds the returned hits.

### `company_deadlines` (~849 tokens)

Statutory filing deadlines for a company

Give 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 le…

Input parameters:

- `country` (string): ISO-3166-1 alpha-2 — NO Norway, GB United Kingdom, SE Sweden. UK is not a country code here and is rejected. Call list_countries for the live set.
- `id` (string, required): The company's national identifier, normalised for you — a Norwegian organisasjonsnummer (orgnr), a Companies House company number (CRN), or a Swedish organisationsnummer or personnummer. Spaces, dots…
- `include` (array): Attachment names that can change a *computed* deadline — narrower than lookup_company's include. Today only 'filings': one extra upstream request for the entity's filing history, supplying a real fin…
- `today`: Date to compute deadlines from, YYYY-MM-DD; defaults to the server's current UTC date. Anything else is a bad_request naming the format.

Output parameters:

- `company_id` (string): Canonical national identifier the deadlines were computed for.
- `company_name`: Registered name, so the caller can echo it back to a user.
- `country` (string): ISO-3166-1 alpha-2, upper-case.
- `deadlines` (array): One entry per obligation kind, always the next occurrence, sorted by due_date. An empty list is a real answer, not an error — read `notes` for why.
- `notes` (array): Caveats to surface to the user, carried over from the company report: why the list is empty, an unclassified legal form, a status that suspends filing.
- `registry` (string): Registry slug, e.g. 'brreg'.
- `rules_last_reviewed` (string): The date this country's deadline rules — the statutes and their day-count arithmetic — were last checked against the law; a deadline computed long after this date should be re-verified before anyone…
- `today` (string): The date 'next occurrence' was computed from, inclusive. Echoed back so the answer is reproducible and an agent can tell a cached answer from a fresh one.

### `validate_company_id` (~547 tokens)

Validate a company identifier (no network call)

Check 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`.

Input parameters:

- `country` (string): ISO-3166-1 alpha-2 — NO Norway, GB United Kingdom, SE Sweden. UK is not a country code here and is rejected. Call list_countries for the live set.
- `id` (string, required): The company's national identifier, normalised for you — a Norwegian organisasjonsnummer (orgnr), a Companies House company number (CRN), or a Swedish organisationsnummer or personnummer. Spaces, dots…

Output parameters:

- `country` (string): ISO-3166-1 alpha-2, upper-case.
- `formatted`: The identifier as a local would write it, e.g. '923 609 016'. None when invalid.
- `hint`: What to do next when `valid` is false — the same hint the invalid_id error carries. None when valid: the next call is simply lookup.
- `id_scheme`: Name of the identifier scheme, e.g. 'organisasjonsnummer'.
- `input` (string): The identifier exactly as the caller supplied it.
- `normalized`: Canonical form to pass to lookup, e.g. '923609016'. None when invalid.
- `reason`: One English sentence saying why it is valid, or what failed.
- `registry` (string): Registry slug, e.g. 'brreg'.
- `valid` (boolean): True when the identifier passes this country's format and checksum.

### `list_countries` (~135 tokens)

List supported national company registries

List 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.

Output parameters:

- `countries` (array): One row per registry that can answer right now, sorted by country code.

### `search` (~108 tokens)

Find a company (ChatGPT connector alias for search_company)

ChatGPT 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`.

Input parameters:

- `query` (string, required): A company name, a national identifier, or either plus a country.

Output parameters:

- `results` (array)

### `fetch` (~130 tokens)

Fetch one company record (ChatGPT connector alias for lookup_company)

ChatGPT 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`.

Input parameters:

- `id` (string, required): An `id` from a `search` result: '{COUNTRY}:{identifier}', e.g. 'NO:923609016' or 'GB:00445790'.

Output parameters:

- `id` (string)
- `metadata` (object)
- `text` (string)
- `title` (string)
- `url` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/foretak-registry-mcp/api#diagnostics

## Score history

- 2026-09-21: 79
- 2026-09-20: 79
- 2026-09-19: 78
- 2026-09-18: 78
- 2026-09-17: 77
- 2026-09-16: 77
- 2026-09-15: 76
- 2026-09-14: 76
- 2026-09-13: 75
- 2026-09-12: 75
- 2026-09-11: 74
- 2026-09-10: 74
- 2026-09-09: 73
- 2026-09-08: 73
- 2026-09-07: 72
- 2026-09-06: 72
- 2026-09-05: 62
- 2026-09-04: 62

## Common questions

### What is the registry-mcp — national company registries server?

registry-mcp — national company registries is listed in the public MCP registry as io.github.foretak/registry-mcp. The company registry MCP: brreg orgnr, Companies House, Bolagsverket organisationsnummer. This page covers its hosted endpoint (https://api.foretak.dev/mcp).

### Is the registry-mcp — national company registries server safe to use?

registry-mcp — national company registries scores 79 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the registry-mcp — national company registries server expose?

registry-mcp — national company registries exposes 7 tools: lookup_company, search_company, company_deadlines, validate_company_id, list_countries, and 2 more. Their descriptions and schemas cost roughly 3,579 tokens of context every time the server is loaded.

### Does the registry-mcp — national company registries server require authentication?

No. We connected to registry-mcp — national company registries without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the registry-mcp — national company registries server still maintained?

registry-mcp — national company registries is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://api.foretak.dev/mcp
- Repository: https://github.com/foretak/registry-mcp
- Website: https://api.foretak.dev/
- Changelog RSS feed: https://verifymcp.io/servers/foretak-registry-mcp/api.xml
- Changelog JSON feed: https://verifymcp.io/servers/foretak-registry-mcp/api.json
- HTML version of this page: https://verifymcp.io/servers/foretak-registry-mcp/api
