foretak.dev
GB · NO · SE   /   read-only   /   no account

An agent without a register still gives you an answer.

It won’t say it doesn’t know. It will describe a company as it stood in its training data, present tense, with nothing attached that you could check. Below is the same question, asked twice.

One question, two ways of answering it

Is CARILLION PLC still trading? — GB 03782379

Answered from memory

“Carillion plc is a large UK construction and facilities-management group.”

sourcenone given
as ofnone given
licencenone given
checkableno

Illustrative, not a transcript. The fault isn’t the sentence — it’s that nothing is attached to it. No register named, no date, no licence, nothing a reviewer could open.

Answered from the register

"name""CARILLION PLC"
"status""under_liquidation"
"is_active"false
"status_detail""In liquidation. Companies House does not say whether the liquidation is voluntary or compulsory."
"registers"{ "charges": true, "insolvency": true }
"source_url""https://find-and-update.company-information.service.gov.uk/company/03782379"
"fetched_at""2026-09-07T15:23:23Z"
"license""Crown copyright — Companies House public register, free to re-use"

Verbatim from GET /v1/GB/company/03782379, fetched 2026-09-07. Abridged — the report carries forty-seven more fields.

And where it cannot know, it says so

The next question is when Carillion must file. There’s no honest answer, so none is given.

A service that always produces a number is a service that sometimes makes one up. This is the entire deadlines response for a company in liquidation.

"deadlines": []
"notes": [ "In liquidation. Companies House does not say whether the liquidation is voluntary or compulsory.", "This company’s Companies House status is ‘liquidation’, so no filing deadlines are given. Once a company is dissolved, in liquidation, in administration or under a voluntary arrangement, what must still be filed is decided by the insolvency practitioner or the registrar and is not derivable from the public register." ]

Try it yourself

Real calls against the live API below, not canned examples. Keep the pre-filled identifier or paste your own company number or name.

Same server, in your own agent:

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

uvx registry-mcp

Install in VS Code Install in VS Code Insiders Install in Cursor

Give it the register — one line

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

Hosted at api.foretak.dev: no account and no key for any of the three countries, and 60 requests a minute. Plain REST works the same way — curl https://api.foretak.dev/v1/GB/company/00445790.

uvx registry-mcp or npx registry-mcp runs the same server yourself, over stdio. Norway needs no credential; a self-hosted GB needs a free Companies House key and SE a Bolagsverket OAuth 2 client pair — without them those two countries answer upstream_error naming the missing variable, and every other country keeps working.

Three registers, one shape

Three registers that agree on almost nothing about how they say it. Norway derives “active” from four separate brreg flags; the UK reads one published status field; Sweden has no status field at all, and it’s inferred from three independent signals. All three come back as status: "active", with status_detail giving the sentence behind it.

Below is what one of the three looks like in full. Norway and Sweden return the same fifty-five field names against the same shape — what differs is what each register has to fill in.

$curl -s https://api.foretak.dev/v1/GB/company/00445790
1{
2"country": "GB",
3"registry": "companies-house",
named on every response
4"id": "00445790",
5"name": "TESCO PLC",
6"legal_form": "Public limited company",
7"status": "active",
one enum, three countries
8"status_detail": "Active on the Companies House register.",
the sentence behind the enum
9"is_active": true,
10"registered_at": "1947-11-27",
11"vat_registered": null,
null — not published, never "no"
12"industry_codes": [{ "code": "47110", "scheme": "SIC 2007" }],
13"published_deadlines": [
14  { "kind": "annual_accounts", "due_date": "2027-08-26",
15    "source": "accounts.next_accounts.due_on" },
the register’s own figure, not a calculation
16  { "kind": "confirmation_statement", "due_date": "2027-07-02", ... }
17],
18"confidence": 1.0,
19"confidence_basis": "exact identifier lookup in the Companies House register",
why this is the right company
20"fetched_at": "2026-09-06T22:40:28Z",
21"source_url": "https://find-and-update.company-information.service.gov.uk/company/00445790",
22"license": "Crown copyright — Companies House public register, free to re-use"
with source_url: enough to cite it
23}
200 · companies-house · 55 fields returned, 17 shownCrown copyright — free to re-use

Sweden’s dates are computed, not quoted

Bolagsverket publishes no filing calendar, so both Swedish deadlines are derived from statute — and the response names the provision in the same breath as the date.

general_meeting  2027-06-30
aktiebolagslagen 7 kap. 10 §

annual_accounts   2027-07-31
årsredovisningslagen 8 kap. 6 §

Both assume a financial year ending 31 December — Bolagsverket’s free dataset doesn’t publish the real one. If it differs, both dates move by the same number of months.

An honest 501

Bolagsverket’s free API has no name search — not the register, the API. Ask it by name and you get a refusal, not a guess.

501 not_implemented
"Bolagsverket’s free API cannot
search by company name."

The hint names lookup_company with the organisationsnummer, validate_company_id to check the shape first, and Bolagsverket’s downloadable register files for a real name search.

Five tools, plus two connector aliases

All read-only. Nothing here writes to a register, or anywhere else.

lookup_companythe full report, by national identifier
search_companyby name — the UK and Norway; Sweden’s register API has no name search, and says so
company_deadlinesthe next filing deadline of each kind, quoted or computed
validate_company_idis it well-formed — no network call
list_countrieswhich registers can answer right now
search / fetchChatGPT connector aliases for the two above

Seven tools, not fifty. Tool-selection accuracy degrades once an agent is carrying more than about thirty, and some clients cap near forty.