Skip to main content
Glama

Server Details

UK due diligence — Companies House, Charity Commission, Land Registry, Gazette, HMRC VAT

Ownership verified
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
paulieb89/uk-due-diligence-mcp
GitHub Stars
3
Server Listing
UK Due Diligence

Available Tools

19 tools
charity_profileGet Charity ProfileA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
charity_numberYesCharity Commission registration number (e.g. '1234567'). Returned by charity_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
addressNoRegistered address of the charity (joined address lines).
insolventNoTrue if the charity is flagged as insolvent.
reg_statusNoRegistration status code ('R', 'RM').
charity_nameNoRegistered charity name.
charity_typeNoCharity type.
latest_incomeNoLatest filed annual income in GBP.
trustee_namesNoTrustees on record. Truncated to 30 entries.
charity_numberYesCharity registration number.
who_what_whereNoWho/What/Where classification entries. The list may be truncated truncated to 50 entries.
reg_status_labelNoHuman-readable registration status.
in_administrationNoTrue if the charity is in administration.
latest_expenditureNoLatest filed annual expenditure in GBP.
trustee_names_totalNoTotal trustees upstream before truncation.
date_of_registrationNoDate of first registration.
who_what_where_totalNoTotal classification entries upstream before truncation.
charity_co_reg_numberNoCompanies House number for charities also registered as companies (Charitable Incorporated Organisations, etc.).
countries_of_operationNoCountries the charity operates in (capped at 10 upstream).
trustee_names_truncatedNoTrue if the trustee list was truncated.
who_what_where_truncatedNoTrue if the classification list was truncated.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

company_chargesGet Company ChargesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_numberYesCompanies House company number (8 digits, e.g. '03782379'). Returned by company_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
chargesNoEvery charge, current and historic.
total_countYesTotal charges returned.
company_numberYesCompanies House company number.
satisfied_countNoUpstream count of satisfied charges, or null if not provided.
unfiltered_countNoUpstream unfiltered charge count, or null if not provided.
part_satisfied_countNoUpstream count of part-satisfied charges, or null if not provided.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the tool as read-only, idempotent, and non-destructive, so the description adds genuinely useful semantics: satisfaction is represented as satisfied_on plus a charge-satisfaction filing rather than a separate release record. It also explains the relationship to company_profile.has_charges. It stops short of discussing possible pagination or absence-of-result behavior, but these are minor given the rest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each of which earns its place: scope, return semantics, and usage guidance. The description is front-loaded with the main action and resource, and contains 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives the full behavioral contract for the tool: what data is returned, how satisfaction is encoded, and when an agent should prefer this over the related company_profile summary. With a full input schema, strong annotations, and an output schema present, nothing essential is missing for selecting and invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is a single parameter, company_number, whose description covers the 8-digit format and where to obtain it from company_search. The tool description adds no additional parameter detail, so the baseline schema-only value of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description leads with a specific verb 'Fetch' and a well-defined resource, 'the complete Companies House charge history for a company.' It enumerates the returned charge fields and states that charges include both current and historic entries, so there is 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts itself with company_profile.has_charges, a summary field for whether any charges exist, and says to use this tool 'when the specific charges matter, not just whether any exist.' That gives an agent a clear decision rule for selecting this over the relevant sibling tool.

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 DocumentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mime_typeNoWhich 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_urlYesThe 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description explicitly discloses what never happens: no embedded bytes, no base64, no download of the PDF, and no direct retrieval of file bytes. It also clarifies that the tool reads only document metadata, which aligns with and enriches the annotation-provided safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly verbose but every sentence carries useful information, including the result format, metadata scope, prerequisite, and client constraint. It is front-loaded with the core action and return type, and the structured formatting makes the tripartite behavior easy to process.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description fully compensates by explaining the returned resource_link, the way to fetch the PDF via resources/read, the metadata contents, and the prerequisite call to company_filing_history. It also covers environment constraints, making the tool call meaningfully complete for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters thoroughly, including the exact URL format, pass-through requirement, and mime_type auto-selection behavior. The description adds little semantic information beyond repeating these instructions, so baseline 3 is appropriate given the 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the specific verb 'Resolve' and the exact resource (a filing's document_metadata link), and states precisely what is returned: a resource_link to a company-document:// MCP resource. It also frames the tool's scope against company_filing_history, making the tool distinct from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use company_filing_history first to find a filing's document_metadata URL', giving a clear prerequisite and sequencing instruction. It also explains the client requirement and notes the limitation for tool-only clients, helping an agent decide whether this tool is suitable for the current environment.

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 HistoryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter 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_indexNoPagination offset. Default 0. Re-call with start_index=start_index+returned while has_more is true.
company_numberYesCompanies House company number (8 digits, e.g. '03782379'). Returned by company_search.
items_per_pageNoResults per page (Companies House caps at 100 regardless of a higher value). Default 100.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoAdvisory note, e.g. suggesting a category filter when total_count is large and no category was applied. Informational only — never a truncation.
filingsNoFilings on this page.
categoryNoThe category filter applied to this query, or null if unfiltered.
has_moreYesTrue if start_index + returned < total_count.
returnedYesFilings returned on this page.
start_indexYesPagination offset used for this page.
total_countYesTotal filings matching this query (across all pages).
company_numberYesCompanies House company number.
items_per_pageYesPage size actually used (CH caps at 100 regardless of a higher request).
filing_history_statusNoUpstream filing-history status (e.g. 'filing-history-available').

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description richly discloses semantics: it returns raw upstream facts rather than interpreted DD conclusions, enforces single-page semantics, reports pagination fields truthfully, and never silently truncates. It also narrates the structured not_found error distinction—valuable operational detail not evident from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the essential purpose, then layers nuance: raw facts, pagination behavior, category filtering, and error semantics. It is longer than one-liners, but every sentence carries operational value for an agent deciding whether to invoke the tool and how to interpret its result.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, a rich output schema is already present, and the description covers what the agent cannot easily infer: the unbounded pagination problem, the distinction between empty results and not_found, truthful pagination counters, and the non-retrieval of document content. It is complete enough to support correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already well-documented in the input schema. The description does not systematically add per-parameter semantics, but it adds meaningful usage context such as why category filtering matters (unbounded histories) and how pagination fields behave (start_index=start_index+returned while has_more). That lifts it to the correct baseline but not above.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb ('Fetch') and resource ('one page ... Companies House filing chronology'), accurately reflecting the tool's scope as paginated/chronological rather than exhaustive. It simultaneously differentiates from sibling tools like company_officers, company_psc, and company_charges by noting the no-auto-fetch behavior, making it easy for an agent to select this tool without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly contrasts this tool with company_officers/company_psc/company_charges, states when pagination is required rather than auto-fetched, and advises narrowly using category= for large histories. It also tells the agent that document content is not retrieved and points to links.document_metadata as a future identifier, providing clear when-to-use/when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

company_officersGet Company OfficersA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
start_indexNoIgnored — pagination is handled internally. Only accepted to avoid call failures.
company_numberYesCompanies House company number (8 digits, e.g. '03782379'). Returned by company_search.
items_per_pageNoIgnored — pagination is handled internally. Only accepted to avoid call failures.
include_resignedNoInclude resigned/historic officers. Default false for backwards-compatible current-officer queries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesTotal officers returned (filtered by include_resigned).
officersNoOfficer records.
company_numberYesCompanies House company number.
include_resignedYesWhether resigned officers were included in this result.
high_appointment_count_flagNoNumber 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

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already communicate read-only, idempotent, safe behavior. The description adds meaningful context beyond that: resigned officers are excluded by default, include_resigned=true opts into historical data, and pagination is handled internally.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and every sentence adds information. It covers behavior, output content, and the key parameter option without verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich schema, output schema, and annotation coverage, the description completes the picture with the important defaults and automatic pagination. A caller has enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already well documented. The description adds useful framing around include_resigned and pagination, reinforcing the schema without introducing ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Fetch officers for a Companies House company number.' It also names the officer categories returned, which distinguishes this from sibling tools like company_profile or company_charges.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: who is returned by default, how to include resigned officers, and that pagination is automatic. It does not explicitly name an alternative tool, but handles the main operational decisions a caller needs to make.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

company_profileGet Company ProfileA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_numberYesCompanies House company number (8 digits, e.g. '03782379'). Returned by company_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountsNoAccounts filing status and due dates.
sic_codesNoStandard Industrial Classification codes.
has_chargesNoTrue 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_nameNoRegistered company name.
company_typeNoCompanies House company type code.
company_numberYesCompanies House company number.
company_statusNoCurrent status (active, dissolved, in liquidation, etc.).
date_of_creationNoIncorporation date (ISO YYYY-MM-DD).
confirmation_statementNoConfirmation statement filing status and next due date.
registered_office_addressNoRegistered office address as returned by Companies House.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds what data will be returned and note of compliance and charge flags, which is useful. It does not discuss rate limits, pagination, or response shape, but the output schema covers some of that burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with action and scope, and every sentence serves a purpose: main function, expected contents, and prerequisite step. There is no filler or unnecessary repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with an output schema and fully documented input, the description is complete: it explains what the agent will get, why it might want this endpoint, and how to obtain the required company number. Nothing stands out as missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents the only parameter: company_number includes format, max length, an example, and a pointer to company_search. The description reinforces the prerequisite but adds no meaning beyond what the schema already provides, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch') and resource ('full Companies House profile'), and makes the scope concrete by enumerating the included data (status, address, SIC codes, compliance flags, charges). This clearly distinguishes it from the sibling tools focused on search, filings, officers, or charges.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to 'Use company_search first to find the company number,' which is a clear precondition and usage cue. It does not explicitly contrast with the alternative company-specific endpoints (e.g., company_filing_history, company_charges), so it is clear but not fully exclusionary.

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 ControlA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_numberYesCompanies House company number (8 digits, e.g. '03782379'). Returned by company_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pscNoPersons with Significant Control records.
noteNoExplanatory note when total=0. Typical for widely-held listed PLCs where no single person or entity holds 25%+ of shares or voting rights.
totalYesTotal PSC entries returned for this company.
company_numberYesCompanies House company number.
overseas_corporate_psc_flagNoNumber of corporate PSCs registered outside the UK. Non-zero values indicate an offshore beneficial ownership chain.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral detail beyond that: it returns natures of control, nationality, and country of residence; flags overseas corporate PSC entries as a beneficial ownership risk signal; and returns an explanatory note for PLCs with no registrable PSC. This gives an agent useful expectations about non-obvious outputs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with no fluff. The first sentence states the core action clearly, and the following sentences list return contents and edge-case behavior. Every sentence adds value, and the structure supports fast agent scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with a full input schema and an output schema, the description is complete. It explains the primary output, the risk flag, and the no-PSC edge case. Nothing essential is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 company_number, including format, length, and that it is returned by company_search. The tool description itself adds no additional parameter-level semantics; the baseline of 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.

Purpose5/5

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 Persons with Significant Control (beneficial ownership) for a company.' This precisely names both the action and the entity type, and distinguishes the tool from siblings like company_officers or company_profile by focusing on PSC/beneficial ownership.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the intended context by explaining what kind of data is returned and when a special note is provided for widely-held PLCs. It does not explicitly name alternative tools for comparison, but the PSC/beneficial ownership framing makes the appropriate use case clear enough for an agent to choose this tool over sibling company_* tools.

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 ProfileA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
officer_idYesCompanies House officer ID. Returned by disqualified_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoOfficer name.
surnameNoFamily name, if split upstream.
forenameNoGiven name, if split upstream.
officer_idYesCompanies House officer ID looked up.
nationalityNoDeclared nationality.
officer_kindYesWhich CH endpoint returned the record: 'natural' (individual) or 'corporate' (legal entity).
date_of_birthNoDate of birth on record.
disqualificationsNoAll disqualification orders attached to this officer.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

fetchFetch Full Record from UK Due Diligence RegisterA
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPrefixed record ID returned by search. Format: company:{number}, charity:{number}, disqualification:{officer_id}, or notice:{notice_id}

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 NoticesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCompany or individual name to search for in Gazette insolvency notices
queryNoAlias for name.
end_dateNoFilter notices up to this date (YYYY-MM-DD)
start_dateNoFilter notices from this date (YYYY-MM-DD)
entity_nameNoDeprecated alias for name.
max_noticesNoCap 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_typeNoFilter 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

ParametersJSON Schema
NameRequiredDescription
noticesNoMatching notices, sorted by severity (desc) then date (desc).
end_dateNoUpper bound of the date range filter, if any.
start_dateNoLower bound of the date range filter, if any.
entity_nameYesEntity name that was searched.
total_noticesYesTotal notices returned after deduplication, sorting, and cap.
max_notices_capYesThe max_notices cap applied. Upstream may have more matching notices.
notice_type_filterNoNotice code filter applied, or null if all codes searched.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It adds meaningful behavioral context beyond the read-only annotations: results are sorted by an internal DD severity score, the notice label is a source fact, each result contains a notice_numeric_id, and the Gazette publication is legally effective. This helps the agent interpret results correctly, though rate limits and pagination behavior are not discussed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action, then gives sorting behavior, next-step guidance, and legal context. Every sentence serves a purpose, and the phrasing is compact for a tool with seven parameters and an output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has full schema coverage, a rich output schema, and annotations, so the description only needs to supply the interpretative context: sorting semantics, source authority, and the notice:// follow-up. It does adequately, giving the agent enough context to invoke the tool and use its results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains every parameter. The description adds modest semantic value by referencing entity-name search and the Gazette notice-code taxonomy, but it does not materially extend what the input schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly names a specific verb ('Search') and resource ('The Gazette's corporate-insolvency notice index'), and adds distinguishing context by stating that results can be followed up via the notice:// resource for full legal wording. This separates it from related tools like gazette_notice and company_search even though those siblings are not explicitly named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is appropriate: searching insolvency notices by entity name, filtering by notice code and date, and then reading full legal text via the notice resource. It does not explicitly list when not to use the tool or name alternative siblings, but the intended usage is strongly implied and supported by the schema.

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 TextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
notice_idYesNumeric Gazette notice ID. Returned as notice_numeric_id by gazette_insolvency.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

officer_appointmentsGet Officer Appointment HistoryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
officer_idYesCompanies House officer ID. Returned as officer_id on entries from company_officers.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoOfficer name as recorded at CH.
totalYesTotal appointments returned.
officer_idYesCompanies House officer ID.
active_countNoUpstream 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.
appointmentsNoEvery appointment, current and historic.
date_of_birthNoPartial date of birth (month/year), or empty if not disclosed upstream.
inactive_countNoUpstream 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_countNoUpstream count of resigned appointments, or null if not provided.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructive=False, so safety is fully covered. The description adds meaningful behavioral context beyond annotations: it always returns full history, includes dissolved or insolvent companies, and includes historical appointments. This is sufficient, though it stops short of mentioning response shape, which is addressed by the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the main action and result are in the first sentence. Subsequent sentences add workflow, scope, and intent without waste. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple single-parameter tool with an output schema and complete safety/discovery annotations, the description provides all needed operational context: what the result includes, how to obtain the required identifier, and that there is no approximation. Nothing material is missing for an agent to correctly invoke and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the officer_id schema description already explains the type and provenance ('Returned as officer_id on entries from company_officers'). The tool description repeats this workflow context without adding new parameter-level detail, so it stays at the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb ('Fetch'), resource ('a person's full company appointment history'), and key identifier ('by officer ID'). It also differentiates this tool from the sibling company_officers by explaining that this tool reveals other companies beyond the one used to obtain the officer_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: call company_officers first to get an officer_id, then use this tool to find other appointments. It also states an exclusion condition—there is no current-only filter—so an agent knows when not to expect limited results. This is strong directional guidance relative to sibling tools.

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 ListsA
Read-onlyIdempotent
Inspect

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 — if any is missing the result is partial. as_at is when the lists were last refreshed on this server.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPerson or company/entity name to screen against the consolidated sanctions lists.
entity_typeNoOptional filter: 'person' or 'entity'. Omit to screen both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNoMatching 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_atNoWhen this server last refreshed the loaded lists (ISO timestamp). Provenance for the screen — the lists update on designation.
queryYesThe name that was screened.
match_countYesNumber of list entries that matched the query.
lists_screenedNoWhich 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.
normalized_queryYesThe normalised form used for matching (upper-cased, accent- and punctuation-stripped, whitespace-collapsed).
entity_type_filterNoentity_type filter applied to the screen ('person'/'entity'), or null.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds rich behavioral detail beyond annotations: matching is deterministic and normalised (case/accent/punctuation insensitive), entity names match reliably but person names with transliteration variants may not, an empty result is not a guarantee of clearance, and false positives are possible. It also explains the meaning of 'lists_screened' and 'as_at' output fields. This substantially exceeds the annotations' readOnly/openWorld/idempotent hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose, use case, matching behavior, caveats, and output fields. Every sentence contributes substantive information; there is no fluff or repetition. The length is justified by the complexity of the tool's behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (sanctions screening with nuanced matching and result interpretation) and the presence of an output schema, the description covers all critical aspects: which lists are screened, matching details, interpretation of results, and meaning of key output fields. It is complete and self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds semantics for the 'name' parameter by explaining how matching behaves (normalised exact/alias match, transliteration caveats), which is not in the schema. It also clarifies that 'entity_type' filters person vs entity, consistent with the schema. This adds value beyond the structured field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Screen a name against the UK (OFSI), US (OFAC), EU and UN consolidated sanctions lists.' It uses a specific verb ('screen') and specific resource (sanctions lists), and is distinct from sibling tools which focus on company/gazette/land data. The title reinforces the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: 'Use it to check whether a counterparty — or its officers / persons with significant control — appears on a sanctions list.' It also provides important caveats about what the tool is not for: 'This is a screening aid, not a compliance determination.' While it doesn't name alternative tools (none exist among siblings), the when-to-use and when-not-to-use guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vat_validateValidate UK VAT Number (HMRC)A
Read-onlyIdempotent
Inspect

Validate a UK (GB) VAT number against the HMRC register. UK numbers only.

Returns the trading name and address as registered with HMRC for VAT purposes. The VAT-registered trading address often differs from the Companies House registered address — that discrepancy is a due diligence signal worth noting.

Non-UK (EU) VAT numbers cannot be validated here — use the EU VIES service for other member states.

ParametersJSON Schema
NameRequiredDescriptionDefault
vat_numberYesUK (GB) VAT registration number — this tool validates UK numbers only. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYesTrue if HMRC confirmed the VAT number is currently registered. False means HMRC returned 404 (not registered / deregistered).
vat_numberYesCanonical VAT number in 'GB<9 digits>' format.
trading_nameNoTrading name registered with HMRC for VAT. Compare with the Companies House name — discrepancies are a due diligence signal.
registered_addressNoVAT-registered trading address. May differ from the Companies House registered office address.
consultation_numberNoHMRC consultation reference number for this lookup.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful context: it returns the trading name and address, and notes that this often differs from the Companies House registered address, framing it as a due diligence signal. This goes beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short paragraphs, each earning its place: core purpose, return-value detail with a practical caveat, and an explicit scope limitation with an alternative. It is front-loaded, efficient, and free of fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple one-parameter tool with an output schema present. The description covers the return values, the UK-only scope, the external alternative, and a subtle due-diligence nuance. Nothing important is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for the single parameter, including accepted formats and normalization behavior. The description itself adds no additional parameter-specific meaning, so the baseline score of 3 is appropriate; the schema already does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Validate a UK (GB) VAT number against the HMRC register,' using a specific verb and resource while immediately clarifying the UK-only scope. This clearly distinguishes it from sibling search/profile tools that focus on company or charity data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'Non-UK (EU) VAT numbers cannot be validated here — use the EU VIES service for other member states,' providing both an exclusion and a concrete alternative. For UK numbers, the implied use case is clear and unambiguous.

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. Dates show when Glama detected each change.

  1. 10 tool updates
    • Addedcompany_charges
    • Addedcompany_filing_document
    • Addedcompany_filing_history
    • Changedcompany_officers3 fields changed
      • addedInput schema / properties / include_resigned
        Added value: +{
        +  "default": false,
        +  "description": "Include resigned/historic officers. Default false for backwards-compatible current-officer queries.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / start_index / description
        Previous value: -"Ignored — all officers are returned in one call."New value: +"Ignored — pagination is handled internally. Only accepted to avoid call failures."
      • addedOutput schema / properties / officers / items / properties / officer_id
        Added 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."
        +}
    • Changedcompany_profile4 fields changed
      • addedOutput schema / properties / has_charges / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / has_charges / default
        Previous value: -falseNew value: +null
      • changedOutput schema / properties / has_charges / description
        Previous 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."
      • removedOutput schema / properties / has_charges / type
        Removed value: -"boolean"
    • Changedcompany_psc1 field changed
      • addedOutput schema / properties / psc / items / properties / date_of_birth
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Partial date of birth (month/year) for individual PSCs as returned by CH.",
        +  "type": "object"
        +}
    • Changedgazette_insolvency3 fields changed
      • changedInput schema / properties / notice_type / description
        Previous 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."
      • changedOutput schema / properties / notices / items / properties / notice_code / description
        Previous 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)."
      • changedOutput schema / properties / notices / items / properties / severity / description
        Previous 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)."
    • Removedget_prompt
    • Removedlist_prompts
    • Addedofficer_appointments
  2. 3 tool updates
    • Changeddisqualified_search8 fields changed
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 200,
        +      "minLength": 2,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Alias for query — the person's name."
        +}
      • addedInput schema / properties / query / anyOf
        Added value: +[
        +  {
        +    "maxLength": 200,
        +    "minLength": 2,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / default
        Added value: +null
      • changedInput schema / properties / query / description
        Previous 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."
      • removedInput schema / properties / query / maxLength
        Removed value: -200
      • removedInput schema / properties / query / minLength
        Removed value: -2
      • removedInput schema / properties / query / type
        Removed value: -"string"
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
    • Changedgazette_insolvency9 fields changed
      • addedInput schema / properties / entity_name / anyOf
        Added value: +[
        +  {
        +    "maxLength": 200,
        +    "minLength": 2,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / entity_name / default
        Added value: +null
      • changedInput schema / properties / entity_name / description
        Previous value: -"Company or individual name to search for in Gazette insolvency notices"New value: +"Deprecated alias for name."
      • removedInput schema / properties / entity_name / maxLength
        Removed value: -200
      • removedInput schema / properties / entity_name / minLength
        Removed value: -2
      • removedInput schema / properties / entity_name / type
        Removed value: -"string"
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 200,
        +      "minLength": 2,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Company or individual name to search for in Gazette insolvency notices"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 200,
        +      "minLength": 2,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Alias for name."
        +}
      • removedInput schema / required
        Removed value: -[
        -  "entity_name"
        -]
    • Changedvat_validate1 field changed
      • changedInput schema / properties / vat_number / description
        Previous 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."
  3. 1 tool update
    • Addedsanctions_screen
  4. 22 tool updates
    • Addedcharity_profile
    • Addedcharity_search
    • Addedcompany_officers
    • Addedcompany_profile
    • Addedcompany_psc
    • Addedcompany_search
    • Addeddisqualified_profile
    • Addeddisqualified_search
    • Addedfetch
    • Addedgazette_insolvency
    • Addedgazette_notice
    • Removedget_doc
    • Removedget_functions
    • Removedget_section
    • Addedland_title_search
    • Removedlist_docs
    • Removedlist_sections
    • Removedresolve_topic
    • Addedsearch
    • Removedsearch_docs
    • Removedvalidate_function
    • Addedvat_validate
  5. 22 tool updates
    • Removedcharity_profile
    • Removedcharity_search
    • Removedcompany_officers
    • Removedcompany_profile
    • Removedcompany_psc
    • Removedcompany_search
    • Removeddisqualified_profile
    • Removeddisqualified_search
    • Removedfetch
    • Removedgazette_insolvency
    • Removedgazette_notice
    • Addedget_doc
    • Addedget_functions
    • Addedget_section
    • Removedland_title_search
    • Addedlist_docs
    • Addedlist_sections
    • Addedresolve_topic
    • Removedsearch
    • Addedsearch_docs
    • Addedvalidate_function
    • Removedvat_validate
  6. 2 tool updates
    • Addedget_prompt
    • Addedlist_prompts
  7. 1 tool update
    • Changedcompany_officers2 fields changed
      • addedInput schema / properties / items_per_page
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Ignored — pagination is handled internally. Only accepted to avoid call failures."
        +}
      • addedInput schema / properties / start_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Ignored — all officers are returned in one call."
        +}
  8. 2 tool updates
    • Addedfetch
    • Addedsearch
  9. 4 tool updates
    • Changedcharity_profile2 fields changed
      • changedOutput schema / properties / trustee_names / description
        Previous value: -"Trustees on record. The list may be truncated per the `max_trustees` input."New value: +"Trustees on record. Truncated to 30 entries."
      • changedOutput schema / properties / who_what_where / description
        Previous value: -"Who/What/Where classification entries. The list may be truncated per the `max_classifications` input."New value: +"Who/What/Where classification entries. The list may be truncated truncated to 50 entries."
    • Changedcompany_psc1 field changed
      • changedOutput schema / properties / psc / items / properties / natures_of_control / description
        Previous value: -"List of 'nature of control' descriptors (e.g. 'ownership-of-shares-75-to-100-percent'). Individual entries may be truncated per the `max_nature_chars` input."New value: +"List of 'nature of control' descriptors (e.g. 'ownership-of-shares-75-to-100-percent'). Individual entries may be truncated to 300 characters each."
    • Changeddisqualified_profile1 field changed
      • changedOutput schema / properties / disqualifications / items / properties / company_names / description
        Previous value: -"Companies associated with this disqualification. The list may be truncated per the `max_companies` input."New value: +"Companies associated with this disqualification. The list may be truncated to 20 entries."
    • Addedgazette_notice
  10. 7 tool updates
    • Addedcharity_profile
    • Addedcompany_officers
    • Addedcompany_profile
    • Addedcompany_psc
    • Addeddisqualified_profile
    • Removedlist_resources
    • Removedread_resource
  11. 1 tool update
    • Changedgazette_insolvency2 fields changed
      • changedInput schema / properties / max_notices / description
        Previous value: -"Global cap on total notices returned across all codes, after severity/date sort. Default 20. Raise up to 140 (14 codes × 10) to see the full result set."New value: +"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."
      • changedInput schema / properties / max_notices / maximum
        Previous value: -140New value: +100
  12. 1 tool update
    • Changedgazette_insolvency8 fields changed
      • removedInput schema / properties / max_content_chars
        Removed value: -{
        -  "default": 500,
        -  "description": "Per-notice cap on the free-text `content` field. Default 500 keeps responses bounded; raise for notices where the full legal wording matters.",
        -  "maximum": 20000,
        -  "minimum": 50,
        -  "type": "integer"
        -}
      • changedOutput schema / properties / notices / items / properties / content / description
        Previous value: -"Notice body. May be truncated per the `max_content_chars` input."New value: +"Brief notice excerpt from the search feed (HTML stripped). For full legal wording read notice://{notice_numeric_id}."
      • removedOutput schema / properties / notices / items / properties / content_original_length
        Removed value: -{
        -  "default": 0,
        -  "description": "Original length of the notice content before truncation.",
        -  "type": "integer"
        -}
      • removedOutput schema / properties / notices / items / properties / content_truncated
        Removed value: -{
        -  "default": false,
        -  "description": "True if content was truncated.",
        -  "type": "boolean"
        -}
      • changedOutput schema / properties / notices / items / properties / date / description
        Previous value: -"Publication/notice date (ISO format where available)."New value: +"Publication date (ISO YYYY-MM-DD)."
      • removedOutput schema / properties / notices / items / properties / edition
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Gazette edition identifier."
        -}
      • changedOutput schema / properties / notices / items / properties / notice_id / description
        Previous value: -"Upstream notice ID (typically a URI)."New value: +"Gazette notice URI (e.g. 'https://www.thegazette.co.uk/id/notice/5122793')."
      • addedOutput schema / properties / notices / items / properties / notice_numeric_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Numeric notice ID. Read full notice content via the notice://{notice_numeric_id} resource."
        +}
  13. 2 tool updates
    • Changedgazette_insolvency4 fields changed
      • addedInput schema / properties / max_notices
        Added value: +{
        +  "default": 20,
        +  "description": "Global cap on total notices returned across all codes, after severity/date sort. Default 20. Raise up to 140 (14 codes × 10) to see the full result set.",
        +  "maximum": 140,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / max_notices_cap
        Added value: +{
        +  "description": "The max_notices cap applied. Upstream may have more matching notices.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / total_notices / description
        Previous value: -"Total notices returned after deduplication and sorting."New value: +"Total notices returned after deduplication, sorting, and cap."
      • changedOutput schema / required
        Previous value: -[
        -  "entity_name",
        -  "total_notices"
        -]New value: +[
        +  "entity_name",
        +  "total_notices",
        +  "max_notices_cap"
        +]
    • Changedland_title_search2 fields changed
      • changedOutput schema / description
        Previous value: -"HMLR land registry search result for a given postcode."New value: +"HMLR Price Paid Index search result for a given postcode."
      • removedOutput schema / properties / title_data
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Title ownership data from the HMLR title endpoint. Currently always empty — the free title endpoint does not return data for most lookups.",
        -  "type": "object"
        -}
  14. 7 tool updates
    • Removedcharity_profile
    • Removedcompany_officers
    • Removedcompany_profile
    • Removedcompany_psc
    • Removeddisqualified_profile
    • Addedlist_resources
    • Addedread_resource
  15. 11 tool updates
    • Changedcharity_profile27 fields changed
      • addedInput schema / properties / max_classifications
        Added value: +{
        +  "default": 50,
        +  "description": "Cap on the number of Who/What/Where classification entries returned. Large charities have 100+. Default 50.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_trustees
        Added value: +{
        +  "default": 30,
        +  "description": "Cap on the number of trustees returned. Prolific charities have 50+ trustees on file. Default 30.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Full Charity Commission profile for a single charity."
      • addedOutput schema / properties / address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Registered address of the charity (joined address lines)."
        +}
      • addedOutput schema / properties / charity_co_reg_number
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Companies House number for charities also registered as companies (Charitable Incorporated Organisations, etc.)."
        +}
      • addedOutput schema / properties / charity_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Registered charity name."
        +}
      • addedOutput schema / properties / charity_number
        Added value: +{
        +  "description": "Charity registration number.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / charity_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Charity type."
        +}
      • addedOutput schema / properties / countries_of_operation
        Added value: +{
        +  "description": "Countries the charity operates in (capped at 10 upstream).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / date_of_registration
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Date of first registration."
        +}
      • addedOutput schema / properties / in_administration
        Added value: +{
        +  "default": false,
        +  "description": "True if the charity is in administration.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / insolvent
        Added value: +{
        +  "default": false,
        +  "description": "True if the charity is flagged as insolvent.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / latest_expenditure
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Latest filed annual expenditure in GBP."
        +}
      • addedOutput schema / properties / latest_income
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Latest filed annual income in GBP."
        +}
      • addedOutput schema / properties / raw
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Full raw Charity Commission profile payload for any field not surfaced explicitly on this model.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / reg_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Registration status code ('R', 'RM')."
        +}
      • addedOutput schema / properties / reg_status_label
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Human-readable registration status."
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / trustee_names
        Added value: +{
        +  "description": "Trustees on record. The list may be truncated per the `max_trustees` input.",
        +  "items": {
        +    "description": "A single charity trustee record.",
        +    "properties": {
        +      "trustee_name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Trustee name."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / trustee_names_total
        Added value: +{
        +  "default": 0,
        +  "description": "Total trustees upstream before truncation.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / trustee_names_truncated
        Added value: +{
        +  "default": false,
        +  "description": "True if the trustee list was truncated.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / who_what_where
        Added value: +{
        +  "description": "Who/What/Where classification entries. The list may be truncated per the `max_classifications` input.",
        +  "items": {
        +    "description": "Who/What/Where classification descriptor.",
        +    "properties": {
        +      "classification_desc": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Classification description text."
        +      },
        +      "classification_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Classification axis: 'What', 'Who', or 'Where'."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / who_what_where_total
        Added value: +{
        +  "default": 0,
        +  "description": "Total classification entries upstream before truncation.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / who_what_where_truncated
        Added value: +{
        +  "default": false,
        +  "description": "True if the classification list was truncated.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "charity_number"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcharity_search17 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "description": "Max items to return in this page. Default 20; raise to 100 for bulk views.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of items to skip before this page. Default 0.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • removedInput schema / properties / page_num
        Removed value: -{
        -  "default": 1,
        -  "description": "Page number (1-indexed)",
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • removedInput schema / properties / page_size
        Removed value: -{
        -  "default": 20,
        -  "description": "Number of results per page (max 100)",
        -  "maximum": 100,
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • removedInput schema / properties / registration_status
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": "Registered",
        -  "description": "Filter by registration status: 'Registered' or 'Removed'. Default: Registered."
        -}
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Paginated result of a Charity Commission name search."
      • addedOutput schema / properties / charities
        Added value: +{
        +  "description": "Matching charity records.",
        +  "items": {
        +    "description": "A single hit in a Charity Commission name search.",
        +    "properties": {
        +      "charity_name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Registered charity name."
        +      },
        +      "charity_number": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Charity Commission registration number. Pass to charity_profile for the full record."
        +      },
        +      "date_of_registration": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date of first registration (ISO YYYY-MM-DD)."
        +      },
        +      "reg_status": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Registration status code as returned upstream: 'R' registered, 'RM' removed."
        +      },
        +      "reg_status_label": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Human-readable registration status ('Registered', 'Removed')."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True if more items may exist beyond this page. Re-call with offset=offset+returned to continue.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / limit
        Added value: +{
        +  "description": "Max items requested for this page.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Number of items skipped before this page (client-side).",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Search term applied.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / returned
        Added value: +{
        +  "description": "Items actually returned on this page.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "description": "Total matches returned by upstream.",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "query",
        +  "total",
        +  "offset",
        +  "limit",
        +  "returned",
        +  "has_more"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcompany_officers11 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Max officers to fetch from Companies House (upstream items_per_page). Default 100.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"List of officers for a given company."
      • addedOutput schema / properties / company_number
        Added value: +{
        +  "description": "Companies House company number.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / high_appointment_count_flag
        Added value: +{
        +  "default": 0,
        +  "description": "Number of active officers with 10+ total appointments. Non-zero values are a nominee/phoenix director risk signal.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / include_resigned
        Added value: +{
        +  "description": "Whether resigned officers were included in this result.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / officers
        Added value: +{
        +  "description": "Officer records.",
        +  "items": {
        +    "description": "A single officer (director, secretary, etc.) of a company.",
        +    "properties": {
        +      "address": {
        +        "additionalProperties": true,
        +        "description": "Officer correspondence address.",
        +        "type": "object"
        +      },
        +      "appointed_on": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date of appointment (ISO YYYY-MM-DD)."
        +      },
        +      "appointment_count": {
        +        "default": 0,
        +        "description": "Total number of other active appointments held by this officer. Values of 10+ are a nominee/phoenix risk signal.",
        +        "type": "integer"
        +      },
        +      "country_of_residence": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Declared country of residence."
        +      },
        +      "date_of_birth": {
        +        "additionalProperties": true,
        +        "description": "Partial date of birth (month/year) as returned by CH.",
        +        "type": "object"
        +      },
        +      "links": {
        +        "additionalProperties": true,
        +        "description": "Upstream relational links (e.g. officer profile URL).",
        +        "type": "object"
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Officer name as recorded at CH."
        +      },
        +      "nationality": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Declared nationality."
        +      },
        +      "occupation": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Declared occupation."
        +      },
        +      "officer_role": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Officer role (e.g. 'director', 'secretary', 'llp-member')."
        +      },
        +      "resigned_on": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date of resignation if resigned, otherwise null."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / total
        Added value: +{
        +  "description": "Total officers returned (filtered by include_resigned).",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "company_number",
        +  "include_resigned",
        +  "total"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcompany_profile16 fields changed
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Full Companies House profile for a single company number."
      • addedOutput schema / properties / accounts
        Added value: +{
        +  "description": "Accounts filing status and due dates.",
        +  "properties": {
        +    "last_accounts_made_up_to": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "ISO date the most recent filed accounts were made up to."
        +    },
        +    "next_due": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "ISO date the next set of accounts is due."
        +    },
        +    "overdue": {
        +      "default": false,
        +      "description": "True if accounts are past their due date at Companies House.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / company_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Registered company name."
        +}
      • addedOutput schema / properties / company_number
        Added value: +{
        +  "description": "Companies House company number.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / company_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Current status (active, dissolved, in liquidation, etc.)."
        +}
      • addedOutput schema / properties / company_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Companies House company type code."
        +}
      • addedOutput schema / properties / confirmation_statement
        Added value: +{
        +  "description": "Confirmation statement filing status and next due date.",
        +  "properties": {
        +    "next_due": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "ISO date the next confirmation statement is due."
        +    },
        +    "overdue": {
        +      "default": false,
        +      "description": "True if the confirmation statement is past its due date.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / date_of_creation
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Incorporation date (ISO YYYY-MM-DD)."
        +}
      • addedOutput schema / properties / has_charges
        Added value: +{
        +  "default": false,
        +  "description": "True if the company has active registered charges (secured debt). A due diligence signal.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / raw
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Full raw Companies House profile payload. Use for any field not surfaced explicitly on this model.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / registered_office_address
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Registered office address as returned by Companies House.",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / sic_codes
        Added value: +{
        +  "description": "Standard Industrial Classification codes.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "company_number"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcompany_psc10 fields changed
      • addedInput schema / properties / max_nature_chars
        Added value: +{
        +  "default": 300,
        +  "description": "Per-entry cap on each 'nature of control' descriptor. Upstream entries are sometimes long legal text. Default 300.",
        +  "maximum": 5000,
        +  "minimum": 50,
        +  "type": "integer"
        +}
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"List of Persons with Significant Control for a company."
      • addedOutput schema / properties / company_number
        Added value: +{
        +  "description": "Companies House company number.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / overseas_corporate_psc_flag
        Added value: +{
        +  "default": 0,
        +  "description": "Number of corporate PSCs registered outside the UK. Non-zero values indicate an offshore beneficial ownership chain.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / psc
        Added value: +{
        +  "description": "Persons with Significant Control records.",
        +  "items": {
        +    "description": "A single Person with Significant Control record.",
        +    "properties": {
        +      "address": {
        +        "additionalProperties": true,
        +        "description": "PSC correspondence address.",
        +        "type": "object"
        +      },
        +      "ceased_on": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date PSC status ceased, if applicable."
        +      },
        +      "country_of_residence": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Declared country of residence for individual PSCs."
        +      },
        +      "identification": {
        +        "additionalProperties": true,
        +        "description": "Identification block for corporate PSCs: place_registered, registration_number, country_registered, legal_authority, etc.",
        +        "type": "object"
        +      },
        +      "kind": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Upstream 'kind' (e.g. 'individual-person-with-significant-control', 'corporate-entity-person-with-significant-control')."
        +      },
        +      "name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "PSC name (individual or entity)."
        +      },
        +      "nationality": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Declared nationality for individual PSCs."
        +      },
        +      "natures_of_control": {
        +        "description": "List of 'nature of control' descriptors (e.g. 'ownership-of-shares-75-to-100-percent'). Individual entries may be truncated per the `max_nature_chars` input.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "notified_on": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date notified as a PSC (ISO YYYY-MM-DD)."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / total
        Added value: +{
        +  "description": "Total PSC entries returned for this company.",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "company_number",
        +  "total"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcompany_search15 fields changed
      • changedInput schema / properties / items_per_page / description
        Previous value: -"Number of results to return (max 100)"New value: +"Number of results to return (max 100). Default 20."
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedInput schema / properties / start_index / description
        Previous value: -"Pagination offset"New value: +"Pagination offset. Default 0."
      • addedInput schema / properties / start_index / maximum
        Added value: +10000
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Paginated result of a Companies House company search."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True if more results exist beyond this page. Re-call with start_index=start_index+items_per_page to fetch the next page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / items
        Added value: +{
        +  "description": "Matching companies. Use the `company_number` field to call company_profile, company_officers, or company_psc for full detail.",
        +  "items": {
        +    "description": "A single entry in a Companies House search result.",
        +    "properties": {
        +      "address": {
        +        "additionalProperties": true,
        +        "description": "Registered office address as returned by the Companies House API.",
        +        "type": "object"
        +      },
        +      "company_number": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Companies House company number (e.g. '12345678')."
        +      },
        +      "company_status": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Company status (e.g. 'active', 'dissolved', 'liquidation')."
        +      },
        +      "company_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Companies House company type code (e.g. 'ltd', 'plc', 'llp')."
        +      },
        +      "date_of_creation": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Incorporation date in ISO format (YYYY-MM-DD)."
        +      },
        +      "description": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Short upstream description (usually number + status + creation date)."
        +      },
        +      "sic_codes": {
        +        "description": "Standard Industrial Classification codes associated with the company.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Registered company name."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / items_per_page
        Added value: +{
        +  "description": "Page size requested from the API for this call.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "The query string that was searched.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / returned
        Added value: +{
        +  "description": "Number of items actually returned on this page.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / start_index
        Added value: +{
        +  "description": "Number of results skipped before this page (upstream start_index).",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total_results
        Added value: +{
        +  "description": "Total matching companies in Companies House (server-side).",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "query",
        +  "total_results",
        +  "start_index",
        +  "items_per_page",
        +  "returned",
        +  "has_more"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changeddisqualified_profile14 fields changed
      • addedInput schema / properties / max_companies
        Added value: +{
        +  "default": 20,
        +  "description": "Per-order cap on the `company_names[]` array. Prolific disqualified directors are attached to 20+ companies per order. Default 20.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Full disqualification record for a disqualified officer."
      • addedOutput schema / properties / date_of_birth
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Date of birth on record."
        +}
      • addedOutput schema / properties / disqualifications
        Added value: +{
        +  "description": "All disqualification orders attached to this officer.",
        +  "items": {
        +    "description": "A single disqualification order attached to a disqualified director.",
        +    "properties": {
        +      "address": {
        +        "additionalProperties": true,
        +        "description": "Address on record at the time of the order.",
        +        "type": "object"
        +      },
        +      "case_identifier": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Upstream case_identifier, when provided."
        +      },
        +      "company_names": {
        +        "description": "Companies associated with this disqualification. The list may be truncated per the `max_companies` input.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "company_names_total": {
        +        "default": 0,
        +        "description": "Total number of companies originally attached to this order before truncation (may equal `len(company_names)`).",
        +        "type": "integer"
        +      },
        +      "company_names_truncated": {
        +        "default": false,
        +        "description": "True if the company_names list was truncated to max_companies.",
        +        "type": "boolean"
        +      },
        +      "disqualified_from": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Start date of the disqualification period."
        +      },
        +      "disqualified_until": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "End date of the disqualification period."
        +      },
        +      "heard_on": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date the order was heard, when provided."
        +      },
        +      "last_variation": {
        +        "additionalProperties": true,
        +        "description": "Details of the last variation of this order, if any.",
        +        "type": "object"
        +      },
        +      "reason": {
        +        "additionalProperties": true,
        +        "description": "Reason block as returned upstream: act, section, description_identifier, article, etc.",
        +        "type": "object"
        +      },
        +      "undertaken_on": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date the undertaking was given, when provided."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / forename
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Given name, if split upstream."
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Officer name."
        +}
      • addedOutput schema / properties / nationality
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Declared nationality."
        +}
      • addedOutput schema / properties / officer_id
        Added value: +{
        +  "description": "Companies House officer ID looked up.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / officer_kind
        Added value: +{
        +  "description": "Which CH endpoint returned the record: 'natural' (individual) or 'corporate' (legal entity).",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / surname
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Family name, if split upstream."
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "officer_id",
        +  "officer_kind"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changeddisqualified_search15 fields changed
      • changedInput schema / properties / items_per_page / description
        Previous value: -"Results per page (max 100)"New value: +"Results per page (max 100). Default 20."
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedInput schema / properties / start_index / description
        Previous value: -"Pagination offset (0-based)"New value: +"Pagination offset (0-based). Default 0."
      • addedInput schema / properties / start_index / maximum
        Added value: +10000
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Paginated disqualified officers search result."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True if more items may exist beyond this page. Re-call with start_index=start_index+items_per_page to continue.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / items
        Added value: +{
        +  "description": "Matching disqualified officer records.",
        +  "items": {
        +    "description": "A single hit in a disqualified officers search.",
        +    "properties": {
        +      "address": {
        +        "additionalProperties": true,
        +        "description": "Last known address of the disqualified officer.",
        +        "type": "object"
        +      },
        +      "date_of_birth": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Date of birth as returned by the search API."
        +      },
        +      "links": {
        +        "additionalProperties": true,
        +        "description": "Upstream relational links (self, etc.).",
        +        "type": "object"
        +      },
        +      "officer_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Companies House officer ID extracted from the self link. Pass to disqualified_profile for the full disqualification record."
        +      },
        +      "snippet": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Upstream match snippet highlighting query terms."
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Display title (typically the officer's name)."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / items_per_page
        Added value: +{
        +  "description": "Page size requested.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Search query applied.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / returned
        Added value: +{
        +  "description": "Items actually returned on this page.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / start_index
        Added value: +{
        +  "description": "Pagination offset for this page.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total_results
        Added value: +{
        +  "description": "Total matching records upstream at Companies House.",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "query",
        +  "total_results",
        +  "start_index",
        +  "items_per_page",
        +  "returned",
        +  "has_more"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedgazette_insolvency12 fields changed
      • addedInput schema / properties / max_content_chars
        Added value: +{
        +  "default": 500,
        +  "description": "Per-notice cap on the free-text `content` field. Default 500 keeps responses bounded; raise for notices where the full legal wording matters.",
        +  "maximum": 20000,
        +  "minimum": 50,
        +  "type": "integer"
        +}
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"Aggregated Gazette insolvency notice search result."
      • addedOutput schema / properties / end_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Upper bound of the date range filter, if any."
        +}
      • addedOutput schema / properties / entity_name
        Added value: +{
        +  "description": "Entity name that was searched.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / notice_type_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Notice code filter applied, or null if all codes searched."
        +}
      • addedOutput schema / properties / notices
        Added value: +{
        +  "description": "Matching notices, sorted by severity (desc) then date (desc).",
        +  "items": {
        +    "description": "A single corporate insolvency notice from The Gazette.",
        +    "properties": {
        +      "content": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Notice body. May be truncated per the `max_content_chars` input."
        +      },
        +      "content_original_length": {
        +        "default": 0,
        +        "description": "Original length of the notice content before truncation.",
        +        "type": "integer"
        +      },
        +      "content_truncated": {
        +        "default": false,
        +        "description": "True if content was truncated.",
        +        "type": "boolean"
        +      },
        +      "date": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Publication/notice date (ISO format where available)."
        +      },
        +      "edition": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gazette edition identifier."
        +      },
        +      "notice_code": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gazette notice code (e.g. '2443' winding-up order, '2448' administration order)."
        +      },
        +      "notice_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Upstream notice ID (typically a URI)."
        +      },
        +      "notice_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Human-readable notice type label (e.g. 'Winding-Up Order')."
        +      },
        +      "severity": {
        +        "default": 0,
        +        "description": "Internal severity score 0-10. Higher = more serious (10 = Winding-Up Order, 9 = Administration Order / Receiver, 0 = unclassified).",
        +        "type": "integer"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Notice title."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / start_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Lower bound of the date range filter, if any."
        +}
      • addedOutput schema / properties / total_notices
        Added value: +{
        +  "description": "Total notices returned after deduplication and sorting.",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "entity_name",
        +  "total_notices"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedland_title_search9 fields changed
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"HMLR land registry search result for a given postcode."
      • addedOutput schema / properties / postcode
        Added value: +{
        +  "description": "Normalised UK postcode extracted from the input.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / title_data
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Title ownership data from the HMLR title endpoint. Currently always empty — the free title endpoint does not return data for most lookups.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "description": "Number of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / transactions
        Added value: +{
        +  "description": "Recent Price Paid transactions for the postcode, sorted newest first.",
        +  "items": {
        +    "description": "A single Price Paid transaction for a property.",
        +    "properties": {
        +      "county": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "County."
        +      },
        +      "estate_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tenure / estate type label (e.g. 'Freehold', 'Leasehold')."
        +      },
        +      "paon": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Primary addressable object name (house number or name)."
        +      },
        +      "postcode": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Property postcode."
        +      },
        +      "price_paid": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Sale price in GBP (integer pounds)."
        +      },
        +      "property_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Property type label extracted from the HMLR URI (e.g. 'Terraced', 'Semi Detached', 'Flat')."
        +      },
        +      "saon": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Secondary addressable object name (flat/unit identifier)."
        +      },
        +      "street": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Street name."
        +      },
        +      "town": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Town/city."
        +      },
        +      "transaction_date": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Transaction date (ISO YYYY-MM-DD)."
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "postcode",
        +  "total"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedvat_validate10 fields changed
      • removedInput schema / properties / response_format
        Removed value: -{
        -  "default": "markdown",
        -  "description": "Output format: 'markdown' or 'json'",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Generic wrapper for non-object return types."New value: +"HMRC VAT validation result."
      • addedOutput schema / properties / consultation_number
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "HMRC consultation reference number for this lookup."
        +}
      • addedOutput schema / properties / registered_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "VAT-registered trading address. May differ from the Companies House registered office address."
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / trading_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Trading name registered with HMRC for VAT. Compare with the Companies House name — discrepancies are a due diligence signal."
        +}
      • addedOutput schema / properties / valid
        Added value: +{
        +  "description": "True if HMRC confirmed the VAT number is currently registered. False means HMRC returned 404 (not registered / deregistered).",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / vat_number
        Added value: +{
        +  "description": "Canonical VAT number in 'GB<9 digits>' format.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "valid",
        +  "vat_number"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
  16. 11 tool updates
    • First observedcharity_profile
    • First observedcharity_search
    • First observedcompany_officers
    • First observedcompany_profile
    • First observedcompany_psc
    • First observedcompany_search
    • First observeddisqualified_profile
    • First observeddisqualified_search
    • First observedgazette_insolvency
    • First observedland_title_search
    • First observedvat_validate

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    C
    maintenance
    Provides access to UK Companies House public data, enabling search and retrieval of company profiles, officers, filing history, and more through natural language queries.
    12
    -
  • A
    license
    A
    quality
    D
    maintenance
    Unmodified government company data from 27 registries, live. Cross-border UBO chain walker for AI agents. 60+ tools covering GB, IE, NO, FR, DE, NL, PL, BE, CH, LI, MC, IM, IS, CY, AU, NZ, CA, TW, HK, MY, FI, CZ, ES, IT, KR, US — raw upstream fields preserved, no LLM extraction.
    10
    17
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides real-time company verification and corporate intelligence by accessing global registries like UK Companies House, Singapore ACRA, and OpenCorporates. It enables AI agents to perform KYC tasks, retrieve company profiles, and conduct automated risk assessments for due diligence workflows.
    249
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

The domain-specific tools are clearly distinct (search vs profile for each register), and the generic search/fetch tools are designed to route across them. Potential overlap between company_officers and company_psc is resolved by clear descriptions of officers vs beneficial ownership. Slight ambiguity exists between generic fetch/search and the domain-specific counterparts, but the routing logic is well-documented.

Naming Consistency4/5

Most tools follow a consistent resource_action pattern with clear prefixes (charity_, company_, disqualified_, gazette_). Exceptions like company_officers, company_psc, sanctions_screen, and vat_validate deviate from the verb-first convention, and generic tools (fetch, search, get_prompt, list_prompts) do not follow the pattern. Overall, the naming is readable and predictable despite a few outliers.

Tool Count4/5

With 17 tools, the server sits slightly above the typical 3-15 well-scoped range, but the breadth of the domain (Companies House, Charity Commission, disqualifications, Gazette insolvency, sanctions, land registry, VAT) justifies the count. Each tool serves a distinct data source or action, and the two prompt-management tools are standard MCP utilities. The count feels appropriate rather than excessive.

Completeness4/5

The server covers the core due diligence workflow: searching and retrieving profiles for companies, charities, and disqualified directors, plus insolvency notices, sanctions screening, land transactions, and VAT validation. Minor gaps exist, such as no direct tool for company accounts or court judgments, but these are not core to the apparent purpose and can be worked around.