UK Due Diligence
This server provides comprehensive UK due diligence tools across five free, official public registers — Companies House, Charity Commission, HM Land Registry, The Gazette, and HMRC VAT — with no paywalls.
Company Investigations
Search companies by name/keyword with filters for status and type
Retrieve full profiles including status, filing compliance, overdue accounts, and outstanding charges
List officers/directors with appointment dates and a risk flag for those holding 10+ active appointments (nominee/phoenix director signal)
Retrieve beneficial ownership (PSC) chains, flagging offshore corporate owners
Disqualified Directors
Search for disqualified individuals by name
Retrieve full disqualification records including reason, Act/section cited, period, and associated companies
Charity Checks
Search the Charity Commission register by name/keyword
Retrieve full charity profiles including trustees, income/expenditure, insolvency flags, and governing document
Property Transactions
Search HM Land Registry Price Paid Index by postcode/address for recent sale transactions (England & Wales only)
Insolvency Notices
Search The Gazette for corporate insolvency notices (winding-up orders, administration, liquidation, etc.) filtered by date or type
Fetch the full legal text of any specific notice
VAT Validation
Validate UK VAT numbers against HMRC, returning trading name and address; discrepancies with Companies House are flagged as a due diligence signal
Unified Search & Fetch
Search all registers simultaneously in parallel and retrieve full structured records using prefixed IDs
Predefined Workflow Prompts
due_diligence: full company check (profile, officers, PSC, gazette, disqualification)charity_due_diligence: charity profile + insolvency checkdirector_check: individual disqualification status check
uk-due-diligence-mcp
Official-source UK due-diligence data for AI agents.
Search Companies House, Charity Commission, The Gazette and HMLR price-paid data, plus screen names against the OFSI, OFAC, EU and UN sanctions lists. Exposes atomic MCP tools for company ownership, officers, cross-company appointment history, secured charges, insolvency notices and related registry evidence — the consuming agent decides how to investigate, not the server.
Every data source is a legally-mandated register with a free official API. Zero paywalls.
Data sources
Register | API | Auth | Coverage |
Companies House |
| API key (free) | UK-wide |
Charity Commission |
| API key (free) | England & Wales |
HMLR Land Registry |
| None | England & Wales |
The Gazette |
| None (read) | UK-wide |
OFSI / OFAC / EU / UN sanctions | consolidated list files | None | International |
Related MCP server: yaml-ai-mcp
Quick start
Hosted (no install)
{
"mcpServers": {
"uk-due-diligence": {
"type": "http",
"url": "https://uk-due-diligence-mcp.fly.dev/mcp"
}
}
}Local (uvx)
{
"mcpServers": {
"uk-due-diligence": {
"type": "stdio",
"command": "uvx",
"args": ["uk-due-diligence-mcp"]
}
}
}See Configuration for the environment variables it needs.
Tools
Companies House
Tool | Description |
| Search by name/keyword, filter by status/type |
| Status, filing compliance, registered address, |
| Directors/secretaries; each carries an |
| Beneficial owners, PSC chain, overseas-corporate-PSC flag |
| Full appointment history for a person by |
| Complete secured-charge history: status, dates, secured parties, what each charge covers |
| Search disqualified directors by name |
| Full disqualification record: period, Act, associated companies |
Charity Commission
Tool | Description |
| Search by name, filter by registration status |
| Full record: trustees, income/expenditure, governing document |
HMLR Land Registry
Tool | Description |
| Price Paid Index sale transactions by postcode — not title ownership (see Limitations) |
The Gazette
Tool | Description |
| Corporate insolvency notices across the Gazette's notice-code taxonomy (codes 2401-2465) |
| Full legal wording of a specific notice |
Sanctions
Tool | Description |
| Screen a name against the OFSI/OFAC/EU/UN consolidated lists |
Cross-register
Tool | Description |
| Fan-out search across all registers — returns IDs (for ChatGPT deep research) |
| Fetch a structured record by ID returned from |
Examples
Resolve "TAS Engineering" to a company number and check whether it has any outstanding charges.→ company_search to find the company number, then company_charges for the full secured-debt picture (not just the has_charges summary).
Has Gareth Davies (director of company 06333469) been connected to any other companies, including ones that no longer exist?→ company_officers to get his officer_id, then officer_appointments to surface every company he's held an appointment at, current or historic.
Is "MEL Precision Limited" in the middle of insolvency proceedings, and what does that actually mean legally?→ gazette_insolvency to find the notices, then gazette_notice to read the full legal wording before drawing conclusions from the notice label alone.
Screen "Acme Trading Ltd" and its officers against sanctions lists.→ company_officers for the officer names, then sanctions_screen against the company name and each officer.
Limitations
Things worth knowing before trusting output:
land_title_searchreturns Price Paid transactions, not ownership. It does not return current proprietor/title data — HMLR's Price Paid Index only records historic sale transactions.Sanctions screening is exact/alias matching, not compliance clearance. A company/entity legal name matches reliably; person names with transliteration variants may not. An empty result is not a guarantee of clearance, and a hit on a common name may need disambiguation.
has_charges: nullmeans the check could not be confidently completed — a charges-endpoint outage, or a charge with an unrecognized status. Treat it as unresolved, not as "no charges."officer_appointmentsreturns historical relationships. Companies House doesn't auto-resign a director when a company enters insolvency — checkcompany_statuson each appointment, not justresigned_on.Official-source data can be incomplete or delayed. These are the same registers a human would check, with the same latency and gaps.
Configuration
Variable | Required for | Where to get it |
| All Companies House tools | |
| Charity Commission tools |
HMLR, The Gazette, and the sanctions lists require no credentials.
Project structure
uk-due-diligence-mcp/
├── server.py # FastMCP init, tool/resource registration, transport config
├── companies_house.py # company_search/profile/officers/psc, officer_appointments, company_charges
├── disqualified.py # disqualified_search, disqualified_profile
├── charity.py # charity_search, charity_profile
├── land_registry.py # land_title_search (SPARQL Price Paid Index)
├── gazette.py # gazette_insolvency, gazette_notice
├── sanctions.py # sanctions_screen (OFSI/OFAC/EU/UN consolidated lists)
├── search_fetch.py # search, fetch (cross-register fan-out)
├── models.py # Pydantic v2 output models
├── http_client.py # Shared httpx clients, retry backoff, error formatting
├── fly.toml
├── Dockerfile
├── pyproject.toml
└── .env.exampleLicence
MIT
Available Tools
18 toolscharity_profileGet Charity ProfileARead-onlyIdempotentInspect
Fetch the full Charity Commission profile for a charity number.
Returns trustees, latest income/expenditure, insolvency flags, governing document type, classifications, and countries of operation. Use charity_search first to find the charity number.
| Name | Required | Description | Default |
|---|---|---|---|
| charity_number | Yes | Charity Commission registration number (e.g. '1234567'). Returned by charity_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | No | Registered address of the charity (joined address lines). |
| insolvent | No | True if the charity is flagged as insolvent. |
| reg_status | No | Registration status code ('R', 'RM'). |
| charity_name | No | Registered charity name. |
| charity_type | No | Charity type. |
| latest_income | No | Latest filed annual income in GBP. |
| trustee_names | No | Trustees on record. Truncated to 30 entries. |
| charity_number | Yes | Charity registration number. |
| who_what_where | No | Who/What/Where classification entries. The list may be truncated truncated to 50 entries. |
| reg_status_label | No | Human-readable registration status. |
| in_administration | No | True if the charity is in administration. |
| latest_expenditure | No | Latest filed annual expenditure in GBP. |
| trustee_names_total | No | Total trustees upstream before truncation. |
| date_of_registration | No | Date of first registration. |
| who_what_where_total | No | Total classification entries upstream before truncation. |
| charity_co_reg_number | No | Companies House number for charities also registered as companies (Charitable Incorporated Organisations, etc.). |
| countries_of_operation | No | Countries the charity operates in (capped at 10 upstream). |
| trustee_names_truncated | No | True if the trustee list was truncated. |
| who_what_where_truncated | No | True if the classification list was truncated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, and idempotent. The description adds meaningful behavioral context about what data to expect (trustees, income/expenditure, insolvency flags) and that it returns a 'full' profile. This goes beyond the annotations without contradicting them.
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?
Two sentences, front-loaded with the core action, and no filler. The second sentence efficiently lists return contents. Every word earns its place.
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 simple one-parameter schema and availability of an output schema, the description covers the essential context: what it fetches, what it returns, and the prerequisite step. No significant gaps remain.
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 parameter description already explains the format and origin ('Returned by charity_search'). The tool description reinforces the usage but doesn't add new meaning beyond the schema beyond implying the parameter is central to the lookup.
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 the specific verb 'Fetch' with a clear resource ('full Charity Commission profile') and the input parameter ('charity number'). It lists concrete data fields returned (trustees, income/expenditure, insolvency flags, etc.), which distinguishes this from sibling tools like charity_search or company_profile.
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?
Explicitly instructs to use charity_search first to obtain the charity number, which is a clear prerequisite and aligns with the sibling tool. This tells the agent when to use this tool versus the search alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charity_searchSearch Charity Commission RegisterARead-onlyIdempotentInspect
Search the Charity Commission register of England and Wales by name or keyword.
Returns matching charities with registration number, status, and
registration date. Use charity_profile for full details once you
have the charity number. The upstream searchCharityName endpoint
returns the full list in one shot — pagination is applied
client-side via offset/limit. A query that matches nothing is a
successful empty result (charities: []), not an error — the
upstream endpoint signals "no matches" with an HTTP 404, which is
translated back into an empty result here rather than surfaced as
a not-found failure.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return in this page. Default 20; raise to 100 for bulk views. | |
| query | Yes | Charity name or keyword to search for | |
| offset | No | Number of items to skip before this page. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Max items requested for this page. |
| query | Yes | Search term applied. |
| total | Yes | Total matches returned by upstream. |
| offset | Yes | Number of items skipped before this page (client-side). |
| has_more | Yes | True if more items may exist beyond this page. Re-call with offset=offset+returned to continue. |
| returned | Yes | Items actually returned on this page. |
| charities | No | Matching charity records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description discloses non-obvious upstream behavior: the endpoint returns the full list in one shot, pagination is applied client-side via offset/limit, and an upstream HTTP 404 is translated into an empty result rather than a failure. This gives the agent valuable operational context.
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 only high-value details: the sibling alternative, pagination behavior, and empty-result semantics. Each sentence earns its place without 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?
Given the output schema exists, return values don't need elaboration. The description covers the search scope, alternative tool, pagination mechanics, and error semantics, making it fully sufficient for an agent to call this tool correctly without further ambiguity.
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 describes all three parameters (query, limit, offset) with full coverage, so the description adds no new parameter detail. The mention of client-side pagination indirectly supports offset/limit semantics, but it doesn't expand beyond what the schema already states; 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 states a specific verb ('Search'), a clear resource (the Charity Commission register of England and Wales), and the input mode ('by name or keyword'). It also distinguishes itself from 'charity_profile' by noting the latter is for full details after obtaining the charity number, making sibling differentiation explicit.
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 explicitly tells the agent to use 'charity_profile' for full details once the charity number is known, providing a clear alternative and the condition for choosing it. It also clarifies the empty-result behavior, so the agent knows how to interpret a no-match response versus an error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_chargesGet Company ChargesARead-onlyIdempotentInspect
Fetch the complete Companies House charge history for a company.
Returns every registered charge (secured debt) — current and historic — with status, dates, secured parties, and what each charge covers (fixed/floating/negative-pledge flags and any free-text particulars). Satisfaction is represented as satisfied_on plus a charge-satisfaction filing entry, not a separate 'release' record. company_profile.has_charges is a True/False/unknown summary derived from this same data; use this tool when the specific charges matter, not just whether any exist.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| charges | No | Every charge, current and historic. |
| total_count | Yes | Total charges returned. |
| company_number | Yes | Companies House company number. |
| satisfied_count | No | Upstream count of satisfied charges, or null if not provided. |
| unfiltered_count | No | Upstream unfiltered charge count, or null if not provided. |
| part_satisfied_count | No | Upstream count of part-satisfied charges, or null if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail about what a charge record includes and the specific representation of satisfaction (satisfied_on plus a filing, not a separate release). It also notes the source of company_profile.has_charges, which helps the agent understand the data relationship.
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 well-structured and front-loaded with the core purpose. The second sentence adds useful detail about response contents, and the final sentence provides selection guidance. A small redundancy exists between 'complete charge history' and 'Returns every registered charge', but overall the text is efficient and every sentence contributes meaningful context.
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 single-parameter fetch tool, the description fully explains what the tool returns, how to distinguish it from the summary field, and how an important edge case (satisfaction) is represented. The output schema exists to describe the response structure, so the description does not need to enumerate all fields. The combination of description, schema, and annotations provides everything an agent needs to invoke this correctly.
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?
There is only one parameter and the schema description coverage is 100%, fully documenting company_number with format and an example. The description does not add new parameter semantics beyond the schema, which is acceptable given the high coverage. The baseline of 3 applies because the schema carries the burden successfully.
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 it fetches the complete Companies House charge history for a company. It explicitly contrasts with company_profile.has_charges, noting this tool should be used when specific charges matter. This differentiates it from sibling tools without needing to inspect other schemas.
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 explicit guidance on when to use this tool versus company_profile.has_charges: use this when the actual charge details matter, not just whether any charges exist. It also clarifies how satisfaction is represented, preventing misinterpretation. This is strong usage context that helps an agent select correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_filing_documentGet Companies House Filing DocumentARead-onlyIdempotentInspect
Resolve a filing's document_metadata link to its authoritative source document.
Returns a resource_link (never embedded bytes, never base64) pointing at a company-document:// MCP resource — fetch it via resources/read to get the actual PDF. This tool only reads metadata (category, pages, available content types, byte size); it never downloads the document itself. Use company_filing_history first to find a filing's document_metadata URL.
Requires a resource-capable MCP client to retrieve the actual bytes — a tool-only client can see this result's metadata (company, category, page count, size) but cannot obtain the file through this tool call alone.
| Name | Required | Description | Default |
|---|---|---|---|
| mime_type | No | Which content representation to select, e.g. 'application/pdf'. Omit when the document has only one representation (the near-universal case) — it is auto-selected. Required if the document has more than one; omitting it in that case returns a validation error listing the choices. | |
| document_metadata_url | Yes | The document_metadata URL from a filing's links.document_metadata (returned by company_filing_history) — pass it through verbatim, not a document_id. Must be an exact https://document-api.company-information.service.gov.uk/document/{id} URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that no bytes are ever embedded or base64-encoded, that only metadata is read, that the tool never downloads the document, and that a resource-capable client is required for actual content. This gives the agent accurate expectations about side effects and outputs.
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 well-structured and front-loaded, but slightly verbose with some repetition around the client requirement and the fact that no bytes are downloaded. Each sentence earns its place, yet it could be tightened without losing meaning.
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 two parameters, no output schema, and a read-only idempotent operation, the description covers what is returned, how to access the actual PDF, what metadata is available, prerequisites, and client limitations. An agent has enough context to invoke the tool correctly and interpret 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?
Schema description coverage is 100%, so the schema already documents both parameters well. The description reinforces key constraints like passing the URL verbatim and the mime_type auto-selection behavior, but adds little beyond the schema's own parameter descriptions.
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 ('Resolve') and identifies the exact resource (a filing's document_metadata link), then clarifies the output is a resource_link, not bytes. This clearly distinguishes it from sibling tools like fetch or company_filing_history, which the description explicitly references as the prerequisite step.
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 explicit usage direction: first use company_filing_history to obtain the document_metadata_url, then call this tool, and retrieve the actual PDF via resources/read. It also states the limitation for tool-only clients, so an agent knows when this tool alone is insufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_filing_historyGet Company Filing HistoryARead-onlyIdempotentInspect
Fetch one page of a company's Companies House filing chronology.
Returns the raw source facts for each filing — transaction ID, form type/category, dates, and the description_values CH uses to render its own text — as delivered upstream, not interpreted into DD conclusions. links.document_metadata on each filing is the identifier a future document-retrieval tool would need; no document content is fetched here.
Unlike company_officers/company_psc/company_charges, this does NOT auto-fetch every page — a long-lived company's filing history is unbounded in practice (a decades-old PLC can carry thousands of filings). total_count/returned/has_more are always reported truthfully for whatever page and category filter was requested; nothing is silently truncated. Narrow with category= for a specific slice (e.g. category='mortgage' for charge-related filings, category='insolvency' for administration/liquidation filings) — a note is included when an unfiltered history is large.
A company_number that doesn't resolve to any company returns a structured not_found error, distinct from a genuine zero-filing result — Companies House's filing-history endpoint alone cannot tell these apart, so existence is confirmed separately when the result would otherwise be empty.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter by CH filing category — comma-separated for multiple, e.g. 'mortgage' or 'mortgage,officers'. Omit for all categories. Common values: accounts, confirmation-statement, officers, address, capital, mortgage, persons-with-significant-control, incorporation, insolvency, resolution, annual-return, change-of-name, change-of-constitution, gazette, miscellaneous. | |
| start_index | No | Pagination offset. Default 0. Re-call with start_index=start_index+returned while has_more is true. | |
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. | |
| items_per_page | No | Results per page (Companies House caps at 100 regardless of a higher value). Default 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note, e.g. suggesting a category filter when total_count is large and no category was applied. Informational only — never a truncation. |
| filings | No | Filings on this page. |
| category | No | The category filter applied to this query, or null if unfiltered. |
| has_more | Yes | True if start_index + returned < total_count. |
| returned | Yes | Filings returned on this page. |
| start_index | Yes | Pagination offset used for this page. |
| total_count | Yes | Total filings matching this query (across all pages). |
| company_number | Yes | Companies House company number. |
| items_per_page | Yes | Page size actually used (CH caps at 100 regardless of a higher request). |
| filing_history_status | No | Upstream filing-history status (e.g. 'filing-history-available'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly discloses behaviors beyond the annotations: it fetches exactly one page, never silently truncates, reports total_count/returned/has_more truthfully, returns raw source data rather than interpreted conclusions, and distinguishes a structured not_found error from an empty result. These details are not covered by the readOnly/openWorld/idempotent hints, so the description carries crucial execution context.
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 longer than average, but every sentence earns its place: purpose, pagination contract, category narrowing, raw-data caveat, and not_found handling. The key limitation ('does NOT auto-fetch every page') is front-loaded, and the not_found discussion is substantive rather than 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?
The description covers all critical operational dimensions: pagination contract, category filtering, raw vs interpreted data, document identifier purpose, and error handling for unknown company numbers. With an output schema present, return values don't need to be spelled out, and no essential behavior an agent would need to call this tool correctly 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?
All four parameters are already fully documented in the schema with descriptions, defaults, and enumeration examples (100% coverage), so the baseline of 3 applies. The description adds contextual value by mentioning category='mortgage'/'insolvency' and the pagination idiom, but it doesn't reveal new parameter semantics beyond what the schema already states.
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 and resource: 'Fetch one page of a company's Companies House filing chronology.' It immediately distinguishes this tool from siblings by emphasizing raw source facts, one-page pagination, and the absence of document-content fetching, so an agent can easily tell it apart.
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 explicitly contrasts with company_officers/company_psc/company_charges on auto-fetching and states that no document content is fetched, signaling when this tool is not appropriate. It also advises pagination via start_index while has_more is true and narrowing with category= for specific slices. It doesn't name company_filing_document as the document-retrieval alternative, but the mention of a future document-retrieval tool makes the boundary fairly clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_officersGet Company OfficersARead-onlyIdempotentInspect
Fetch officers for a Companies House company number.
Returns directors, secretaries, and other officers with appointment dates, nationality, and country of residence. Resigned officers are excluded by default; set include_resigned=true for historical DD. Pagination is handled internally.
| Name | Required | Description | Default |
|---|---|---|---|
| start_index | No | Ignored — pagination is handled internally. Only accepted to avoid call failures. | |
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. | |
| items_per_page | No | Ignored — pagination is handled internally. Only accepted to avoid call failures. | |
| include_resigned | No | Include resigned/historic officers. Default false for backwards-compatible current-officer queries. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total officers returned (filtered by include_resigned). |
| officers | No | Officer records. |
| company_number | Yes | Companies House company number. |
| include_resigned | Yes | Whether resigned officers were included in this result. |
| high_appointment_count_flag | No | Number of active officers with 10+ total appointments, or null if appointment counts were not fetched. Non-zero values are a nominee/phoenix director risk signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds genuine behavioral context beyond the annotations: the default exclusion of resigned officers, the flag to include them for historical due diligence, and the fact that pagination is handled internally. These are meaningful traits not inferable from the schema or annotations alone.
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 three concise sentences with no filler: it leads with the core purpose, lists returned data, and then covers the important defaults and pagination behavior. Every sentence earns its place.
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 read-only list tool with an output schema, full parameter documentation, and safety annotations, the description covers all necessary operational details: scope, returned fields, default behavior, the optional flag, and pagination. Nothing that an agent needs to call it correctly 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%, so the baseline is 3. The description adds value by explaining that pagination is handled internally, which clarifies why start_index and items_per_page are ignored, and by stating the default behavior of include_resigned. This goes beyond the parameter descriptions.
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 states a specific verb and resource ('Fetch officers for a Companies House company number') and enumerates the officer types and returned fields. It clearly distinguishes the tool's function, though it does not explicitly contrast it with sibling tools like officer_appointments or company_profile.
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 invocation context: what data is returned, that resigned officers are excluded by default, and when to set include_resigned=true for historical data. It does not explicitly name alternative tools or when not to use this one, but the scope is specific enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_profileGet Company ProfileARead-onlyIdempotentInspect
Fetch the full Companies House profile for a company number.
Returns status, registered address, SIC codes, filing compliance (overdue accounts and confirmation statement flags), and whether the company has outstanding charges. Use company_search first to find the company number.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | No | Accounts filing status and due dates. |
| sic_codes | No | Standard Industrial Classification codes. |
| has_charges | No | True if the company has at least one outstanding or part-satisfied charge (secured debt) — not yet fully discharged. False if every charge on record is fully satisfied, or there are none. Null if the charges check could not be completed, or if a charge was returned with an unrecognized status that can't be confidently classified. Use company_charges for the full charge-by-charge detail. |
| company_name | No | Registered company name. |
| company_type | No | Companies House company type code. |
| company_number | Yes | Companies House company number. |
| company_status | No | Current status (active, dissolved, in liquidation, etc.). |
| date_of_creation | No | Incorporation date (ISO YYYY-MM-DD). |
| confirmation_statement | No | Confirmation statement filing status and next due date. |
| registered_office_address | No | Registered office address as returned by Companies House. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, idempotent, and non-destructive behavior. The description adds useful behavioral context by specifying what the profile includes, such as overdue accounts, confirmation statement flags, and outstanding charges. No contradiction exists between the description and annotations.
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?
Three compact sentences: purpose, return contents, and prerequisite workflow. Every sentence adds value, and the most important information is front-loaded. No filler or redundant restatement of the tool name.
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?
The single parameter is fully documented in the schema, output schema exists so return values are defined elsewhere, annotations cover the safety profile, and the description provides scope and a prerequisite. Nothing critical is missing for an agent to invoke the tool correctly.
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 length constraints, format example, and a pointer to company_search. The description reinforces that the tool is called with a company number but adds little beyond what the schema provides. With 100% schema coverage, 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?
The description states a specific verb and resource: 'Fetch the full Companies House profile for a company number.' It also lists the returned data (status, registered address, SIC codes, filing compliance, outstanding charges), which clearly distinguishes it from sibling tools like company_search, company_officers, and company_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 gives explicit workflow guidance: 'Use company_search first to find the company number.' This is clear and actionable, though it doesn't explicitly state when not to use this tool in favor of other siblings like company_officers or company_charges.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_pscGet Persons with Significant ControlARead-onlyIdempotentInspect
Fetch Persons with Significant Control (beneficial ownership) for a company.
Returns PSC entries with natures of control, nationality, and country of residence. Flags overseas corporate PSC entries as a beneficial ownership risk signal. Returns an explanatory note for widely-held PLCs with no registrable PSC.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| psc | No | Persons with Significant Control records. |
| note | No | Explanatory note when total=0. Typical for widely-held listed PLCs where no single person or entity holds 25%+ of shares or voting rights. |
| total | Yes | Total PSC entries returned for this company. |
| company_number | Yes | Companies House company number. |
| overseas_corporate_psc_flag | No | Number of corporate PSCs registered outside the UK. Non-zero values indicate an offshore beneficial ownership chain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail by explaining that overseas corporate PSC entries are flagged as a risk signal and that widely-held PLCs with no registrable PSC receive an explanatory note.
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 three sentences with no filler. It front-loads the core purpose and then efficiently covers key output details and a special-case behavior, earning its length.
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 read-only lookup with one documented parameter and an output schema, the description covers purpose, key result fields, risk flagging behavior, and an important edge case. Nothing essential is missing for an agent to invoke it correctly.
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 single parameter is already well described with format guidance and an example in the schema. The description does not add additional parameter-level detail, 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 ('Fetch') with a clear resource ('Persons with Significant Control') and adds 'beneficial ownership' for disambiguation. It clearly distinguishes itself from sibling tools like company_officers and company_profile by focusing on PSC data specifically.
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 this tool is for retrieving PSC/beneficial ownership information for a company, which gives strong contextual guidance. It does not explicitly name alternatives or exclusions, but the purpose is distinct enough that an agent can infer when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_searchSearch Companies HouseARead-onlyIdempotentInspect
Search the Companies House register by company name or keyword.
Returns a paginated list of matching companies with name, number, status, SIC codes, incorporation date, and registered address. Use company_profile for the full record once you have the company number. Re-call with start_index=start_index+items_per_page to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name or keyword to search for | |
| start_index | No | Pagination offset. Default 0. | |
| company_type | No | Filter by company type (e.g. 'ltd', 'llp'). Omit to search all. | |
| company_status | No | Filter by company status (e.g. 'active', 'dissolved'). Omit to search all. | |
| items_per_page | No | Number of results to return (max 100). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | Matching companies. Use the `company_number` field to call company_profile, company_officers, or company_psc for full detail. |
| query | Yes | The query string that was searched. |
| has_more | Yes | True if more results exist beyond this page. Re-call with start_index=start_index+items_per_page to fetch the next page. |
| returned | Yes | Number of items actually returned on this page. |
| start_index | Yes | Number of results skipped before this page (upstream start_index). |
| total_results | Yes | Total matching companies in Companies House (server-side). |
| items_per_page | Yes | Page size requested from the API for this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds behavioral details beyond annotations: it returns a paginated list with specific fields (name, number, status, SIC codes, incorporation date, registered address) and explains the pagination mechanism, which is valuable, non-obvious context.
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 three sentences, each earning its place: purpose, return behavior, and referral/pagination guidance. It is front-loaded and free of 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?
Given the tool's search nature, the description covers essential aspects: what it searches, what it returns, how pagination works, and when to use a sibling tool (company_profile). The output schema presumably handles return structure details, so the description is complete.
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%, so baseline is 3. The description enriches this by clarifying 'query' as company name or keyword and by explicitly stating the pagination formula (start_index=start_index+items_per_page), which adds meaning beyond the schema's individual parameter descriptions.
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 it searches the Companies House register by company name or keyword, with a specific verb and resource. It also distinguishes itself from company_profile by explicitly directing users there for full records, making its scope unambiguous.
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 explicitly names an alternative (company_profile) and provides an exclusion ('Use company_profile for the full record once you have the company number'). It also gives concrete pagination instructions (re-call with start_index+items_per_page), giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disqualified_profileGet Disqualified Director ProfileARead-onlyIdempotentInspect
Fetch the full disqualification record for a director by officer ID.
Returns all disqualification orders: reason, Act/section cited, disqualification period, and associated company names. Use disqualified_search first to find the officer ID.
| Name | Required | Description | Default |
|---|---|---|---|
| officer_id | Yes | Companies House officer ID. Returned by disqualified_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Officer name. |
| surname | No | Family name, if split upstream. |
| forename | No | Given name, if split upstream. |
| officer_id | Yes | Companies House officer ID looked up. |
| nationality | No | Declared nationality. |
| officer_kind | Yes | Which CH endpoint returned the record: 'natural' (individual) or 'corporate' (legal entity). |
| date_of_birth | No | Date of birth on record. |
| disqualifications | No | All disqualification orders attached to this officer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds the return contents (reasons, Act/section, period, company names) and reinforces the need for a pre-discovered officer ID, which is valuable context beyond the annotations.
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: a clear action statement and a compact list of returns plus usage note. Every phrase contributes value with no 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?
Given a single parameter with 100% schema coverage and an output schema present, the description fully captures the tool's purpose, prerequisites, and return contents. It is sufficiently complete for an agent to invoke correctly.
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 covers officer_id with a full description including its source. The description repeats this linkage but does not introduce new parameter constraints or types, 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?
The description clearly identifies the action ('Fetch') and the resource ('full disqualification record for a director') via officer ID. It distinguishes itself from the sibling disqualified_search by focusing on retrieval of a specific record rather than searching.
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 states the prerequisite workflow: 'Use disqualified_search first to find the officer ID.' This provides clear guidance on when to use this tool and points to the alternative tool for discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disqualified_searchSearch Disqualified DirectorsARead-onlyIdempotentInspect
Check whether a named individual is banned from acting as a UK company director.
Use this tool when asked to check disqualified, banned, or barred directors. Query must be an individual's name (e.g. "Richard Howson") — NOT a company name, which always returns zero results.
Returns names, dates of birth, disqualification period snippets, and officer IDs that can be used with disqualified_profile for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Alias for query — the person's name. | |
| query | No | Person's name to search for, e.g. query='Richard Howson'. NOT a company name. | |
| start_index | No | Pagination offset (0-based). Default 0. | |
| items_per_page | No | Results per page (max 100). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | Matching disqualified officer records. |
| query | Yes | Search query applied. |
| has_more | Yes | True if more items may exist beyond this page. Re-call with start_index=start_index+items_per_page to continue. |
| returned | Yes | Items actually returned on this page. |
| start_index | Yes | Pagination offset for this page. |
| total_results | Yes | Total matching records upstream at Companies House. |
| items_per_page | Yes | Page size requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds key behavioral context beyond that: the company name query returns zero results (a known pitfall), and it reveals the return shape (names, DOBs, snippets, officer IDs) plus a pointer to disqualified_profile for follow-up. This exceeds the annotation baseline without being exhaustive about rate limits or matching nuances.
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?
Four sentences, each earning its place: purpose, when-to-use, critical restriction, and return value summary. Front-loaded with the most important info, no redundancy or fluff. Perfectly sized for quick parsing by an agent.
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?
The tool is simple, has an output schema, and annotations cover safety. The description covers purpose, usage guidelines, a key anti-pattern, and a related-tool pointer. Pagination and limits are already captured in the schema, so nothing critical is missing. The context is complete for reliable 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?
Schema description coverage is 100%: each parameter has a meaningful description, including the alias relationship between 'name' and 'query' and clarifying 'NOT a company name.' The tool description reinforces this but doesn't introduce new parameter-level semantics. Baseline 3 is appropriate because the schema carries the burden.
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: 'Check whether a named individual is banned from acting as a UK company director.' This clearly distinguishes the tool from siblings like company_search (which searches companies) and disqualified_profile (which retrieves full details for an identified officer). The scope is precise and unambiguous.
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 explicit when-to-use guidance: 'Use this tool when asked to check disqualified, banned, or barred directors.' It also warns against a common mistake: 'Query must be an individual's name — NOT a company name, which always returns zero results.' This exclusion is valuable and no other tool is suggested for this purpose, making the guidance direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetch Full Record from UK Due Diligence RegisterARead-onlyIdempotentInspect
Fetch the full record for an ID returned by search.
Routes by prefix to the appropriate register:
company:{number} → Companies House full profile
charity:{number} → Charity Commission full profile
disqualification:{officer_id} → Disqualified director full record
notice:{notice_id} → Gazette notice full legal text
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Prefixed record ID returned by search. Format: company:{number}, charity:{number}, disqualification:{officer_id}, or notice:{notice_id} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, and non-destructive nature, so the bar is lower. The description adds useful behavioral context by explaining how the tool routes by prefix to the appropriate register, which is beyond the annotations. No contradictions.
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 succinct: a one-sentence purpose followed by a bulleted list of routing rules. Every sentence is informative, there is no unnecessary text, and the structure is front-loaded and scannable.
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 single-parameter tool with an output schema and read-only annotations, the description covers all essential context: what it does, when to use it, and how routing works. It doesn't need to explain return values because the output schema exists, and the usage context is clear.
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 covers the parameter format 100%, so the baseline is 3. The description adds value by mapping each prefix to its target register, enriching the semantics beyond the schema's format description. This helps the agent construct valid IDs and anticipate the output type.
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 verb and resource: 'Fetch the full record for an ID returned by search.' It distinguishes from sibling tools by specifying the routing mechanism by prefix, which clarifies that this is a unified fetcher across multiple registers. This is specific and unambiguous.
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 a clear context: use this for IDs returned by search. It implicitly differentiates from specific profile tools via the prefix routing, but it does not explicitly state alternatives like 'use company_profile if you already have a company number.' A slight gap in explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gazette_insolvencySearch Gazette Corporate Insolvency NoticesARead-onlyIdempotentInspect
Search The Gazette's insolvency notice index by entity name.
Searches The Gazette's corporate-insolvency notice index using the authoritative Gazette notice-code taxonomy. Results are sorted by an internal DD severity score; the notice label itself remains a source fact.
Each result includes a notice_numeric_id. Read the full legal wording via the notice://{notice_numeric_id} resource.
The Gazette is the official UK public record. A notice here means the event has been formally published and is legally effective.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Company or individual name to search for in Gazette insolvency notices | |
| query | No | Alias for name. | |
| end_date | No | Filter notices up to this date (YYYY-MM-DD) | |
| start_date | No | Filter notices from this date (YYYY-MM-DD) | |
| entity_name | No | Deprecated alias for name. | |
| max_notices | No | Cap on notices returned, applied after severity/date sort. Default 20. The Gazette insolvency feed returns up to 100 results per search — raise to 100 to see the full set. | |
| notice_type | No | Filter by Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order, '2410' appointment of administrators). Omit to search all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notices | No | Matching notices, sorted by severity (desc) then date (desc). |
| end_date | No | Upper bound of the date range filter, if any. |
| start_date | No | Lower bound of the date range filter, if any. |
| entity_name | Yes | Entity name that was searched. |
| total_notices | Yes | Total notices returned after deduplication, sorting, and cap. |
| max_notices_cap | Yes | The max_notices cap applied. Upstream may have more matching notices. |
| notice_type_filter | No | Notice code filter applied, or null if all codes searched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: results are sorted by an internal DD severity score, the notice label is preserved as a source fact, and a published notice is legally effective. These details are not visible in the annotations and help an agent interpret results and avoid assuming chronological ordering.
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 well-structured and mostly front-loaded, but the first two sentences both announce the same search operation with slightly different phrasing. Every other sentence earns its place by explaining sorting, result IDs, or the legal significance of a Gazette notice.
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?
The description covers the key non-obvious behaviors an agent needs: the insolvency-specific scope, severity-based sorting, the presence of notice_numeric_id, the separate notice resource for full wording, and the legal effectiveness of published notices. Given that an output schema exists and the parameter schema is fully documented, nothing critical appears 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?
The input schema already provides 100% coverage of parameter meanings, including aliases, date formats, max_notices caps, and notice_type examples. The description adds some useful context around the notice-code taxonomy and the result's numeric ID, but it does not materially improve parameter-level understanding beyond the schema.
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 ('Search') and a specific resource ('The Gazette's corporate-insolvency notice index'), and also indicates the search is by entity name. It differentiates this tool from siblings like gazette_notice by noting results contain a notice_numeric_id and that the full legal wording is available separately via a notice:// resource.
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 clearly frames this as the entry point for finding insolvency notices and then directs the user to read the full legal wording via notice://{notice_numeric_id}, which functions as an implicit alternative path. It does not explicitly state 'use gazette_notice for full notices' or list exclusions, but the context is clear enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gazette_noticeGet Gazette Notice Full TextARead-onlyIdempotentInspect
Fetch the full legal wording of a Gazette notice by numeric notice ID.
Returns the complete JSON-LD linked-data record for the notice: parties, legal basis, court, and full text. Use gazette_insolvency first to find notice_numeric_id values.
| Name | Required | Description | Default |
|---|---|---|---|
| notice_id | Yes | Numeric Gazette notice ID. Returned as notice_numeric_id by gazette_insolvency. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description adds that the response is a complete JSON-LD record including parties, legal basis, court, and full text. It does not mention error handling or potential limits, but the key behavioral traits are well covered.
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?
Two sentences efficiently deliver purpose, return contents, and a usage prerequisite. The structure is front-loaded with the action and avoids any redundant phrasing.
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?
Despite having an output schema, the description provides a succinct summary of return fields and gives the necessary upstream step. For a single-parameter fetch operation, this is complete and well-integrated with sibling tools.
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 fully describes notice_id as the numeric ID returned by gazette_insolvency, and the description echoes this without adding new meaning. With 100% schema coverage, 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?
The description clearly states it fetches the full legal wording of a Gazette notice by numeric notice ID, distinguishing it from search-like siblings such as gazette_insolvency. The verb 'Fetch' and specific resource make the purpose unambiguous.
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 instructs users to use gazette_insolvency first to obtain notice_numeric_id values, providing a clear workflow and implicit alternative. This is direct guidance on when to use this tool versus another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
land_title_searchSearch Price Paid Transactions by PostcodeARead-onlyIdempotentInspect
Search HM Land Registry Price Paid Index by postcode or address.
Returns up to 10 recent sale transactions for the postcode: price, date, address, property type, and tenure (Freehold/Leasehold). Covers England and Wales only. Postcode gives the most reliable results — a full address is also accepted and the postcode is extracted automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| address_or_postcode | Yes | UK property address or postcode. Postcode is most reliable: e.g. 'NG1 1AB'. Full address also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query. |
| postcode | Yes | Normalised UK postcode extracted from the input. |
| transactions | No | Recent Price Paid transactions for the postcode, sorted newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds valuable behavioral context beyond these: it returns a maximum of 10 transactions, lists the exact data fields, restricts to England and Wales, and explains automatic postcode extraction from addresses. This is useful operational detail not present in the annotations.
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?
Three sentences, front-loaded with the main action, followed by return details and key constraints. No filler or redundancy. Every sentence contributes meaningful guidance, making this highly concise and well-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?
For a single-parameter tool with a provided output schema, the description is complete: it states the data source, coverage area, reliability guidance, and expected return fields/count. There's no ambiguity that would require additional narrative. The output schema covers structural details, so the description's brevity is appropriate.
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 single parameter 'address_or_postcode' is already described in the schema with the same guidance (postcode most reliable, full address accepted). The description adds a small extra detail about automatic postcode extraction, but with 100% schema coverage, the schema carries the semantic weight. Per the rubric, 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 opens with a specific verb+resource: 'Search HM Land Registry Price Paid Index by postcode or address.' It clearly distinguishes this tool from sibling tools by focusing on property transaction data, and states the return content (price, date, address, property type, tenure). This leaves 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?
It gives clear contextual guidance: covers England and Wales only, postcode is most reliable, full address accepted with automatic postcode extraction. It doesn't explicitly name alternatives or exclusion conditions, but the guidance is sufficient for choosing this tool for price paid lookups. Score 4 rather than 5 because there's no explicit 'when not to use' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
officer_appointmentsGet Officer Appointment HistoryARead-onlyIdempotentInspect
Fetch a person's full company appointment history by officer ID.
Returns every appointment — current and historic — with each company's number, name, status, role, and appointment/resignation dates. Use company_officers first to find an officer_id, then this tool to discover other companies that person has been a director or secretary of, including dissolved or insolvent ones not mentioned anywhere else. Always returns full history; there is no current-only filter, since historical discovery is the point.
| Name | Required | Description | Default |
|---|---|---|---|
| officer_id | Yes | Companies House officer ID. Returned as officer_id on entries from company_officers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Officer name as recorded at CH. |
| total | Yes | Total appointments returned. |
| officer_id | Yes | Companies House officer ID. |
| active_count | No | Upstream count of appointments Companies House categorizes as 'active' — this reflects the officer's own appointment/resignation state at that company, NOT whether the company itself is currently trading. An appointment at a company in liquidation or administration still counts as active here if the officer was never formally resigned. Check each appointment's own company_status field for the company's actual status. Null if not provided upstream. |
| appointments | No | Every appointment, current and historic. |
| date_of_birth | No | Partial date of birth (month/year), or empty if not disclosed upstream. |
| inactive_count | No | Upstream count of appointments Companies House categorizes as 'inactive', passed through as-is. Exact categorization semantics have not been independently verified against per-appointment data — treat as an unverified upstream fact, not a derived signal, or null if not provided. |
| resigned_count | No | Upstream count of resigned appointments, or null if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds meaningful context beyond that: it returns current and historic appointments, includes dissolved or insolvent companies, and explicitly discloses that there is no current-only filter. No contradiction with annotations.
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, followed by return details, the prerequisite workflow, and an explicit limitation. Every sentence adds decision-relevant information and there is no filler or repetition.
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?
With a single parameter, a strong output schema, and annotations covering safety and idempotency, the description fills the remaining gaps: what data is returned, how to obtain the required officer_id, and what filtering behavior to expect. Nothing essential is missing for 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?
Schema description coverage is 100%, and the schema already explains officer_id as a Companies House officer ID returned by company_officers. The description adds a little context by saying the officer ID is used to fetch appointment history, but it does not materially expand on the schema. This meets the baseline for high schema coverage.
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 starts with a specific verb and resource: 'Fetch a person's full company appointment history by officer ID.' It clearly distinguishes itself from the sibling company_officers tool by emphasizing historical appointment discovery across companies, not just a company's current officers.
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 an explicit workflow: use company_officers first to find an officer_id, then use this tool. It also states the tool always returns full history and has no current-only filter, which prevents misuse when a current-only view is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sanctions_screenScreen a Name Against Sanctions ListsARead-onlyIdempotentInspect
Screen a name against the UK (OFSI), US (OFAC), EU and UN consolidated sanctions lists.
Returns every list entry whose primary name or alias matches, with the regime, source reference and listing date. Use it to check whether a counterparty — or its officers / persons with significant control — appears on a sanctions list.
MATCHING is deterministic: normalised exact + alias match (case-, accent- and punctuation-insensitive). A company/entity legal name matches reliably; PERSON names with transliteration variants may not (e.g. 'Mohammed' vs 'Muhamad'). An empty result is therefore NOT a guarantee of clearance, and a hit on a common name may be a false positive to disambiguate. This is a screening aid, not a compliance determination.
lists_screened reports which of OFSI/OFAC/EU/UN were actually loaded;
lists_unavailable names those that were not, and is_partial is true
whenever it is non-empty. When is_partial is true an empty hits is
UNRESOLVED, not clearance. If no list could be loaded at all the call
raises a retryable error rather than returning an empty screen. as_at
is when the lists were last refreshed on this server.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Person or company/entity name to screen against the consolidated sanctions lists. | |
| entity_type | No | Optional filter: 'person' or 'entity'. Omit to screen both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | No | Matching list entries. An empty list means no exact/alias match on the screened lists — NOT a guarantee of clearance (see the tool description on matching limits). |
| as_at | No | When this server last refreshed the loaded lists (ISO timestamp). Provenance for the screen — the lists update on designation. |
| query | Yes | The name that was screened. |
| is_partial | No | True when any expected list was unavailable. When true, an empty hits list must be treated as UNRESOLVED, not as clearance. |
| match_count | Yes | Number of list entries that matched the query. |
| lists_screened | No | Which consolidated lists were fully loaded and actually screened for this call. A list absent here was NOT screened — see lists_unavailable. Note a list that failed part-way still contributes the entries it had already parsed, so a hit's list_source may name a list missing from here; that is a real match on a list this server does not consider fully screened, not a contradiction. |
| normalized_query | Yes | The normalised form used for matching (upper-cased, accent- and punctuation-stripped, whitespace-collapsed). |
| lists_unavailable | No | Expected lists that did not load, or loaded to zero records, and so were NOT screened. Non-empty means this screen is incomplete: a name on one of these lists would not appear in hits. Absence of evidence here is not evidence of absence. |
| entity_type_filter | No | entity_type filter applied to the screen ('person'/'entity'), or null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing deterministic matching semantics, the risk of transliteration variants, false positives on common names, and that empty results are not clearance. It also explains partial-failure behaviour (`is_partial`, `lists_unavailable`, retryable error when no list loads) — exactly the kind of context annotations cannot express.
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 it is well front-loaded (purpose first, then matching semantics, then failure modes) and every paragraph carries non-redundant information. Slightly dense, though nothing reads as 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 a screening tool with failure modes and an output schema, the description covers matching behaviour, partial-list semantics, error behaviour, and the meaning of `as_at`. An agent has everything needed to interpret results safely.
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 documents both `name` and `entity_type`. The description adds matching semantics around the name but never addresses the `entity_type` filter, so it stays at the baseline.
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 (screen), resource (a name), and the exact data sources (UK OFSI, US OFAC, EU, UN consolidated lists). This is clearly distinguishable from all siblings such as company_profile, disqualified_search, and company_search.
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 usage context: check whether a counterparty, or its officers/PSC, appears on a sanctions list. It describes the purpose clearly but does not name an alternative tool or an explicit when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch UK Due Diligence RegistersARead-onlyIdempotentInspect
Search across all UK due diligence registers simultaneously.
Searches Companies House, Charity Commission, disqualified directors, and Gazette insolvency notices in parallel. Returns a list of result IDs — use fetch with each ID to retrieve the full record.
registers_searched names the registers that actually answered and
registers_unavailable those that failed; is_partial is true whenever
the latter is non-empty. An empty ids with is_partial true means
UNRESOLVED, not "nothing on record". If no register answers at all the
call raises rather than returning an empty result.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name, charity name, director name, or keyword to search for across all UK due diligence registers |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld/idempotent annotations by disclosing the parallel execution model, the ID-only return shape, and the partial-failure semantics: `registers_searched` vs `registers_unavailable` with `is_partial`, the critical warning that empty ids + is_partial=true means UNRESOLVED rather than 'nothing on record', and that a total register outage raises instead of returning empty.
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 core purpose in the first sentence, then layers scope, retrieval workflow, and failure semantics in tight, well-organized sentences. Every sentence carries distinct, actionable information with no 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?
Despite an output schema existing, the description usefully clarifies the return contract (result IDs plus fetch workflow) and fully specifies the partial-vs-unresolved failure distinction. Nothing an agent needs to interpret results or handle degraded register responses 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?
With a single parameter at 100% schema coverage, the schema already documents that `query` accepts a company name, charity name, director name, or keyword. The description adds no format, syntax, or length guidance beyond what the schema provides, 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 (Search) and resource (all UK due diligence registers), enumerating the exact registers covered: Companies House, Charity Commission, disqualified directors, and Gazette insolvency notices. This aggregate scope cleanly distinguishes it from per-register siblings like company_search, charity_search, and disqualified_search.
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?
Clearly establishes the aggregate use case ('search across all registers simultaneously') and the required follow-up workflow: results are IDs, so 'use fetch with each ID to retrieve the full record.' It does not explicitly state when to prefer a narrower sibling (e.g. company_search) over this one, so it stops short of full alternative routing.
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.
2 tool updates
v1.4.0- Changed
sanctions_screen3 fields changed- added
Output schema / properties / is_partialAdded value: +{ + "default": false, + "description": "True when any expected list was unavailable. When true, an empty hits list must be treated as UNRESOLVED, not as clearance.", + "type": "boolean" +} - changed
Output schema / properties / lists_screened / descriptionPrevious value: -"Which consolidated lists were loaded and actually screened for this call. A list absent here failed to load and was NOT screened — treat the result as partial if any of OFSI/OFAC/EU/UN is missing."New value: +"Which consolidated lists were fully loaded and actually screened for this call. A list absent here was NOT screened — see lists_unavailable. Note a list that failed part-way still contributes the entries it had already parsed, so a hit's list_source may name a list missing from here; that is a real match on a list this server does not consider fully screened, not a contradiction." - added
Output schema / properties / lists_unavailableAdded value: +{ + "description": "Expected lists that did not load, or loaded to zero records, and so were NOT screened. Non-empty means this screen is incomplete: a name on one of these lists would not appear in hits. Absence of evidence here is not evidence of absence.", + "items": { + "type": "string" + }, + "type": "array" +}
- Removed
vat_validate
10 tool updates
v1.3.0- Added
company_charges - Added
company_filing_document - Added
company_filing_history - Changed
company_officers3 fields changed- added
Input schema / properties / include_resignedAdded value: +{ + "default": false, + "description": "Include resigned/historic officers. Default false for backwards-compatible current-officer queries.", + "type": "boolean" +} - changed
Input schema / properties / start_index / descriptionPrevious value: -"Ignored — all officers are returned in one call."New value: +"Ignored — pagination is handled internally. Only accepted to avoid call failures." - added
Output schema / properties / officers / items / properties / officer_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Companies House officer ID, extracted from links.officer.appointments. Pass to officer_appointments to discover this person's full appointment history across companies, including dissolved or insolvent ones." +}
- Changed
company_profile4 fields changed- added
Output schema / properties / has_charges / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / has_charges / defaultPrevious value: -falseNew value: +null - changed
Output schema / properties / has_charges / descriptionPrevious value: -"True if the company has outstanding registered charges (secured debt), derived from the /charges endpoint. A due diligence signal."New value: +"True if the company has at least one outstanding or part-satisfied charge (secured debt) — not yet fully discharged. False if every charge on record is fully satisfied, or there are none. Null if the charges check could not be completed, or if a charge was returned with an unrecognized status that can't be confidently classified. Use company_charges for the full charge-by-charge detail." - removed
Output schema / properties / has_charges / typeRemoved value: -"boolean"
- Changed
company_psc1 field changed- added
Output schema / properties / psc / items / properties / date_of_birthAdded value: +{ + "additionalProperties": true, + "description": "Partial date of birth (month/year) for individual PSCs as returned by CH.", + "type": "object" +}
- Changed
gazette_insolvency3 fields changed- changed
Input schema / properties / notice_type / descriptionPrevious value: -"Filter by notice code (e.g. '2441' winding-up petition, '2443' winding-up order, '2448' administration order, '2460' striking-off). Omit to search all."New value: +"Filter by Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order, '2410' appointment of administrators). Omit to search all." - changed
Output schema / properties / notices / items / properties / notice_code / descriptionPrevious value: -"Gazette notice code (e.g. '2443' winding-up order, '2448' administration order)."New value: +"Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order for a company)." - changed
Output schema / properties / notices / items / properties / severity / descriptionPrevious value: -"Internal severity score 0-10. Higher = more serious (10 = Winding-Up Order, 9 = Administration Order / Receiver, 0 = unclassified)."New value: +"Internal severity score 0-10. Higher = more serious (10 = winding-up order, 9 = administration/receiver/liquidator appointment, 0 = informational or unclassified)."
- Removed
get_prompt - Removed
list_prompts - Added
officer_appointments
4 tool updates
v1.1.1- Changed
disqualified_search8 fields changed- added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Alias for query — the person's name." +} - added
Input schema / properties / query / anyOfAdded value: +[ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / defaultAdded value: +null - changed
Input schema / properties / query / descriptionPrevious value: -"Name of the person to search for"New value: +"Person's name to search for, e.g. query='Richard Howson'. NOT a company name." - removed
Input schema / properties / query / maxLengthRemoved value: -200 - removed
Input schema / properties / query / minLengthRemoved value: -2 - removed
Input schema / properties / query / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "query" -]
- Changed
gazette_insolvency9 fields changed- added
Input schema / properties / entity_name / anyOfAdded value: +[ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / entity_name / defaultAdded value: +null - changed
Input schema / properties / entity_name / descriptionPrevious value: -"Company or individual name to search for in Gazette insolvency notices"New value: +"Deprecated alias for name." - removed
Input schema / properties / entity_name / maxLengthRemoved value: -200 - removed
Input schema / properties / entity_name / minLengthRemoved value: -2 - removed
Input schema / properties / entity_name / typeRemoved value: -"string" - added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Company or individual name to search for in Gazette insolvency notices" +} - added
Input schema / properties / queryAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Alias for name." +} - removed
Input schema / requiredRemoved value: -[ - "entity_name" -]
- Added
sanctions_screen - Changed
vat_validate1 field changed- changed
Input schema / properties / vat_number / descriptionPrevious value: -"UK VAT registration number. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically."New value: +"UK (GB) VAT registration number — this tool validates UK numbers only. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically."
14 tool updates
v1.0.6- Added
charity_profile - Added
charity_search - Added
company_officers - Added
company_profile - Added
company_psc - Added
company_search - Added
disqualified_profile - Added
disqualified_search - Added
fetch - Added
gazette_insolvency - Added
gazette_notice - Added
land_title_search - Added
search - Added
vat_validate
13 tool updates
v1.0.1- Removed
charity_profile - Removed
charity_search - Removed
company_officers - Removed
company_profile - Removed
company_search - Removed
disqualified_profile - Removed
disqualified_search - Removed
fetch - Removed
gazette_insolvency - Removed
gazette_notice - Removed
land_title_search - Removed
search - Removed
vat_validate
15 tool updates
v1.0.0- First observed
charity_profile - First observed
charity_search - First observed
company_officers - First observed
company_profile - First observed
company_search - First observed
disqualified_profile - First observed
disqualified_search - First observed
fetch - First observed
gazette_insolvency - First observed
gazette_notice - First observed
get_prompt - First observed
land_title_search - First observed
list_prompts - First observed
search - First observed
vat_validate
TDQS
Scored across 18 tools
Several tools have overlapping or confusingly similar roles: company_charges and company_filing_history (with category='mortgage') both expose charge data; gazette_notice and gazette_insolvency both deal with Gazette notices; and the generic search/fetch tools duplicate the functionality of many specific tools. While descriptions provide guidance, boundaries are blurry, especially for an agent deciding between the umbrella search/fetch and register-specific tools.
Most tool names follow a consistent prefix_action pattern (company_*, charity_*, disqualified_*, gazette_*), which is predictable and readable. However, the generic 'search' and 'fetch' tools break the pattern, and 'land_title_search' is an outlier. Minor deviations keep it from a perfect score.
With 18 tools, the surface is on the heavy side. The addition of generic search/fetch tools that duplicate specific tools increases complexity without adding much unique value. For a due diligence server, some breadth is justified, but the count feels borderline over-scoped.
The tool set covers a broad range of UK due diligence registers (Companies House, Charity Commission, disqualified directors, Gazette, land registry, sanctions), which is impressive. However, there are gaps: no direct officers search by name, no way to retrieve charity filings or financial details beyond the profile, and the document retrieval tool (company_filing_document) is not fully integrated with a resource read helper. These are minor gaps that agents can mostly work around.
Maintenance
Related MCP Connectors
Companies House MCP — UK statutory company registry (BYO key)
Company hierarchy analysis and address verification via MCP
CompanyLens is a remote MCP server giving AI agents instant access to official company registry data across 19 jurisdictions in Europe, the Americas, and Asia-Pacific. Eighteen read-only tools let you search companies and people, look up officers and beneficial owners, map corporate networks through shared directors, screen names against the UK disqualified directors register, find every company at a registered address, and pull filing history — all from a single connector. Visit our website: https://companylens.io
Company 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.3713 npm27AGPL 3.0

yaml-ai-mcpofficial
FlicenseAqualityBmaintenanceAn MCP server for anti-money laundering (AML) compliance, including customer due diligence, transaction monitoring, and SAR filing, compliant with 6AMLD, UK MLR 2017, and FinCEN.4-- FlicenseNot gradedqualityBmaintenanceMCP server exposing the full UK Companies House Public Data API, enabling natural language queries for company profiles, search, officers, filing history, charges, insolvency, and persons with significant control, as well as downloading and reading PDF documents.-
- AlicenseNot gradedqualityBmaintenanceProduction-grade MCP server for the UK Companies House API, enabling AI assistants to search companies, get profiles, list officers, filings, and PSCs.MIT