RegistrumMCP
This server provides enriched UK company data from Companies House, handling complex details like API rate limits, iXBRL parsing, and caching, so you don't have to.
Available Tools:
Search for companies (
search_company): Find UK companies by name to get their company number, status, type, and registered address.Get company profile (
get_company): Detailed profile with status, incorporation date, SIC codes with descriptions, accounts status, company age, overdue flags.Access financial data (
get_financials): Structured financials from iXBRL filings including turnover, net assets, profit/loss, employees, and balance sheet items for current/prior years, plus data quality indicators.Retrieve director information (
get_directors): Current and past directors with appointment history, nationality, residence, and cross-company appointments.Map director networks (
get_network): Discover connections via shared directors up to depth 2, revealing corporate groups and interlocks.
Key Features: Simplified single API key access, automated rate-limit handling with higher budget, pre-parsed iXBRL data, 24h/7d caching with stale-while-revalidate, data enrichment (decoded SIC and control types, derived stats), and circuit breakers for robustness.
Note: The README describes additional tools for Persons with Significant Control (get_psc), ownership chains (get_psc_chain), and ECCTA compliance checks (get_compliance), but these are not yet exposed in the current server schema.
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.
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 free anonymous tier is generous on the everyday tools and deliberately small on the expensive ones — a couple of ownership-chain traces and financial statements per day, which is enough to see exactly what comes back before you decide anything. When you reach a cap, the tool tells you so and points at a free key; nothing silently degrades.
Related MCP server: Companies House MCP
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 when you want the anonymous caps lifted, 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 — 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 raises the caps, and paid tiers add volume, PSC chain traversal and the ECCTA compliance endpoint.
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) and a data_quality block indicating which fields were extracted and which were absent from the filing. 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 provided, the description carries the full burden of behavioral disclosure and does well: it reveals the iXBRL source, the 7-day cache, the accounts-type classification, and the data_quality block that indicates missing fields. It does not cover failure modes such as missing filings, but the data_quality block partially addresses that concern.
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 layers specific return fields, metadata, and cache behavior. Every sentence adds distinct value and the length is appropriate given there is no output schema to document the return shape.
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 only one parameter, no output schema, and no annotations, the description is largely complete for invocation: it specifies input, return contents, data_quality reporting, and caching. It could be more explicit about currency/units and the exact nested shape of data_quality, but those are secondary to correct invocation.
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 already provides 100% coverage for the single parameter, company_number, including pattern, example, and zero-padding guidance. The description adds little beyond confirming the tool applies to UK companies, 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 names a specific verb and resource ('Get structured financial data for a UK company') and then enumerates the exact fields returned, the source filing type, and the extra metadata blocks. This clearly distinguishes it from the sibling tools like get_company, get_directors, or 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?
The description makes it clear what data the tool returns, so an agent needing financial statements can infer it is the right choice. However, it never contrasts this tool with its siblings or states when not to use it, leaving the alternative selection to inference rather than explicit 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 include their company number for ownership chain traversal, and carry none of the verification fields. 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 it delivers. It discloses decoded control types, ECCTA verification fields, the precise meaning of pending vs unknown vs overdue, that corporate entities carry a company number and no verification fields, detection of PSC exemptions, and a 24-hour cache. This goes far beyond a simple 'returns PSC data' and gives the agent a clear model of tool behavior.
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?
Although the description is lengthy, every sentence serves a purpose: core function, return types, control-type decoding, verification status semantics, corporate vs individual differences, exemptions, and caching. It is front-loaded with the primary purpose and then layers detail in a logical order. No filler or redundancy.
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?
Without an output schema, the description must explain return values, and it does so thoroughly. It covers PSC categories, control types, verification status fields and their interpretations, corporate entity specifics, exemptions, and caching. For a complex tool returning varied entity types, this is sufficient for an agent to cal it correctly and interpret the results.
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 documents company_number with an example and zero-padding guidance, and schema description coverage is 100%. The description does not add any additional parameter-level meaning or nuance, so it stays at the baseline 3. It correctly focuses on output behavior rather than re-explaining the parameter.
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 opens with a specific verb+resource: 'Get the PSC (Persons with Significant Control) register for a UK company.' It then enumerates exactly what is returned (individuals, corporate entities, legal persons) with ownership thresholds, which clearly distinguishes it from sibling tools like get_directors or get_company. The content is unambiguous and informative.
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 provides clear context on what the tool returns, but it never explicitly states when to use this tool vs alternatives such as get_psc_chain or get_company. No exclusion criteria or alternative routing is given. The usage scenario is implied by the specialization to PSC registers, but the agent is left to infer when this tool is the right choice.
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, with the raw value in kind_raw. 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?
No annotations are provided, so the description carries the full burden. It discloses recursive traversal behavior, the full set of terminal_reason values, including nuanced meanings for unverified_registry and unknown_kind, and details ECCTA identity verification fields with explicit warnings about pending not being a failure and never describing companies as having unverified identity. This goes far beyond a simple description, covering output structure and edge-case semantics.
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 long but every sentence earns its place: it starts with core purpose, enumerates terminal reasons, flags misinterpretations, details ECCTA fields, and closes with use cases. The structure is logical—purpose, behavior, caveats, use—without redundancy. It is dense with information and properly front-loaded.
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 the tool's complexity (recursion, multiple termination reasons, ECCTA status handling) and the absence of an output schema, the description covers all essential information: the tree structure, node fields, terminal_reason semantics, verification status meaning, and chain_metadata. It even pre-empts likely agent missteps. Nothing an agent needs to call or interpret the 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 coverage is 100% for both parameters; the schema already documents max_depth's range and per-company cost, and company_number's pattern and padding rule. The description adds no additional parameter detail beyond what the schema provides. The baseline of 3 is appropriate since the schema does the heavy lifting.
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 opens with a specific verb-resource pair ('Trace the full ownership chain') and immediately distinguishes itself from the immediate-PSC sibling by stating it returns a tree of ultimate beneficial owners. It explicitly contrasts with 'beyond the immediate PSC layer,' so an agent can tell it apart from get_psc without opening either schema.
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 final sentence states explicit use cases ('KYB checks, AML screening, or any task requiring beneficial ownership beyond the immediate PSC layer'), which both says when to use it and implicitly when not to (for immediate PSC layer). It also lists the terminal_reason values and clarifies their interpretation, so an agent knows when the tool is appropriate.
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 resource or workflow: search, profile, financials, officers, ECCTA compliance, PSC register, aggregated bundle, ownership chain, and director network. The only soft spots are get_psc vs get_psc_chain and get_bundle vs its component lookups, but the descriptions clearly separate immediate PSC returns from recursive tracing and the bundle from single-purpose calls.
All tools follow a consistent verb_noun pattern in snake_case: search_company, get_company, get_financials, get_directors, get_compliance, get_psc, get_bundle, get_psc_chain, get_network. Every name is predictable and clearly indicates the primary action and subject.
Nine tools is a well-scoped size for a UK company intelligence domain. Each tool earns its place by covering a distinct data domain, and get_bundle consolidates common lookups rather than adding redundant endpoints.
The tool set covers the core due-diligence journey: identify a company by name, retrieve its profile, financials, officers, PSC register, ECCTA compliance status, ownership chain, and director network. Minor gaps such as filing history, charges, and insolvency data are absent, but these are not essential to the primary KYB/AML workflows the server appears designed to support.
Maintenance
Related MCP Connectors
Official company and director data: search, profiles, filings, and name normalization.
Companies House MCP — UK statutory company registry (BYO key)
UK company records from Companies House, with alerts on new filings, officer and status changes.
1Company intelligence via UK Companies House and risk screening across 386 risk data sources.
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.3717 npm27AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables looking up UK companies, officers, ownership, filings, and running due diligence checks via the Companies House API, usable from AI tools like Claude or Cursor.15 npm13MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to search and retrieve UK Companies House data including company profiles, officers, and filing history via the official API.470 npm1MIT
- FlicenseBqualityCmaintenanceProvides access to UK Companies House public data, enabling search and retrieval of company profiles, officers, filing history, and more through natural language queries.12-