UK Due Diligence
Server Details
UK due diligence — Companies House, Charity Commission, Land Registry, Gazette, HMRC VAT
- 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 toolscharity_profileGet Charity ProfileARead-onlyIdempotentInspect
Fetch the full Charity Commission profile for a charity number.
Returns trustees, latest income/expenditure, insolvency flags, governing document type, classifications, and countries of operation. Use charity_search first to find the charity number.
| Name | Required | Description | Default |
|---|---|---|---|
| charity_number | Yes | Charity Commission registration number (e.g. '1234567'). Returned by charity_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | No | Registered address of the charity (joined address lines). |
| insolvent | No | True if the charity is flagged as insolvent. |
| reg_status | No | Registration status code ('R', 'RM'). |
| charity_name | No | Registered charity name. |
| charity_type | No | Charity type. |
| latest_income | No | Latest filed annual income in GBP. |
| trustee_names | No | Trustees on record. Truncated to 30 entries. |
| charity_number | Yes | Charity registration number. |
| who_what_where | No | Who/What/Where classification entries. The list may be truncated truncated to 50 entries. |
| reg_status_label | No | Human-readable registration status. |
| in_administration | No | True if the charity is in administration. |
| latest_expenditure | No | Latest filed annual expenditure in GBP. |
| trustee_names_total | No | Total trustees upstream before truncation. |
| date_of_registration | No | Date of first registration. |
| who_what_where_total | No | Total classification entries upstream before truncation. |
| charity_co_reg_number | No | Companies House number for charities also registered as companies (Charitable Incorporated Organisations, etc.). |
| countries_of_operation | No | Countries the charity operates in (capped at 10 upstream). |
| trustee_names_truncated | No | True if the trustee list was truncated. |
| who_what_where_truncated | No | True if the classification list was truncated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, and idempotent. The description adds meaningful behavioral context about what data to expect (trustees, income/expenditure, insolvency flags) and that it returns a 'full' profile. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and no filler. The second sentence efficiently lists return contents. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter schema and availability of an output schema, the description covers the essential context: what it fetches, what it returns, and the prerequisite step. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description already explains the format and origin ('Returned by charity_search'). The tool description reinforces the usage but doesn't add new meaning beyond the schema beyond implying the parameter is central to the lookup.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Fetch' with a clear resource ('full Charity Commission profile') and the input parameter ('charity number'). It lists concrete data fields returned (trustees, income/expenditure, insolvency flags, etc.), which distinguishes this from sibling tools like charity_search or company_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use charity_search first to obtain the charity number, which is a clear prerequisite and aligns with the sibling tool. This tells the agent when to use this tool versus the search alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charity_searchSearch Charity Commission RegisterARead-onlyIdempotentInspect
Search the Charity Commission register of England and Wales by name or keyword.
Returns matching charities with registration number, status, and
registration date. Use charity_profile for full details once you
have the charity number. The upstream searchCharityName endpoint
returns the full list in one shot — pagination is applied
client-side via offset/limit. A query that matches nothing is a
successful empty result (charities: []), not an error — the
upstream endpoint signals "no matches" with an HTTP 404, which is
translated back into an empty result here rather than surfaced as
a not-found failure.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return in this page. Default 20; raise to 100 for bulk views. | |
| query | Yes | Charity name or keyword to search for | |
| offset | No | Number of items to skip before this page. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Max items requested for this page. |
| query | Yes | Search term applied. |
| total | Yes | Total matches returned by upstream. |
| offset | Yes | Number of items skipped before this page (client-side). |
| has_more | Yes | True if more items may exist beyond this page. Re-call with offset=offset+returned to continue. |
| returned | Yes | Items actually returned on this page. |
| charities | No | Matching charity records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, but the description adds valuable behavioral detail: the upstream endpoint returns a full list in one shot, pagination is client-side, and an upstream HTTP 404 is translated into a successful empty result rather than an error. This meaningfully changes how the agent should interpret responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence delivers distinct value: scope, returned fields, sibling routing, pagination behavior, and empty-result semantics. There is no filler, no redundancy with the schema, and the key purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema, full parameter documentation, and strong safety hints in annotations, the description covers all practical gaps an agent needs: geographical scope, response fields, navigation to charity_profile, pagination semantics, and error translation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all parameters clearly, but the description adds important deeper context: offset/limit apply client-side because the upstream endpoint returns everything at once. This helps an agent understand the mechanics of pagination beyond the raw schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly names the action ('Search'), the resource ('Charity Commission register of England and Wales'), and the scope ('by name or keyword'). It also distinguishes itself from the charity_profile sibling by describing search-level results versus full details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear direction: use this tool to search and find charity numbers, then 'Use charity_profile for full details once you have the charity number.' This effectively states when to use this tool versus its nearest 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 ChargesARead-onlyIdempotentInspect
Fetch the complete Companies House charge history for a company.
Returns every registered charge (secured debt) — current and historic — with status, dates, secured parties, and what each charge covers (fixed/floating/negative-pledge flags and any free-text particulars). Satisfaction is represented as satisfied_on plus a charge-satisfaction filing entry, not a separate 'release' record. company_profile.has_charges is a True/False/unknown summary derived from this same data; use this tool when the specific charges matter, not just whether any exist.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| charges | No | Every charge, current and historic. |
| total_count | Yes | Total charges returned. |
| company_number | Yes | Companies House company number. |
| satisfied_count | No | Upstream count of satisfied charges, or null if not provided. |
| unfiltered_count | No | Upstream unfiltered charge count, or null if not provided. |
| part_satisfied_count | No | Upstream count of part-satisfied charges, or null if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already 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.
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.
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.
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.
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.
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 DocumentARead-onlyIdempotentInspect
Resolve a filing's document_metadata link to its authoritative source document.
Returns a resource_link (never embedded bytes, never base64) pointing at a company-document:// MCP resource — fetch it via resources/read to get the actual PDF. This tool only reads metadata (category, pages, available content types, byte size); it never downloads the document itself. Use company_filing_history first to find a filing's document_metadata URL.
Requires a resource-capable MCP client to retrieve the actual bytes — a tool-only client can see this result's metadata (company, category, page count, size) but cannot obtain the file through this tool call alone.
| Name | Required | Description | Default |
|---|---|---|---|
| mime_type | No | Which content representation to select, e.g. 'application/pdf'. Omit when the document has only one representation (the near-universal case) — it is auto-selected. Required if the document has more than one; omitting it in that case returns a validation error listing the choices. | |
| document_metadata_url | Yes | The document_metadata URL from a filing's links.document_metadata (returned by company_filing_history) — pass it through verbatim, not a document_id. Must be an exact https://document-api.company-information.service.gov.uk/document/{id} URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the 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.
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.
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.
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.
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.
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 HistoryARead-onlyIdempotentInspect
Fetch one page of a company's Companies House filing chronology.
Returns the raw source facts for each filing — transaction ID, form type/category, dates, and the description_values CH uses to render its own text — as delivered upstream, not interpreted into DD conclusions. links.document_metadata on each filing is the identifier a future document-retrieval tool would need; no document content is fetched here.
Unlike company_officers/company_psc/company_charges, this does NOT auto-fetch every page — a long-lived company's filing history is unbounded in practice (a decades-old PLC can carry thousands of filings). total_count/returned/has_more are always reported truthfully for whatever page and category filter was requested; nothing is silently truncated. Narrow with category= for a specific slice (e.g. category='mortgage' for charge-related filings, category='insolvency' for administration/liquidation filings) — a note is included when an unfiltered history is large.
A company_number that doesn't resolve to any company returns a structured not_found error, distinct from a genuine zero-filing result — Companies House's filing-history endpoint alone cannot tell these apart, so existence is confirmed separately when the result would otherwise be empty.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter by CH filing category — comma-separated for multiple, e.g. 'mortgage' or 'mortgage,officers'. Omit for all categories. Common values: accounts, confirmation-statement, officers, address, capital, mortgage, persons-with-significant-control, incorporation, insolvency, resolution, annual-return, change-of-name, change-of-constitution, gazette, miscellaneous. | |
| start_index | No | Pagination offset. Default 0. Re-call with start_index=start_index+returned while has_more is true. | |
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. | |
| items_per_page | No | Results per page (Companies House caps at 100 regardless of a higher value). Default 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note, e.g. suggesting a category filter when total_count is large and no category was applied. Informational only — never a truncation. |
| filings | No | Filings on this page. |
| category | No | The category filter applied to this query, or null if unfiltered. |
| has_more | Yes | True if start_index + returned < total_count. |
| returned | Yes | Filings returned on this page. |
| start_index | Yes | Pagination offset used for this page. |
| total_count | Yes | Total filings matching this query (across all pages). |
| company_number | Yes | Companies House company number. |
| items_per_page | Yes | Page size actually used (CH caps at 100 regardless of a higher request). |
| filing_history_status | No | Upstream filing-history status (e.g. 'filing-history-available'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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 OfficersARead-onlyIdempotentInspect
Fetch officers for a Companies House company number.
Returns directors, secretaries, and other officers with appointment dates, nationality, and country of residence. Resigned officers are excluded by default; set include_resigned=true for historical DD. Pagination is handled internally.
| Name | Required | Description | Default |
|---|---|---|---|
| start_index | No | Ignored — pagination is handled internally. Only accepted to avoid call failures. | |
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. | |
| items_per_page | No | Ignored — pagination is handled internally. Only accepted to avoid call failures. | |
| include_resigned | No | Include resigned/historic officers. Default false for backwards-compatible current-officer queries. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total officers returned (filtered by include_resigned). |
| officers | No | Officer records. |
| company_number | Yes | Companies House company number. |
| include_resigned | Yes | Whether resigned officers were included in this result. |
| high_appointment_count_flag | No | Number of active officers with 10+ total appointments, or null if appointment counts were not fetched. Non-zero values are a nominee/phoenix director risk signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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 ProfileARead-onlyIdempotentInspect
Fetch the full Companies House profile for a company number.
Returns status, registered address, SIC codes, filing compliance (overdue accounts and confirmation statement flags), and whether the company has outstanding charges. Use company_search first to find the company number.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | No | Accounts filing status and due dates. |
| sic_codes | No | Standard Industrial Classification codes. |
| has_charges | No | True if the company has at least one outstanding or part-satisfied charge (secured debt) — not yet fully discharged. False if every charge on record is fully satisfied, or there are none. Null if the charges check could not be completed, or if a charge was returned with an unrecognized status that can't be confidently classified. Use company_charges for the full charge-by-charge detail. |
| company_name | No | Registered company name. |
| company_type | No | Companies House company type code. |
| company_number | Yes | Companies House company number. |
| company_status | No | Current status (active, dissolved, in liquidation, etc.). |
| date_of_creation | No | Incorporation date (ISO YYYY-MM-DD). |
| confirmation_statement | No | Confirmation statement filing status and next due date. |
| registered_office_address | No | Registered office address as returned by Companies House. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already 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.
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.
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.
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.
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.
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 ControlARead-onlyIdempotentInspect
Fetch Persons with Significant Control (beneficial ownership) for a company.
Returns PSC entries with natures of control, nationality, and country of residence. Flags overseas corporate PSC entries as a beneficial ownership risk signal. Returns an explanatory note for widely-held PLCs with no registrable PSC.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| psc | No | Persons with Significant Control records. |
| note | No | Explanatory note when total=0. Typical for widely-held listed PLCs where no single person or entity holds 25%+ of shares or voting rights. |
| total | Yes | Total PSC entries returned for this company. |
| company_number | Yes | Companies House company number. |
| overseas_corporate_psc_flag | No | Number of corporate PSCs registered outside the UK. Non-zero values indicate an offshore beneficial ownership chain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already 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.
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.
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.
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.
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.
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.
company_searchSearch Companies HouseARead-onlyIdempotentInspect
Search the Companies House register by company name or keyword.
Returns a paginated list of matching companies with name, number, status, SIC codes, incorporation date, and registered address. Use company_profile for the full record once you have the company number. Re-call with start_index=start_index+items_per_page to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name or keyword to search for | |
| start_index | No | Pagination offset. Default 0. | |
| company_type | No | Filter by company type (e.g. 'ltd', 'llp'). Omit to search all. | |
| company_status | No | Filter by company status (e.g. 'active', 'dissolved'). Omit to search all. | |
| items_per_page | No | Number of results to return (max 100). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | Matching companies. Use the `company_number` field to call company_profile, company_officers, or company_psc for full detail. |
| query | Yes | The query string that was searched. |
| has_more | Yes | True if more results exist beyond this page. Re-call with start_index=start_index+items_per_page to fetch the next page. |
| returned | Yes | Number of items actually returned on this page. |
| start_index | Yes | Number of results skipped before this page (upstream start_index). |
| total_results | Yes | Total matching companies in Companies House (server-side). |
| items_per_page | Yes | Page size requested from the API for this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds behavioral details beyond annotations: it returns a paginated list with specific fields (name, number, status, SIC codes, incorporation date, registered address) and explains the pagination mechanism, which is valuable, non-obvious context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: purpose, return behavior, and referral/pagination guidance. It is front-loaded and free of redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's search nature, the description covers essential aspects: what it searches, what it returns, how pagination works, and when to use a sibling tool (company_profile). The output schema presumably handles return structure details, so the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description enriches this by clarifying 'query' as company name or keyword and by explicitly stating the pagination formula (start_index=start_index+items_per_page), which adds meaning beyond the schema's individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches the Companies House register by company name or keyword, with a specific verb and resource. It also distinguishes itself from company_profile by explicitly directing users there for full records, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names an alternative (company_profile) and provides an exclusion ('Use company_profile for the full record once you have the company number'). It also gives concrete pagination instructions (re-call with start_index+items_per_page), giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disqualified_profileGet Disqualified Director ProfileARead-onlyIdempotentInspect
Fetch the full disqualification record for a director by officer ID.
Returns all disqualification orders: reason, Act/section cited, disqualification period, and associated company names. Use disqualified_search first to find the officer ID.
| Name | Required | Description | Default |
|---|---|---|---|
| officer_id | Yes | Companies House officer ID. Returned by disqualified_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Officer name. |
| surname | No | Family name, if split upstream. |
| forename | No | Given name, if split upstream. |
| officer_id | Yes | Companies House officer ID looked up. |
| nationality | No | Declared nationality. |
| officer_kind | Yes | Which CH endpoint returned the record: 'natural' (individual) or 'corporate' (legal entity). |
| date_of_birth | No | Date of birth on record. |
| disqualifications | No | All disqualification orders attached to this officer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds the return contents (reasons, Act/section, period, company names) and reinforces the need for a pre-discovered officer ID, which is valuable context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: a clear action statement and a compact list of returns plus usage note. Every phrase contributes value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter with 100% schema coverage and an output schema present, the description fully captures the tool's purpose, prerequisites, and return contents. It is sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers officer_id with a full description including its source. The description repeats this linkage but does not introduce new parameter constraints or types, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Fetch') and the resource ('full disqualification record for a director') via officer ID. It distinguishes itself from the sibling disqualified_search by focusing on retrieval of a specific record rather than searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the prerequisite workflow: 'Use disqualified_search first to find the officer ID.' This provides clear guidance on when to use this tool and points to the alternative tool for discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disqualified_searchSearch Disqualified DirectorsARead-onlyIdempotentInspect
Check whether a named individual is banned from acting as a UK company director.
Use this tool when asked to check disqualified, banned, or barred directors. Query must be an individual's name (e.g. "Richard Howson") — NOT a company name, which always returns zero results.
Returns names, dates of birth, disqualification period snippets, and officer IDs that can be used with disqualified_profile for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Alias for query — the person's name. | |
| query | No | Person's name to search for, e.g. query='Richard Howson'. NOT a company name. | |
| start_index | No | Pagination offset (0-based). Default 0. | |
| items_per_page | No | Results per page (max 100). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | Matching disqualified officer records. |
| query | Yes | Search query applied. |
| has_more | Yes | True if more items may exist beyond this page. Re-call with start_index=start_index+items_per_page to continue. |
| returned | Yes | Items actually returned on this page. |
| start_index | Yes | Pagination offset for this page. |
| total_results | Yes | Total matching records upstream at Companies House. |
| items_per_page | Yes | Page size requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds key behavioral context beyond that: the company name query returns zero results (a known pitfall), and it reveals the return shape (names, DOBs, snippets, officer IDs) plus a pointer to disqualified_profile for follow-up. This exceeds the annotation baseline without being exhaustive about rate limits or matching nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose, when-to-use, critical restriction, and return value summary. Front-loaded with the most important info, no redundancy or fluff. Perfectly sized for quick parsing by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has an output schema, and annotations cover safety. The description covers purpose, usage guidelines, a key anti-pattern, and a related-tool pointer. Pagination and limits are already captured in the schema, so nothing critical is missing. The context is complete for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: each parameter has a meaningful description, including the alias relationship between 'name' and 'query' and clarifying 'NOT a company name.' The tool description reinforces this but doesn't introduce new parameter-level semantics. Baseline 3 is appropriate because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Check whether a named individual is banned from acting as a UK company director.' This clearly distinguishes the tool from siblings like company_search (which searches companies) and disqualified_profile (which retrieves full details for an identified officer). The scope is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this tool when asked to check disqualified, banned, or barred directors.' It also warns against a common mistake: 'Query must be an individual's name — NOT a company name, which always returns zero results.' This exclusion is valuable and no other tool is suggested for this purpose, making the guidance direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetch Full Record from UK Due Diligence RegisterARead-onlyIdempotentInspect
Fetch the full record for an ID returned by search.
Routes by prefix to the appropriate register:
company:{number} → Companies House full profile
charity:{number} → Charity Commission full profile
disqualification:{officer_id} → Disqualified director full record
notice:{notice_id} → Gazette notice full legal text
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Prefixed record ID returned by search. Format: company:{number}, charity:{number}, disqualification:{officer_id}, or notice:{notice_id} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, and non-destructive nature, so the bar is lower. The description adds useful behavioral context by explaining how the tool routes by prefix to the appropriate register, which is beyond the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct: a one-sentence purpose followed by a bulleted list of routing rules. Every sentence is informative, there is no unnecessary text, and the structure is front-loaded and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema and read-only annotations, the description covers all essential context: what it does, when to use it, and how routing works. It doesn't need to explain return values because the output schema exists, and the usage context is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the parameter format 100%, so the baseline is 3. The description adds value by mapping each prefix to its target register, enriching the semantics beyond the schema's format description. This helps the agent construct valid IDs and anticipate the output type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Fetch the full record for an ID returned by search.' It distinguishes from sibling tools by specifying the routing mechanism by prefix, which clarifies that this is a unified fetcher across multiple registers. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context: use this for IDs returned by search. It implicitly differentiates from specific profile tools via the prefix routing, but it does not explicitly state alternatives like 'use company_profile if you already have a company number.' A slight gap in explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gazette_insolvencySearch Gazette Corporate Insolvency NoticesARead-onlyIdempotentInspect
Search The Gazette's insolvency notice index by entity name.
Searches The Gazette's corporate-insolvency notice index using the authoritative Gazette notice-code taxonomy. Results are sorted by an internal DD severity score; the notice label itself remains a source fact.
Each result includes a notice_numeric_id. Read the full legal wording via the notice://{notice_numeric_id} resource.
The Gazette is the official UK public record. A notice here means the event has been formally published and is legally effective.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Company or individual name to search for in Gazette insolvency notices | |
| query | No | Alias for name. | |
| end_date | No | Filter notices up to this date (YYYY-MM-DD) | |
| start_date | No | Filter notices from this date (YYYY-MM-DD) | |
| entity_name | No | Deprecated alias for name. | |
| max_notices | No | Cap on notices returned, applied after severity/date sort. Default 20. The Gazette insolvency feed returns up to 100 results per search — raise to 100 to see the full set. | |
| notice_type | No | Filter by Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order, '2410' appointment of administrators). Omit to search all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notices | No | Matching notices, sorted by severity (desc) then date (desc). |
| end_date | No | Upper bound of the date range filter, if any. |
| start_date | No | Lower bound of the date range filter, if any. |
| entity_name | Yes | Entity name that was searched. |
| total_notices | Yes | Total notices returned after deduplication, sorting, and cap. |
| max_notices_cap | Yes | The max_notices cap applied. Upstream may have more matching notices. |
| notice_type_filter | No | Notice code filter applied, or null if all codes searched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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 TextARead-onlyIdempotentInspect
Fetch the full legal wording of a Gazette notice by numeric notice ID.
Returns the complete JSON-LD linked-data record for the notice: parties, legal basis, court, and full text. Use gazette_insolvency first to find notice_numeric_id values.
| Name | Required | Description | Default |
|---|---|---|---|
| notice_id | Yes | Numeric Gazette notice ID. Returned as notice_numeric_id by gazette_insolvency. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description adds that the response is a complete JSON-LD record including parties, legal basis, court, and full text. It does not mention error handling or potential limits, but the key behavioral traits are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently deliver purpose, return contents, and a usage prerequisite. The structure is front-loaded with the action and avoids any redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description provides a succinct summary of return fields and gives the necessary upstream step. For a single-parameter fetch operation, this is complete and well-integrated with sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes notice_id as the numeric ID returned by gazette_insolvency, and the description echoes this without adding new meaning. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches the full legal wording of a Gazette notice by numeric notice ID, distinguishing it from search-like siblings such as gazette_insolvency. The verb 'Fetch' and specific resource make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs users to use gazette_insolvency first to obtain notice_numeric_id values, providing a clear workflow and implicit alternative. This is direct guidance on when to use this tool versus another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
land_title_searchSearch Price Paid Transactions by PostcodeARead-onlyIdempotentInspect
Search HM Land Registry Price Paid Index by postcode or address.
Returns up to 10 recent sale transactions for the postcode: price, date, address, property type, and tenure (Freehold/Leasehold). Covers England and Wales only. Postcode gives the most reliable results — a full address is also accepted and the postcode is extracted automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| address_or_postcode | Yes | UK property address or postcode. Postcode is most reliable: e.g. 'NG1 1AB'. Full address also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query. |
| postcode | Yes | Normalised UK postcode extracted from the input. |
| transactions | No | Recent Price Paid transactions for the postcode, sorted newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds valuable behavioral context beyond these: it returns a maximum of 10 transactions, lists the exact data fields, restricts to England and Wales, and explains automatic postcode extraction from addresses. This is useful operational detail not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the main action, followed by return details and key constraints. No filler or redundancy. Every sentence contributes meaningful guidance, making this highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with a provided output schema, the description is complete: it states the data source, coverage area, reliability guidance, and expected return fields/count. There's no ambiguity that would require additional narrative. The output schema covers structural details, so the description's brevity is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'address_or_postcode' is already described in the schema with the same guidance (postcode most reliable, full address accepted). The description adds a small extra detail about automatic postcode extraction, but with 100% schema coverage, the schema carries the semantic weight. Per the rubric, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Search HM Land Registry Price Paid Index by postcode or address.' It clearly distinguishes this tool from sibling tools by focusing on property transaction data, and states the return content (price, date, address, property type, tenure). This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear contextual guidance: covers England and Wales only, postcode is most reliable, full address accepted with automatic postcode extraction. It doesn't explicitly name alternatives or exclusion conditions, but the guidance is sufficient for choosing this tool for price paid lookups. Score 4 rather than 5 because there's no explicit 'when not to use' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
officer_appointmentsGet Officer Appointment HistoryARead-onlyIdempotentInspect
Fetch a person's full company appointment history by officer ID.
Returns every appointment — current and historic — with each company's number, name, status, role, and appointment/resignation dates. Use company_officers first to find an officer_id, then this tool to discover other companies that person has been a director or secretary of, including dissolved or insolvent ones not mentioned anywhere else. Always returns full history; there is no current-only filter, since historical discovery is the point.
| Name | Required | Description | Default |
|---|---|---|---|
| officer_id | Yes | Companies House officer ID. Returned as officer_id on entries from company_officers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Officer name as recorded at CH. |
| total | Yes | Total appointments returned. |
| officer_id | Yes | Companies House officer ID. |
| active_count | No | Upstream count of appointments Companies House categorizes as 'active' — this reflects the officer's own appointment/resignation state at that company, NOT whether the company itself is currently trading. An appointment at a company in liquidation or administration still counts as active here if the officer was never formally resigned. Check each appointment's own company_status field for the company's actual status. Null if not provided upstream. |
| appointments | No | Every appointment, current and historic. |
| date_of_birth | No | Partial date of birth (month/year), or empty if not disclosed upstream. |
| inactive_count | No | Upstream count of appointments Companies House categorizes as 'inactive', passed through as-is. Exact categorization semantics have not been independently verified against per-appointment data — treat as an unverified upstream fact, not a derived signal, or null if not provided. |
| resigned_count | No | Upstream count of resigned appointments, or null if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and 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.
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.
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.
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.
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.
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 ListsARead-onlyIdempotentInspect
Screen a name against the UK (OFSI), US (OFAC), EU and UN consolidated sanctions lists.
Returns every list entry whose primary name or alias matches, with the regime, source reference and listing date. Use it to check whether a counterparty — or its officers / persons with significant control — appears on a sanctions list.
MATCHING is deterministic: normalised exact + alias match (case-, accent- and punctuation-insensitive). A company/entity legal name matches reliably; PERSON names with transliteration variants may not (e.g. 'Mohammed' vs 'Muhamad'). An empty result is therefore NOT a guarantee of clearance, and a hit on a common name may be a false positive to disambiguate. This is a screening aid, not a compliance determination.
lists_screened reports which of OFSI/OFAC/EU/UN were actually loaded — if
any is missing the result is partial. as_at is when the lists were last
refreshed on this server.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Person or company/entity name to screen against the consolidated sanctions lists. | |
| entity_type | No | Optional filter: 'person' or 'entity'. Omit to screen both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | No | Matching list entries. An empty list means no exact/alias match on the screened lists — NOT a guarantee of clearance (see the tool description on matching limits). |
| as_at | No | When this server last refreshed the loaded lists (ISO timestamp). Provenance for the screen — the lists update on designation. |
| query | Yes | The name that was screened. |
| match_count | Yes | Number of list entries that matched the query. |
| lists_screened | No | Which consolidated lists were loaded and actually screened for this call. A list absent here failed to load and was NOT screened — treat the result as partial if any of OFSI/OFAC/EU/UN is missing. |
| normalized_query | Yes | The normalised form used for matching (upper-cased, accent- and punctuation-stripped, whitespace-collapsed). |
| entity_type_filter | No | entity_type filter applied to the screen ('person'/'entity'), or null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
searchSearch UK Due Diligence RegistersARead-onlyIdempotentInspect
Search across all UK due diligence registers simultaneously.
Searches Companies House, Charity Commission, disqualified directors, and Gazette insolvency notices in parallel. Returns a list of result IDs — use fetch with each ID to retrieve the full record.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name, charity name, director name, or keyword to search for across all UK due diligence registers |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent), the description discloses that searches run in parallel and that results are IDs, not full records, requiring a follow-up fetch call. This adds meaningful behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, structured in three sentences: what, scope, and how to use results. No redundant words or vague statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter aggregate search tool, the description covers the essential elements: service scope, parallel behavior, and result handling. The output schema and annotations supply additional context, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the query parameter thoroughly, including its type, length constraints, and semantic meaning. The description does not add additional parameter-level detail beyond what the schema provides, so a baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches all UK due diligence registers simultaneously, naming the specific registers (Companies House, Charity Commission, disqualified directors, Gazette insolvency). This distinguishes it from sibling tools that target individual registers, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies this is a cross-register search ('across all UK due diligence registers simultaneously') and that it returns IDs for use with fetch, implying the workflow. It doesn't explicitly state when not to use it or name alternatives, but the sibling tools provide that context.
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)ARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vat_number | Yes | UK (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
| Name | Required | Description |
|---|---|---|
| valid | Yes | True if HMRC confirmed the VAT number is currently registered. False means HMRC returned 404 (not registered / deregistered). |
| vat_number | Yes | Canonical VAT number in 'GB<9 digits>' format. |
| trading_name | No | Trading name registered with HMRC for VAT. Compare with the Companies House name — discrepancies are a due diligence signal. |
| registered_address | No | VAT-registered trading address. May differ from the Companies House registered office address. |
| consultation_number | No | HMRC consultation reference number for this lookup. |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
- Added
company_charges - Added
company_filing_document - Added
company_filing_history - Changed
company_officers3 fields changed- added
Input schema / properties / include_resignedAdded value: +{ + "default": false, + "description": "Include resigned/historic officers. Default false for backwards-compatible current-officer queries.", + "type": "boolean" +} - changed
Input schema / properties / start_index / descriptionPrevious value: -"Ignored — all officers are returned in one call."New value: +"Ignored — pagination is handled internally. Only accepted to avoid call failures." - added
Output schema / properties / officers / items / properties / officer_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Companies House officer ID, extracted from links.officer.appointments. Pass to officer_appointments to discover this person's full appointment history across companies, including dissolved or insolvent ones." +}
- Changed
company_profile4 fields changed- added
Output schema / properties / has_charges / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / has_charges / defaultPrevious value: -falseNew value: +null - changed
Output schema / properties / has_charges / descriptionPrevious value: -"True if the company has outstanding registered charges (secured debt), derived from the /charges endpoint. A due diligence signal."New value: +"True if the company has at least one outstanding or part-satisfied charge (secured debt) — not yet fully discharged. False if every charge on record is fully satisfied, or there are none. Null if the charges check could not be completed, or if a charge was returned with an unrecognized status that can't be confidently classified. Use company_charges for the full charge-by-charge detail." - removed
Output schema / properties / has_charges / typeRemoved value: -"boolean"
- Changed
company_psc1 field changed- added
Output schema / properties / psc / items / properties / date_of_birthAdded value: +{ + "additionalProperties": true, + "description": "Partial date of birth (month/year) for individual PSCs as returned by CH.", + "type": "object" +}
- Changed
gazette_insolvency3 fields changed- changed
Input schema / properties / notice_type / descriptionPrevious value: -"Filter by notice code (e.g. '2441' winding-up petition, '2443' winding-up order, '2448' administration order, '2460' striking-off). Omit to search all."New value: +"Filter by Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order, '2410' appointment of administrators). Omit to search all." - changed
Output schema / properties / notices / items / properties / notice_code / descriptionPrevious value: -"Gazette notice code (e.g. '2443' winding-up order, '2448' administration order)."New value: +"Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order for a company)." - changed
Output schema / properties / notices / items / properties / severity / descriptionPrevious value: -"Internal severity score 0-10. Higher = more serious (10 = Winding-Up Order, 9 = Administration Order / Receiver, 0 = unclassified)."New value: +"Internal severity score 0-10. Higher = more serious (10 = winding-up order, 9 = administration/receiver/liquidator appointment, 0 = informational or unclassified)."
- Removed
get_prompt - Removed
list_prompts - Added
officer_appointments
3 tool updates
- Changed
disqualified_search8 fields changed- added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Alias for query — the person's name." +} - added
Input schema / properties / query / anyOfAdded value: +[ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / defaultAdded value: +null - changed
Input schema / properties / query / descriptionPrevious value: -"Name of the person to search for"New value: +"Person's name to search for, e.g. query='Richard Howson'. NOT a company name." - removed
Input schema / properties / query / maxLengthRemoved value: -200 - removed
Input schema / properties / query / minLengthRemoved value: -2 - removed
Input schema / properties / query / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "query" -]
- Changed
gazette_insolvency9 fields changed- added
Input schema / properties / entity_name / anyOfAdded value: +[ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / entity_name / defaultAdded value: +null - changed
Input schema / properties / entity_name / descriptionPrevious value: -"Company or individual name to search for in Gazette insolvency notices"New value: +"Deprecated alias for name." - removed
Input schema / properties / entity_name / maxLengthRemoved value: -200 - removed
Input schema / properties / entity_name / minLengthRemoved value: -2 - removed
Input schema / properties / entity_name / typeRemoved value: -"string" - added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Company or individual name to search for in Gazette insolvency notices" +} - added
Input schema / properties / queryAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Alias for name." +} - removed
Input schema / requiredRemoved value: -[ - "entity_name" -]
- Changed
vat_validate1 field changed- changed
Input schema / properties / vat_number / descriptionPrevious value: -"UK VAT registration number. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically."New value: +"UK (GB) VAT registration number — this tool validates UK numbers only. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically."
1 tool update
- Added
sanctions_screen
22 tool updates
- Added
charity_profile - Added
charity_search - Added
company_officers - Added
company_profile - Added
company_psc - Added
company_search - Added
disqualified_profile - Added
disqualified_search - Added
fetch - Added
gazette_insolvency - Added
gazette_notice - Removed
get_doc - Removed
get_functions - Removed
get_section - Added
land_title_search - Removed
list_docs - Removed
list_sections - Removed
resolve_topic - Added
search - Removed
search_docs - Removed
validate_function - Added
vat_validate
22 tool updates
- Removed
charity_profile - Removed
charity_search - Removed
company_officers - Removed
company_profile - Removed
company_psc - Removed
company_search - Removed
disqualified_profile - Removed
disqualified_search - Removed
fetch - Removed
gazette_insolvency - Removed
gazette_notice - Added
get_doc - Added
get_functions - Added
get_section - Removed
land_title_search - Added
list_docs - Added
list_sections - Added
resolve_topic - Removed
search - Added
search_docs - Added
validate_function - Removed
vat_validate
2 tool updates
- Added
get_prompt - Added
list_prompts
1 tool update
- Changed
company_officers2 fields changed- added
Input schema / properties / items_per_pageAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Ignored — pagination is handled internally. Only accepted to avoid call failures." +} - added
Input schema / properties / start_indexAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Ignored — all officers are returned in one call." +}
2 tool updates
- Added
fetch - Added
search
4 tool updates
- Changed
charity_profile2 fields changed- changed
Output schema / properties / trustee_names / descriptionPrevious value: -"Trustees on record. The list may be truncated per the `max_trustees` input."New value: +"Trustees on record. Truncated to 30 entries." - changed
Output schema / properties / who_what_where / descriptionPrevious 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."
- Changed
company_psc1 field changed- changed
Output schema / properties / psc / items / properties / natures_of_control / descriptionPrevious 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."
- Changed
disqualified_profile1 field changed- changed
Output schema / properties / disqualifications / items / properties / company_names / descriptionPrevious 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."
- Added
gazette_notice
7 tool updates
- Added
charity_profile - Added
company_officers - Added
company_profile - Added
company_psc - Added
disqualified_profile - Removed
list_resources - Removed
read_resource
1 tool update
- Changed
gazette_insolvency2 fields changed- changed
Input schema / properties / max_notices / descriptionPrevious 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." - changed
Input schema / properties / max_notices / maximumPrevious value: -140New value: +100
1 tool update
- Changed
gazette_insolvency8 fields changed- removed
Input schema / properties / max_content_charsRemoved 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" -} - changed
Output schema / properties / notices / items / properties / content / descriptionPrevious 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}." - removed
Output schema / properties / notices / items / properties / content_original_lengthRemoved value: -{ - "default": 0, - "description": "Original length of the notice content before truncation.", - "type": "integer" -} - removed
Output schema / properties / notices / items / properties / content_truncatedRemoved value: -{ - "default": false, - "description": "True if content was truncated.", - "type": "boolean" -} - changed
Output schema / properties / notices / items / properties / date / descriptionPrevious value: -"Publication/notice date (ISO format where available)."New value: +"Publication date (ISO YYYY-MM-DD)." - removed
Output schema / properties / notices / items / properties / editionRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Gazette edition identifier." -} - changed
Output schema / properties / notices / items / properties / notice_id / descriptionPrevious value: -"Upstream notice ID (typically a URI)."New value: +"Gazette notice URI (e.g. 'https://www.thegazette.co.uk/id/notice/5122793')." - added
Output schema / properties / notices / items / properties / notice_numeric_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Numeric notice ID. Read full notice content via the notice://{notice_numeric_id} resource." +}
2 tool updates
- Changed
gazette_insolvency4 fields changed- added
Input schema / properties / max_noticesAdded 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" +} - added
Output schema / properties / max_notices_capAdded value: +{ + "description": "The max_notices cap applied. Upstream may have more matching notices.", + "type": "integer" +} - changed
Output schema / properties / total_notices / descriptionPrevious value: -"Total notices returned after deduplication and sorting."New value: +"Total notices returned after deduplication, sorting, and cap." - changed
Output schema / requiredPrevious value: -[ - "entity_name", - "total_notices" -]New value: +[ + "entity_name", + "total_notices", + "max_notices_cap" +]
- Changed
land_title_search2 fields changed- changed
Output schema / descriptionPrevious value: -"HMLR land registry search result for a given postcode."New value: +"HMLR Price Paid Index search result for a given postcode." - removed
Output schema / properties / title_dataRemoved 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" -}
7 tool updates
- Removed
charity_profile - Removed
company_officers - Removed
company_profile - Removed
company_psc - Removed
disqualified_profile - Added
list_resources - Added
read_resource
11 tool updates
- Changed
charity_profile27 fields changed- added
Input schema / properties / max_classificationsAdded 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" +} - added
Input schema / properties / max_trusteesAdded 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" +} - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Full Charity Commission profile for a single charity." - added
Output schema / properties / addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Registered address of the charity (joined address lines)." +} - added
Output schema / properties / charity_co_reg_numberAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Companies House number for charities also registered as companies (Charitable Incorporated Organisations, etc.)." +} - added
Output schema / properties / charity_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Registered charity name." +} - added
Output schema / properties / charity_numberAdded value: +{ + "description": "Charity registration number.", + "type": "string" +} - added
Output schema / properties / charity_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Charity type." +} - added
Output schema / properties / countries_of_operationAdded value: +{ + "description": "Countries the charity operates in (capped at 10 upstream).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / date_of_registrationAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Date of first registration." +} - added
Output schema / properties / in_administrationAdded value: +{ + "default": false, + "description": "True if the charity is in administration.", + "type": "boolean" +} - added
Output schema / properties / insolventAdded value: +{ + "default": false, + "description": "True if the charity is flagged as insolvent.", + "type": "boolean" +} - added
Output schema / properties / latest_expenditureAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Latest filed annual expenditure in GBP." +} - added
Output schema / properties / latest_incomeAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Latest filed annual income in GBP." +} - added
Output schema / properties / rawAdded value: +{ + "additionalProperties": true, + "description": "Full raw Charity Commission profile payload for any field not surfaced explicitly on this model.", + "type": "object" +} - added
Output schema / properties / reg_statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Registration status code ('R', 'RM')." +} - added
Output schema / properties / reg_status_labelAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Human-readable registration status." +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / trustee_namesAdded 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" +} - added
Output schema / properties / trustee_names_totalAdded value: +{ + "default": 0, + "description": "Total trustees upstream before truncation.", + "type": "integer" +} - added
Output schema / properties / trustee_names_truncatedAdded value: +{ + "default": false, + "description": "True if the trustee list was truncated.", + "type": "boolean" +} - added
Output schema / properties / who_what_whereAdded 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" +} - added
Output schema / properties / who_what_where_totalAdded value: +{ + "default": 0, + "description": "Total classification entries upstream before truncation.", + "type": "integer" +} - added
Output schema / properties / who_what_where_truncatedAdded value: +{ + "default": false, + "description": "True if the classification list was truncated.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "charity_number" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
charity_search17 fields changed- added
Input schema / properties / limitAdded 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" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of items to skip before this page. Default 0.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +} - removed
Input schema / properties / page_numRemoved value: -{ - "default": 1, - "description": "Page number (1-indexed)", - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / page_sizeRemoved value: -{ - "default": 20, - "description": "Number of results per page (max 100)", - "maximum": 100, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / registration_statusRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": "Registered", - "description": "Filter by registration status: 'Registered' or 'Removed'. Default: Registered." -} - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Paginated result of a Charity Commission name search." - added
Output schema / properties / charitiesAdded 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" +} - added
Output schema / properties / has_moreAdded value: +{ + "description": "True if more items may exist beyond this page. Re-call with offset=offset+returned to continue.", + "type": "boolean" +} - added
Output schema / properties / limitAdded value: +{ + "description": "Max items requested for this page.", + "type": "integer" +} - added
Output schema / properties / offsetAdded value: +{ + "description": "Number of items skipped before this page (client-side).", + "type": "integer" +} - added
Output schema / properties / queryAdded value: +{ + "description": "Search term applied.", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / returnedAdded value: +{ + "description": "Items actually returned on this page.", + "type": "integer" +} - added
Output schema / properties / totalAdded value: +{ + "description": "Total matches returned by upstream.", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "query", + "total", + "offset", + "limit", + "returned", + "has_more" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
company_officers11 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Max officers to fetch from Companies House (upstream items_per_page). Default 100.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"List of officers for a given company." - added
Output schema / properties / company_numberAdded value: +{ + "description": "Companies House company number.", + "type": "string" +} - added
Output schema / properties / high_appointment_count_flagAdded value: +{ + "default": 0, + "description": "Number of active officers with 10+ total appointments. Non-zero values are a nominee/phoenix director risk signal.", + "type": "integer" +} - added
Output schema / properties / include_resignedAdded value: +{ + "description": "Whether resigned officers were included in this result.", + "type": "boolean" +} - added
Output schema / properties / officersAdded 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" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / totalAdded value: +{ + "description": "Total officers returned (filtered by include_resigned).", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "company_number", + "include_resigned", + "total" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
company_profile16 fields changed- removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Full Companies House profile for a single company number." - added
Output schema / properties / accountsAdded 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" +} - added
Output schema / properties / company_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Registered company name." +} - added
Output schema / properties / company_numberAdded value: +{ + "description": "Companies House company number.", + "type": "string" +} - added
Output schema / properties / company_statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Current status (active, dissolved, in liquidation, etc.)." +} - added
Output schema / properties / company_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Companies House company type code." +} - added
Output schema / properties / confirmation_statementAdded 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" +} - added
Output schema / properties / date_of_creationAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Incorporation date (ISO YYYY-MM-DD)." +} - added
Output schema / properties / has_chargesAdded value: +{ + "default": false, + "description": "True if the company has active registered charges (secured debt). A due diligence signal.", + "type": "boolean" +} - added
Output schema / properties / rawAdded value: +{ + "additionalProperties": true, + "description": "Full raw Companies House profile payload. Use for any field not surfaced explicitly on this model.", + "type": "object" +} - added
Output schema / properties / registered_office_addressAdded value: +{ + "additionalProperties": true, + "description": "Registered office address as returned by Companies House.", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / sic_codesAdded value: +{ + "description": "Standard Industrial Classification codes.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "company_number" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
company_psc10 fields changed- added
Input schema / properties / max_nature_charsAdded 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" +} - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"List of Persons with Significant Control for a company." - added
Output schema / properties / company_numberAdded value: +{ + "description": "Companies House company number.", + "type": "string" +} - added
Output schema / properties / overseas_corporate_psc_flagAdded value: +{ + "default": 0, + "description": "Number of corporate PSCs registered outside the UK. Non-zero values indicate an offshore beneficial ownership chain.", + "type": "integer" +} - added
Output schema / properties / pscAdded 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" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / totalAdded value: +{ + "description": "Total PSC entries returned for this company.", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "company_number", + "total" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
company_search15 fields changed- changed
Input schema / properties / items_per_page / descriptionPrevious value: -"Number of results to return (max 100)"New value: +"Number of results to return (max 100). Default 20." - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Input schema / properties / start_index / descriptionPrevious value: -"Pagination offset"New value: +"Pagination offset. Default 0." - added
Input schema / properties / start_index / maximumAdded value: +10000 - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Paginated result of a Companies House company search." - added
Output schema / properties / has_moreAdded 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" +} - added
Output schema / properties / itemsAdded 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" +} - added
Output schema / properties / items_per_pageAdded value: +{ + "description": "Page size requested from the API for this call.", + "type": "integer" +} - added
Output schema / properties / queryAdded value: +{ + "description": "The query string that was searched.", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / returnedAdded value: +{ + "description": "Number of items actually returned on this page.", + "type": "integer" +} - added
Output schema / properties / start_indexAdded value: +{ + "description": "Number of results skipped before this page (upstream start_index).", + "type": "integer" +} - added
Output schema / properties / total_resultsAdded value: +{ + "description": "Total matching companies in Companies House (server-side).", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "query", + "total_results", + "start_index", + "items_per_page", + "returned", + "has_more" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
disqualified_profile14 fields changed- added
Input schema / properties / max_companiesAdded 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" +} - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Full disqualification record for a disqualified officer." - added
Output schema / properties / date_of_birthAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Date of birth on record." +} - added
Output schema / properties / disqualificationsAdded 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" +} - added
Output schema / properties / forenameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Given name, if split upstream." +} - added
Output schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Officer name." +} - added
Output schema / properties / nationalityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Declared nationality." +} - added
Output schema / properties / officer_idAdded value: +{ + "description": "Companies House officer ID looked up.", + "type": "string" +} - added
Output schema / properties / officer_kindAdded value: +{ + "description": "Which CH endpoint returned the record: 'natural' (individual) or 'corporate' (legal entity).", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / surnameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Family name, if split upstream." +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "officer_id", + "officer_kind" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
disqualified_search15 fields changed- changed
Input schema / properties / items_per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page (max 100). Default 20." - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Input schema / properties / start_index / descriptionPrevious value: -"Pagination offset (0-based)"New value: +"Pagination offset (0-based). Default 0." - added
Input schema / properties / start_index / maximumAdded value: +10000 - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Paginated disqualified officers search result." - added
Output schema / properties / has_moreAdded 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" +} - added
Output schema / properties / itemsAdded 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" +} - added
Output schema / properties / items_per_pageAdded value: +{ + "description": "Page size requested.", + "type": "integer" +} - added
Output schema / properties / queryAdded value: +{ + "description": "Search query applied.", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / returnedAdded value: +{ + "description": "Items actually returned on this page.", + "type": "integer" +} - added
Output schema / properties / start_indexAdded value: +{ + "description": "Pagination offset for this page.", + "type": "integer" +} - added
Output schema / properties / total_resultsAdded value: +{ + "description": "Total matching records upstream at Companies House.", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "query", + "total_results", + "start_index", + "items_per_page", + "returned", + "has_more" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
gazette_insolvency12 fields changed- added
Input schema / properties / max_content_charsAdded 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" +} - removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"Aggregated Gazette insolvency notice search result." - added
Output schema / properties / end_dateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Upper bound of the date range filter, if any." +} - added
Output schema / properties / entity_nameAdded value: +{ + "description": "Entity name that was searched.", + "type": "string" +} - added
Output schema / properties / notice_type_filterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Notice code filter applied, or null if all codes searched." +} - added
Output schema / properties / noticesAdded 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" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / start_dateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Lower bound of the date range filter, if any." +} - added
Output schema / properties / total_noticesAdded value: +{ + "description": "Total notices returned after deduplication and sorting.", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "entity_name", + "total_notices" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
land_title_search9 fields changed- removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"HMLR land registry search result for a given postcode." - added
Output schema / properties / postcodeAdded value: +{ + "description": "Normalised UK postcode extracted from the input.", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / title_dataAdded 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" +} - added
Output schema / properties / totalAdded value: +{ + "description": "Number of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query.", + "type": "integer" +} - added
Output schema / properties / transactionsAdded 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" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "postcode", + "total" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
vat_validate10 fields changed- removed
Input schema / properties / response_formatRemoved value: -{ - "default": "markdown", - "description": "Output format: 'markdown' or 'json'", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Generic wrapper for non-object return types."New value: +"HMRC VAT validation result." - added
Output schema / properties / consultation_numberAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "HMRC consultation reference number for this lookup." +} - added
Output schema / properties / registered_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "VAT-registered trading address. May differ from the Companies House registered office address." +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / trading_nameAdded 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." +} - added
Output schema / properties / validAdded value: +{ + "description": "True if HMRC confirmed the VAT number is currently registered. False means HMRC returned 404 (not registered / deregistered).", + "type": "boolean" +} - added
Output schema / properties / vat_numberAdded value: +{ + "description": "Canonical VAT number in 'GB<9 digits>' format.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "valid", + "vat_number" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
11 tool updates
- First observed
charity_profile - First observed
charity_search - First observed
company_officers - First observed
company_profile - First observed
company_psc - First observed
company_search - First observed
disqualified_profile - First observed
disqualified_search - First observed
gazette_insolvency - First observed
land_title_search - First observed
vat_validate
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Company intelligence via UK Companies House and risk screening across 386 risk data sources.
13 diligence tools: SEC, LEI, VAT, state+UK registries, courts, federal awards/contracts, FEC.
Czech & EU due diligence in one call — facts, insolvency, sanctions, VAT, risk score, UBO chain.
UK company data: profiles, iXBRL financials, directors, PSC chains, ECCTA. Hosted, no key.
Related MCP Servers
- FlicenseBqualityCmaintenanceProvides access to UK Companies House public data, enabling search and retrieval of company profiles, officers, filing history, and more through natural language queries.12-
- AlicenseAqualityDmaintenanceUnmodified 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.1017Apache 2.0
- AlicenseNot gradedqualityAmaintenanceProvides 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.249MIT
- AlicenseNot gradedqualityBmaintenanceCompany data for Spain, France, the UK, Ireland and Poland — registry, KYB and sanctions.60MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
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.
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.
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.
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.