RegistrumMCP
Use RegistrumMCP to query enriched UK company data from Companies House without managing API keys, rate limits, or iXBRL parsing.
Search for UK companies by name to get company numbers.
Fetch company profiles with status, age, SIC descriptions, and overdue flags.
Retrieve structured financials parsed from iXBRL (turnover, net assets, profit/loss, employees, etc.).
Get current and past officers/directors with roles, appointment history, and other company appointments.
Check ECCTA identity-verification compliance for directors and PSCs (verified, pending, overdue).
Get PSC registers with decoded control types and verification status.
Resolve PSC ownership chains to ultimate beneficial owners, including termination reasons.
Map director networks to depth 2 for shared directors and corporate interlocks.
Use get_bundle to fetch profile, compliance, financials, PSCs, and directors in one call.
Run via a hosted anonymous endpoint or locally with an API key in any MCP-compatible client.
Registrum MCP Server
UK company data in your AI agent — without building Companies House plumbing.
No Companies House developer account, no rate-limit handling, no iXBRL parsing. Works in Claude Desktop, Claude Code, Cursor, and any MCP-compatible client.
Dependabot is enabled on all six Registrum repositories; as of 2026-10-08 there are zero open dependency alerts. See SECURITY.md.
Try it now — no signup, no key, no install
Point your client at the hosted endpoint and every tool answers with real data:
https://registrum.co.uk/api/mcp{
"mcpServers": {
"registrum": {
"url": "https://registrum.co.uk/api/mcp"
}
}
}That is the whole setup. Ask it "Who ultimately owns BrewDog?" and it will trace the ownership chain to the named individuals who hold control.
One thing worth knowing before you test it on a household name: companies listed
on a regulated market — Tesco, Rolls-Royce, most of the FTSE — are exempt from
the PSC regime, so their ownership chain is legitimately empty and
get_psc_chain says so rather than inventing a tree. Ownership questions are
interesting on private companies, which is where the register actually records
who is behind them.
The hosted endpoint has small daily caps, enough to see exactly what comes back. When you reach one, the tool tells you so and points at a free key; nothing silently degrades.
Related MCP server: companies-house-mcp
Three ways to use it
Try it - no key. Point your MCP client at
https://registrum.co.uk/api/mcpand ask about any UK company. No signup.Build with it - free key. 60 days of full access: every endpoint, no monthly cap, no card. After that the key stays free for light use.
Run on it - paid plan. When you need volume, premium endpoints or an SLA. Live prices and limits:
GET /v1/plans.
Why this instead of the Companies House API directly
Companies House publishes the raw register for free, and you can absolutely call it yourself. What you then own is the plumbing:
Doing it yourself | With Registrum |
Register for a CH developer key, manage OAuth | Nothing, or one |
600 requests/5min, and you handle the 429s | Server-side throttling on a higher negotiated budget |
Accounts arrive as iXBRL documents you must parse |
|
PSC control types are raw codes | Decoded to plain English |
Ownership chains: recurse yourself, handle cycles |
|
Director networks: N+1 queries across appointments |
|
Retry, cache, and survive CH outages yourself | 24h/7d caching, circuit breaker, stale-while-revalidate |
Other Companies House MCP servers make you bring your own CH key and hand back the raw response. This one does the enrichment.
Running it with your own key
Use a key to build on it (60 days of full access), or when you would rather run the server locally than call ours.
Claude Desktop — ~/.claude/claude_desktop_config.json
Cursor — .cursor/mcp.json (per project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"registrum": {
"command": "npx",
"args": ["-y", "@registrum/mcp"],
"env": { "REGISTRUM_API_KEY": "reg_live_..." }
}
}
}Get a free key — 60 days of full access, no card.
Tools
Tool | What you get |
| Find a company by name → company number |
| Profile, compliance, financials, PSCs and directors in one call - start here |
| Profile: status, age, SIC descriptions, overdue flags |
| Turnover, net assets, profit/loss, employees — parsed from iXBRL, in GBP |
| Current board with appointment history across all their companies |
| Persons with Significant Control, control types in plain English |
| Ownership traversed to ultimate beneficial owners, with termination reasons |
| ECCTA identity-verification status — who has verified, who is pending, who is overdue |
| Companies connected by shared directors, to depth 2 |
On get_bundle
Most questions about a company need several of these views at once. get_bundle
returns them in a single request: one call and one credit instead of five,
and one round trip instead of five. Pass include to fetch a subset, or omit it
for all five sections.
Each section carries exactly what its own endpoint returns, because the bundle is composed from those same handlers rather than reimplemented - so plan gates, caching and the ECCTA rules behave identically either way.
A null section is not an error. Financials come back null for a company that has filed no machine-readable accounts, and compliance requires a Pro plan. Only a missing company is an error, and that is a 404. Report a null section as "not available", never as an absence of the underlying fact.
On get_compliance
The Economic Crime and Corporate Transparency Act requires every UK director and PSC to verify their identity with Companies House. Enforcement begins 18 November 2026, after which unverified officers can block filings.
The tool returns verified / pending / overdue counts plus each unverified person and their individual deadline. It deliberately distinguishes pending (deadline not yet reached — not a failure) from overdue (missed). Treating those as the same thing is the single easiest way to report a compliant company as non-compliant.
Example prompts
"Is Tesco PLC compliant with ECCTA director verification, and who still needs to verify?"
"Pull the last filed financials for 00445790 and tell me if turnover grew."
"Who ultimately owns BrewDog? Trace the ownership chain to the individuals."
"Which companies share directors with Barratt Developments?"
"Search for 'Monzo' and show me status, incorporation date and directors."
Plans
The anonymous endpoint needs no account at all. A free key gives 60 days of full access, then stays free for light use; paid tiers add volume, premium endpoints such as PSC chain traversal and the ECCTA compliance endpoint, and an SLA.
Prices and quotas are served live from GET /v1/plans —
that endpoint is the source of truth, so this README does not duplicate the
numbers and cannot go stale against them. Human-readable version at
registrum.co.uk.
Notes
Company numbers are zero-padded 8-character strings:
00445790,SC000268.Responses are JSON, cached server-side (24h profiles/directors, 7d financials).
The hosted endpoint is stateless and anonymous: it stores no account, and rate limiting is keyed on a hash of the calling IP rather than anything about you.
The npm package sends
User-Agent: @registrum/mcp/<version>so we can see which features developers actually use. No telemetry runs on your machine.
Available Tools
9 toolsget_bundleGet a whole company in one requestAInspect
Get several views of one UK company in a single request: profile, ECCTA compliance, financials, PSCs and directors. Prefer this over calling get_company, get_compliance, get_financials, get_psc and get_directors separately - it returns the same data for one API call and one credit instead of five, and in a single round trip. Pass include to fetch only the sections you need; omit it to get all five. The profile is always returned. Partial results are normal and are not errors: any section can come back null when it is unavailable for that company or not included in the caller's plan - financials are null for a company that has filed no machine-readable accounts, and compliance requires a Pro plan. Report a null section as 'not available', never as a failed lookup or as an absence of the underlying fact. Only a missing company is an error, and that is a 404. Each section carries exactly what its own endpoint returns, including ECCTA verification_status on individuals, so the pending-versus-overdue rules apply here too.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Sections to fetch. Omit for all five. Valid values: profile, compliance, financials, psc, directors. The profile is always included regardless. | |
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly. It discloses that partial results are normal, null sections mean 'not available' rather than failure, only a missing company is an error and produces a 404, compliance requires a Pro plan, and ECCTA verification_status rules apply to individuals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the core purpose is front-loaded, followed by usage preference, parameter guidance, null semantics, and error behavior. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, this description is remarkably complete. It explains what the response contains, how to interpret missing sections, when to use alternatives, and what constitutes an actual error, leaving no critical ambiguity for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds meaning beyond the schema: omitting include fetches all five sections, the profile is always returned, and each section matches what its standalone endpoint returns. This gives the agent the behavioral context needed to choose the right parameter combination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: getting several views of one UK company in a single request, explicitly listing profile, compliance, financials, PSCs, and directors. It clearly differentiates itself from the individual sibling tools by positioning itself as the aggregate request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to prefer this over calling get_company, get_compliance, get_financials, get_psc, and get_directors separately, and explains the benefit: one API call, one credit, one round trip. It also instructs when to use the include parameter versus omitting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_companyGet company profileAInspect
Get an enriched profile for a UK company by its Companies House number. Returns name, status, type, incorporation date, registered address, SIC codes with descriptions, accounts status, confirmation statement status, and derived fields like company_age_years and accounts.overdue that are not available from the raw Companies House API.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It explicitly states that the tool returns an enriched profile and lists returned fields, including derived fields like company_age_years and accounts.overdue that are not available from the raw Companies House API. The read-only nature is clear from 'Get', and no contradictory side effects are implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The purpose is front-loaded, and the detailed field list in the second sentence earns its place because it tells the agent exactly what data will be returned and highlights the unique derived fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter get tool with no output schema, the description is largely complete: it identifies the required input, the company jurisdiction, and the returned profile contents. It does not cover error or not-found behavior, but that is a minor gap for a low-complexity lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents the parameter thoroughly with pattern, example, and zero-padding instruction. The description only says 'by its Companies House number', adding little beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('enriched profile for a UK company by its Companies House number'), and enumerates the exact fields returned. This clearly distinguishes it from siblings like get_financials, get_directors, and get_compliance, which target narrower aspects of a company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear that the tool is for retrieving a company profile when the Companies House number is known, and the field list implies when it is useful. However, it does not name any alternatives or exclusions, such as using search_company when the number is unknown, so usage guidance remains implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_complianceCheck ECCTA identity-verification complianceAInspect
Check a UK company's ECCTA identity-verification status - who has verified their identity with Companies House, who is still pending, and who is overdue. The Economic Crime and Corporate Transparency Act requires every director and PSC to verify their identity; enforcement begins 18 November 2026, after which unverified officers can block filings. Returns per-company counts (directors_total, directors_verified, directors_pending, directors_overdue) and the same for PSCs, plus unverified_persons with each person's name, role, status and their individual deadline. IMPORTANT: 'pending' means the deadline has not yet passed - it is NOT a failure and must not be reported as one. Only 'overdue' means a deadline was missed. Requires a Pro plan or above. Cached for 24 hours.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly discloses that the tool returns counts and unverified_persons details, clarifies the critical distinction between 'pending' and 'overdue', and mentions the 24-hour caching and Pro plan requirement. This is thorough behavioral disclosure beyond just naming the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds necessary context, return shape, important caveats, and operational details. Each sentence earns its place; the legal context is not filler because it explains the relevance of 'overdue' and enforcement. Despite length, it remains focused and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description thoughtfully explains exactly what will be returned and how to interpret ambiguous terminology. It covers plan requirements, caching, and deadline implications. The single-parameter tool is simple, and the description leaves little an agent needs to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage of the single parameter, including format, example, and zero-padding guidance. The description adds nothing new about company_number beyond implying it identifies the company. Baseline 3 is appropriate because structured schema already documents the parameter well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly identifies the resource (a UK company's ECCTA identity-verification status) and the specific action (check). It distinguishes itself from siblings by focusing on compliance/verification state rather than raw company or officer data. The return fields are named, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is appropriate: whenever a director or PSC's ECCTA identity-verification status is needed. It does not explicitly name alternatives or exclusion conditions, but the compliance-specific language makes the intended use obvious. The Pro plan requirement is also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_directorsGet company officers (directors and secretaries)AInspect
Get the current and past officers for a UK company. Despite the tool name, not every entry is a director: the list is the full officer register, so each entry carries an officer_role such as 'director', 'secretary', 'corporate-secretary' or 'llp-member', plus an is_board_director boolean that is false for secretaries. Report each person by their own officer_role - never describe the whole list as directors. Each officer includes name, officer_role, is_board_director, appointment date, resignation date (if applicable), nationality, occupation, month and year of birth, ECCTA verification status, and a list of other companies they are or were appointed to, each with its own officer_role. This gives you a full picture of an officer's corporate history in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure burden and does so exceptionally well. It reveals the critical behavior that not every entry is a director, lists example officer_role values, explains the is_board_director flag, and instructs the agent to report each person by their actual role. It also discloses the nested list of other companies, making response behavior predictable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by necessary clarifications and field enumeration. It is longer than minimal, but each sentence adds value, especially the role-reporting instruction that prevents a common misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description compensates by listing each officer's fields, roles, and the nested other-company appointments, while also warning about the director misnomer. Minor gaps remain, such as pagination and error behavior, but they are not critical for a single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage, including a description, pattern, and an example for company_number. The tool description adds no additional parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('current and past officers for a UK company'), and explicitly distinguishes the tool from its misleading name by clarifying it returns the full officer register, not just directors. This clearly separates it from related sibling tools like get_psc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context about scope: current and past officers, full register, and corporate history, so an agent can infer when to use it for officer-related queries. It does not explicitly exclude alternatives such as get_psc or get_network, but the described data makes the use case evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financialsGet company financialsAInspect
Get structured financial data for a UK company, parsed from its iXBRL accounts filed at Companies House. Returns revenue, cost of sales, gross profit, operating profit, net profit, fixed assets, current assets, total equity, net assets, creditors, and average employees for the current and prior reporting year. Also includes accounts_type (full, abbreviated, micro, dormant or unknown) and a data_quality block indicating which fields were extracted and which were absent. period_end is the end of the accounting period the figures cover (the year the accounts end), NOT the date the accounts were filed; the filing date is data_quality.filed_on. Other data_quality fields: filing_type (Companies House form code: AA, AAMD or AC(NI)), period_end_source and accounts_type_source (how those two values were determined), and accounts_description_code (the verbatim Companies House code, e.g. unaudited-abridged, micro-entity). Unaudited-abridged, small and audit-exemption-subsidiary filings are abbreviated, not full, and carry no profit and loss (check has_profit_loss). accounts_type is unknown when it could not be determined; do not assume full. The response can be available: false with an unavailable_reason: image_pdf (accounts filed as a scanned PDF, common for large companies such as Tesco), no_ixbrl_filings (no digital filing), or dissolved. That means no figures could be extracted; it does not mean the company has no accounts. Cached for 7 days.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so richly: it discloses the 7-day cache, the available:false failure modes with three distinct reasons (image_pdf, no_ixbrl_filings, dissolved), and explicitly warns that unavailable does not mean no accounts exist. It also flags that abbreviated filings carry no P&L and that accounts_type unknown must not be assumed to be full — behavior an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the returned fields before the caveats, and almost every sentence carries unique information. It is dense and long, with the data_quality field breakdown approaching output-schema detail, but with no output schema present that detail is arguably load-bearing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns, and it enumerates the key figures, the accounts_type/data_quality blocks, the period_end-vs-filed_on distinction, and the unavailable states. An agent has enough to interpret results correctly without further documents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required parameter, so the schema already documents company_number fully, including the zero-padding rule. The description adds no parameter-level guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get structured financial data for a UK company') and further scopes it to iXBRL accounts filed at Companies House, which clearly separates it from siblings like get_company or get_compliance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the data source and enumerated fields, but there is no explicit when-to-use vs when-not guidance and no alternative sibling is named (e.g. get_company for profile data). The caveats about abbreviated filings and unavailable:false imply when results will be empty, which is helpful but not framed as routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_networkGet director networkAInspect
Map the corporate network connected to a UK company via shared directors. Returns all companies connected through shared board members, up to the specified depth. Each connected company includes its name, number, status, and the directors it shares with the focal company. Useful for identifying corporate group structures, related party relationships, and director interlocks.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Traversal depth: 1 = direct connections only, 2 = connections of connections (default 1). Depth 2 can return many results for large companies. | |
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly indicates a read-only behavior ('Map... Returns'), explains traversal semantics ('all companies connected through shared board members, up to the specified depth'), and describes the output fields. It does not mention pagination or de-duplication, but the schema's depth warning helps cover volume concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: one sentence for purpose, one for output and traversal, and one for use cases. Each sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description compensates by enumerating returned fields (name, number, status, shared directors) and explaining the depth parameter's effect. It lacks explicit error or pagination behavior, but for a simple two-parameter read tool, the description plus schema provide sufficient context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters already having detailed descriptions. The tool description adds only generic references like 'focal company' and 'specified depth,' which do not meaningfully extend the schema's parameter documentation. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Map the corporate network') and the resource ('connected to a UK company via shared directors'). It distinguishes itself from siblings like get_directors by focusing on the interconnected network of companies rather than a single company's director list. The scope and output are explicitly described.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear use cases: 'identifying corporate group structures, related party relationships, and director interlocks.' It does not explicitly name alternative tools or state when not to use it, but the network-specific framing makes its applicability clear relative to single-entity siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pscGet persons with significant controlAInspect
Get the PSC (Persons with Significant Control) register for a UK company. Returns individuals, corporate entities, and legal persons who own 25%+ of shares, hold 25%+ of voting rights, or have significant influence or control. Each PSC includes decoded control types in plain English (e.g. 'Owns 25-50% of shares' instead of raw codes). Individual PSCs also carry ECCTA identity verification: verification_status (verified, pending, overdue or unknown), identity_verified, identity_verified_on, and verification_deadline. pending means that person's deadline has not yet passed and is not a compliance failure; unknown means Companies House publishes no record for them, an absence of data rather than a breach. Only overdue means a deadline was missed. Corporate entity PSCs carry none of the verification fields. Their company_number is set only for a confirmed Companies House registration and is otherwise null, so never treat a null as a missing value to look up. What they filed is in registry_number and registry_name, and registry_is_companies_house says how to read it: true is a Companies House registration, null means a number was filed but cannot be tied to the UK register (e.g. a foreign registry), false means no number was filed. kind can be unknown for a PSC type we do not classify, with Companies House's verbatim string in kind_raw. Also detects PSC exemptions for listed PLCs. Cached for 24 hours.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it explains caching (24 hours), that corporate PSCs carry no verification fields, the meaning of verification_status values (pending is not a failure, unknown is absence of data, only overdue is a breach), and the tri-state registry_is_companies_house. These are exactly the behavioral nuances an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before field semantics, and nearly every sentence earns its place by disambiguating a field value. It is a dense unbroken paragraph with no formatting for the many field-by-field rules, and a couple of clauses (e.g. the null-lookup warning) restate the same point, so it is slightly heavier than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must supply both the return shape and the behavioral profile; it does, covering PSC types, verification fields, registry fields, kind/kind_raw fallback, exemptions, and cache lifetime. An agent has what it needs to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%, so the schema already documents company_number, its pattern, and zero-padding. The description adds no syntax or format detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Get the PSC register for a UK company') and the body scopes exactly what is returned (individuals, corporates, legal persons with 25%+ control). It never distinguishes itself from the closely related sibling get_psc_chain, so an agent facing both must guess, which keeps it off a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the domain: call it to obtain a company's PSC register. There is no explicit when-to-use, no when-not, and no routing to alternatives such as get_psc_chain or get_directors, which is a real gap given the overlapping sibling. The embedded 'never treat a null as a missing value to look up' is data-interpretation advice rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_psc_chainResolve PSC ownership chain to find ultimate beneficial ownersAInspect
Trace the full ownership chain for a UK company by recursively following corporate entity PSCs. Returns a tree showing who ultimately controls the company - natural persons (UBOs), foreign entities, or legal persons - along with why each branch terminated. Each node has a terminal_reason: natural_person, foreign_entity, legal_person, super_secure, unverified_registry, unknown_kind, depth_limit, not_found, cycle_detected, or psc_exempt. Two of those are easy to misread: unverified_registry means a registration number was filed but cannot be tied to the Companies House register (a foreign registry, or one we do not recognise), which is a finding about the ownership structure and not an error or an outage; unknown_kind means Companies House returned a PSC type we do not classify (kind is then unknown), with the raw value in kind_raw. Both are findings, not errors. A corporate node's company_number is set only for a confirmed Companies House registration, otherwise null; the number it filed is in registry_number with registry_name, and registry_is_companies_house is true (Companies House), null (a number was filed but cannot be tied to the UK register) or false (no number filed). ECCTA identity verification: every individual node, at any depth including the ultimate beneficial owners this chain exists to find, carries verification_status (verified, pending, overdue or unknown), identity_verified (true, false for overdue only, or null otherwise), identity_verified_on, and verification_deadline. IMPORTANT: pending means that person's own deadline has not yet passed - it is not a compliance failure and must not be reported as one. A status of unknown means Companies House publishes no record for them, which is an absence of data rather than a breach. Only overdue means a deadline was missed. Corporate, legal-person and super-secure nodes carry none of these fields, so never describe a company itself as having unverified identity. chain_metadata reports how many companies were resolved and the total API credit cost. Use this for KYB (Know Your Business) checks, AML screening, or any task requiring beneficial ownership beyond the immediate PSC layer.
| Name | Required | Description | Default |
|---|---|---|---|
| max_depth | No | Maximum chain depth to traverse (1-10, default 5). Each level costs 1 upstream API call per corporate entity found. | |
| company_number | Yes | Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discharges most of it: it enumerates every terminal_reason, pre-empts two common misreadings (unverified_registry, unknown_kind) as findings rather than errors, explains company_number nullability, and warns against reporting 'pending' verification as a breach. It does not state auth/permission needs or read-only nature, and rate limiting is only hinted at via credit cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a dense wall of text that repeats the same idea ('Both are findings, not errors' / 'which is a finding ... and not an error or an outage'). The terminal_reason semantics earn their space, but the redundancy costs readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must document the return value, and it does so thoroughly: chain_metadata, terminal_reason values, per-node fields (company_number, registry_number, verification_status group), and which node types lack verification fields. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the per-level API cost of max_depth and the zero-padding rule for company_number. The description adds no parameter-level detail beyond what the schema supplies, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Trace the full ownership chain... by recursively following corporate entity PSCs') and describes the return shape (a tree terminating in UBOs, foreign entities, or legal persons). It also separates itself from the sibling get_psc by framing the value as 'beneficial ownership beyond the immediate PSC layer'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context ('Use this for KYB checks, AML screening, or any task requiring beneficial ownership beyond the immediate PSC layer'), which implicitly routes agents away from get_psc for deep chains. There is no explicit when-not-to-use or cost-based exclusion beyond the chain_metadata cost note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companySearch for companiesAInspect
Search for UK companies by name. Returns a list of matching companies with their company number, status, type, and registered address. Use this first when you only have a company name and need its company number.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 20) | |
| query | Yes | Company name or keywords to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It does disclose the return shape: a list of matching companies with company number, status, type, and registered address. However, it does not describe edge-case behavior such as partial matching, empty results, ordering, or pagination, which limits transparency for such a sparse tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loads the core action and result, and adds a clear usage note in only two sentences. Every sentence contributes useful information with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list-search tool with two well-documented parameters, the description is mostly complete: it states the target population, the result fields, and the primary use case. Since there is no output schema, the described return fields are helpful. It could be slightly stronger by noting behavior when multiple companies share similar names, but that is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains both parameters. The description adds little beyond reinforcing that the search is by company name and that the company number is a key output. It does not introduce new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Search'), a specific resource ('UK companies'), and the key output (company number, status, type, registered address). The phrase 'Use this first when you only have a company name and need its company number' distinguishes it from the get_* sibling tools that expect a company identifier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use the tool: when only a company name is available and a company number is needed. It does not list explicit exclusions or compare with alternatives, but the usage context is clear enough to route decisions correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v2.0.7- Added
get_bundle
8 tool updates
v2.0.5- Changed
get_company2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Added
get_compliance - Changed
get_directors3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / company_number / descriptionPrevious value: -"Companies House company number, e.g. '00445790' for Tesco PLC"New value: +"Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits."
- Changed
get_financials3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / company_number / descriptionPrevious value: -"Companies House company number, e.g. '00445790' for Tesco PLC"New value: +"Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits."
- Changed
get_network3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / company_number / descriptionPrevious value: -"Companies House company number, e.g. '00445790' for Tesco PLC"New value: +"Companies House company number, e.g. '00445790' for Tesco PLC. Numeric-only numbers should be zero-padded to 8 digits."
- Added
get_psc - Added
get_psc_chain - Changed
search_company3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return (default 10)"New value: +"Maximum number of results to return (default 20)"
5 tool updates
v1.0.2- First observed
get_company - First observed
get_directors - First observed
get_financials - First observed
get_network - First observed
search_company
TDQS
Scored across 9 tools
Each tool targets a distinct data view (financials, compliance, directors, PSC, PSC chain, network, profile, search), and the psc vs psc_chain boundary is clearly explained as immediate layer vs recursive ownership tracing. The only real overlap is get_bundle duplicating get_company/get_financials/get_compliance/get_psc/get_directors, though the description explicitly tells the agent to prefer it, which mitigates most misselection risk.
All nine tools follow a consistent snake_case verb_noun pattern: get_* for entity retrieval (get_financials, get_compliance, get_directors, get_psc, get_psc_chain, get_network, get_bundle, get_company) and search_company for lookup. No camelCase mixing or vague bare verbs.
Nine tools is well within the ideal 3-15 range and each one maps to a genuine, non-redundant Companies House data domain. The bundle tool is a deliberate efficiency consolidation rather than bloat.
The surface covers profile, name search, financials, ECCTA compliance, officers, PSC register, recursive ownership chain, director networks, and a batch bundle - a strong read-only lifecycle for a UK company data provider. Notable gaps remain: no filing history/documents, charges/mortgages, or confirmation statement detail, but agents can work around these for most KYB/AML tasks.
Maintenance
Related MCP Connectors
Official company and director data: search, profiles, filings, and name normalization.
UK public-record company intelligence: Companies House, payments, contracts, registers, watch lists
191Companies House MCP — UK statutory company registry (BYO key)
UK company records from Companies House, with alerts on new filings, officer and status changes.
Related MCP Servers
- AlicenseCqualityFmaintenanceAccess UK company data through the Companies House API directly in MCP clients, with 45+ tools for company info, search, officers, filing history, ownership, and charges.3744 npm28AGPL 3.0
- AlicenseAqualityCmaintenanceEnables AI assistants to search and retrieve UK Companies House data including company profiles, officers, and filing history via the official API.4338 npm1MIT
- FlicenseBqualityDmaintenanceProvides access to UK Companies House public data, enabling search and retrieval of company profiles, officers, filing history, and more through natural language queries.12-
- AlicenseNot gradedqualityDmaintenanceEnables querying UK company data including search, profiles, officers, filings, and persons with significant control via Companies House API.338 npmMIT