Skip to main content
Glama

uk-due-diligence-mcp

Official-source UK due-diligence data for AI agents.

Search Companies House, Charity Commission, The Gazette, HMLR price-paid data and HMRC VAT records, plus screen names against the OFSI, OFAC, EU and UN sanctions lists. Exposes atomic MCP tools for company ownership, officers, cross-company appointment history, secured charges, insolvency notices and related registry evidence — the consuming agent decides how to investigate, not the server.

Every data source is a legally-mandated register with a free official API. Zero paywalls.

PyPI SafeSkill Glama Install in VS Code Install in VS Code Insiders Install in Cursor


Data sources

Register

API

Auth

Coverage

Companies House

api.company-information.service.gov.uk

API key (free)

UK-wide

Charity Commission

api.charitycommission.gov.uk

API key (free)

England & Wales

HMLR Land Registry

landregistry.data.gov.uk (SPARQL)

None

England & Wales

The Gazette

thegazette.co.uk (Linked Data)

None (read)

UK-wide

HMRC VAT

api.service.hmrc.gov.uk

OAuth2 client credentials

UK-wide

OFSI / OFAC / EU / UN sanctions

consolidated list files

None

International


Related MCP server: yaml-ai-mcp

Quick start

Hosted (no install)

{
  "mcpServers": {
    "uk-due-diligence": {
      "type": "http",
      "url": "https://uk-due-diligence-mcp.fly.dev/mcp"
    }
  }
}

Local (uvx)

{
  "mcpServers": {
    "uk-due-diligence": {
      "type": "stdio",
      "command": "uvx",
      "args": ["uk-due-diligence-mcp"]
    }
  }
}

See Configuration for the environment variables it needs.


Tools

Companies House

Tool

Description

company_search

Search by name/keyword, filter by status/type

company_profile

Status, filing compliance, registered address, has_charges summary

company_officers

Directors/secretaries; each carries an officer_id

company_psc

Beneficial owners, PSC chain, overseas-corporate-PSC flag

officer_appointments

Full appointment history for a person by officer_id — including dissolved or insolvent companies not named anywhere else

company_charges

Complete secured-charge history: status, dates, secured parties, what each charge covers

disqualified_search

Search disqualified directors by name

disqualified_profile

Full disqualification record: period, Act, associated companies

Charity Commission

Tool

Description

charity_search

Search by name, filter by registration status

charity_profile

Full record: trustees, income/expenditure, governing document

HMLR Land Registry

Tool

Description

land_title_search

Price Paid Index sale transactions by postcode — not title ownership (see Limitations)

The Gazette

Tool

Description

gazette_insolvency

Corporate insolvency notices across the Gazette's notice-code taxonomy (codes 2401-2465)

gazette_notice

Full legal wording of a specific notice

HMRC / Sanctions

Tool

Description

vat_validate

Trading name + address as registered for VAT

sanctions_screen

Screen a name against the OFSI/OFAC/EU/UN consolidated lists

Cross-register

Tool

Description

search

Fan-out search across all registers — returns IDs (for ChatGPT deep research)

fetch

Fetch a structured record by ID returned from search


Examples

Resolve "TAS Engineering" to a company number and check whether it has any outstanding charges.

company_search to find the company number, then company_charges for the full secured-debt picture (not just the has_charges summary).

Has Gareth Davies (director of company 06333469) been connected to any other companies, including ones that no longer exist?

company_officers to get his officer_id, then officer_appointments to surface every company he's held an appointment at, current or historic.

Is "MEL Precision Limited" in the middle of insolvency proceedings, and what does that actually mean legally?

gazette_insolvency to find the notices, then gazette_notice to read the full legal wording before drawing conclusions from the notice label alone.

Screen "Acme Trading Ltd" and its officers against sanctions lists.

company_officers for the officer names, then sanctions_screen against the company name and each officer.


Limitations

Things worth knowing before trusting output:

  • land_title_search returns Price Paid transactions, not ownership. It does not return current proprietor/title data — HMLR's Price Paid Index only records historic sale transactions.

  • Sanctions screening is exact/alias matching, not compliance clearance. A company/entity legal name matches reliably; person names with transliteration variants may not. An empty result is not a guarantee of clearance, and a hit on a common name may need disambiguation.

  • has_charges: null means the check could not be confidently completed — a charges-endpoint outage, or a charge with an unrecognized status. Treat it as unresolved, not as "no charges."

  • officer_appointments returns historical relationships. Companies House doesn't auto-resign a director when a company enters insolvency — check company_status on each appointment, not just resigned_on.

  • Official-source data can be incomplete or delayed. These are the same registers a human would check, with the same latency and gaps.


Configuration

Variable

Required for

Where to get it

CH_API_KEY

All Companies House tools

developer.company-information.service.gov.uk — free

CHARITY_API_KEY

Charity Commission tools

api-portal.charitycommission.gov.uk — free

HMRC_CLIENT_ID / HMRC_CLIENT_SECRET

vat_validate

HMRC Developer Hub (developer.service.hmrc.gov.uk) — free, OAuth2 client-credentials app

HMRC_ENV

vat_validate (optional)

sandbox or production — defaults to production

HMLR, The Gazette, and the sanctions lists require no credentials.


Project structure

uk-due-diligence-mcp/
├── server.py           # FastMCP init, tool/resource registration, transport config
├── companies_house.py  # company_search/profile/officers/psc, officer_appointments, company_charges
├── disqualified.py     # disqualified_search, disqualified_profile
├── charity.py          # charity_search, charity_profile
├── land_registry.py    # land_title_search (SPARQL Price Paid Index)
├── gazette.py          # gazette_insolvency, gazette_notice
├── hmrc_vat.py         # vat_validate (OAuth2 client-credentials)
├── sanctions.py        # sanctions_screen (OFSI/OFAC/EU/UN consolidated lists)
├── search_fetch.py     # search, fetch (cross-register fan-out)
├── models.py           # Pydantic v2 output models
├── http_client.py      # Shared httpx clients, retry backoff, error formatting
├── fly.toml
├── Dockerfile
├── pyproject.toml
└── .env.example

Licence

MIT

Available Tools

19 tools
charity_profileGet Charity ProfileA
Read-onlyIdempotent
Inspect

Fetch the full Charity Commission profile for a charity number.

Returns trustees, latest income/expenditure, insolvency flags, governing document type, classifications, and countries of operation. Use charity_search first to find the charity number.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds behavioral context by listing specific returned data (trustees, income, insolvency flags, etc.), which is beyond annotations.

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

Conciseness5/5

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

Two concise sentences: first states purpose, second lists key returned data and usage hint. No extraneous words.

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

Completeness5/5

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

With an output schema present and a single required parameter, the description sufficiently covers usage and key data. No gaps given the tool's simplicity.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter 'charity_number' is well-described in the schema. The description mentions 'charity number' but adds no new semantics beyond the schema.

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

Purpose5/5

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

The description clearly states 'Fetch the full Charity Commission profile' and specifies the input as 'charity number'. It lists returned data (trustees, income, etc.) and distinguishes from the sibling 'charity_search' which finds the number.

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

Usage Guidelines5/5

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

Explicitly advises 'Use charity_search first to find the charity number.' This provides clear when-to-use guidance and differentiates from the sibling tool.

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

company_chargesGet Company ChargesA
Read-onlyIdempotent
Inspect

Fetch the complete Companies House charge history for a company.

Returns every registered charge (secured debt) — current and historic — with status, dates, secured parties, and what each charge covers (fixed/floating/negative-pledge flags and any free-text particulars). Satisfaction is represented as satisfied_on plus a charge-satisfaction filing entry, not a separate 'release' record. company_profile.has_charges is a True/False/unknown summary derived from this same data; use this tool when the specific charges matter, not just whether any exist.

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

Output Schema

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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail about what a charge record includes and the specific representation of satisfaction (satisfied_on plus a filing, not a separate release). It also notes the source of company_profile.has_charges, which helps the agent understand the data relationship.

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

Conciseness4/5

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

The description is well-structured and front-loaded with the core purpose. The second sentence adds useful detail about response contents, and the final sentence provides selection guidance. A small redundancy exists between 'complete charge history' and 'Returns every registered charge', but overall the text is efficient and every sentence contributes meaningful context.

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

Completeness5/5

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

For a single-parameter fetch tool, the description fully explains what the tool returns, how to distinguish it from the summary field, and how an important edge case (satisfaction) is represented. The output schema exists to describe the response structure, so the description does not need to enumerate all fields. The combination of description, schema, and annotations provides everything an agent needs to invoke this correctly.

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

Parameters3/5

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

There is only one parameter and the schema description coverage is 100%, fully documenting company_number with format and an example. The description does not add new parameter semantics beyond the schema, which is acceptable given the high coverage. The baseline of 3 applies because the schema carries the burden successfully.

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

Purpose5/5

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

The description clearly states it fetches the complete Companies House charge history for a company. It explicitly contrasts with company_profile.has_charges, noting this tool should be used when specific charges matter. This differentiates it from sibling tools without needing to inspect other schemas.

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

Usage Guidelines5/5

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

The description gives explicit guidance on when to use this tool versus company_profile.has_charges: use this when the actual charge details matter, not just whether any charges exist. It also clarifies how satisfaction is represented, preventing misinterpretation. This is strong usage context that helps an agent select correctly.

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

company_filing_documentGet Companies House Filing DocumentA
Read-onlyIdempotent
Inspect

Resolve a filing's document_metadata link to its authoritative source document.

Returns a resource_link (never embedded bytes, never base64) pointing at a company-document:// MCP resource — fetch it via resources/read to get the actual PDF. This tool only reads metadata (category, pages, available content types, byte size); it never downloads the document itself. Use company_filing_history first to find a filing's document_metadata URL.

Requires a resource-capable MCP client to retrieve the actual bytes — a tool-only client can see this result's metadata (company, category, page count, size) but cannot obtain the file through this tool call alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
mime_typeNoWhich content representation to select, e.g. 'application/pdf'. Omit when the document has only one representation (the near-universal case) — it is auto-selected. Required if the document has more than one; omitting it in that case returns a validation error listing the choices.
document_metadata_urlYesThe document_metadata URL from a filing's links.document_metadata (returned by company_filing_history) — pass it through verbatim, not a document_id. Must be an exact https://document-api.company-information.service.gov.uk/document/{id} URL.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that no bytes are ever embedded or base64-encoded, that only metadata is read, that the tool never downloads the document, and that a resource-capable client is required for actual content. This gives the agent accurate expectations about side effects and outputs.

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

Conciseness4/5

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

The description is well-structured and front-loaded, but slightly verbose with some repetition around the client requirement and the fact that no bytes are downloaded. Each sentence earns its place, yet it could be tightened without losing meaning.

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

Completeness5/5

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

Given two parameters, no output schema, and a read-only idempotent operation, the description covers what is returned, how to access the actual PDF, what metadata is available, prerequisites, and client limitations. An agent has enough context to invoke the tool correctly and interpret results.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters well. The description reinforces key constraints like passing the URL verbatim and the mime_type auto-selection behavior, but adds little beyond the schema's own parameter descriptions.

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

Purpose5/5

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

The description uses a specific verb ('Resolve') and identifies the exact resource (a filing's document_metadata link), then clarifies the output is a resource_link, not bytes. This clearly distinguishes it from sibling tools like fetch or company_filing_history, which the description explicitly references as the prerequisite step.

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

Usage Guidelines5/5

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

The description gives explicit usage direction: first use company_filing_history to obtain the document_metadata_url, then call this tool, and retrieve the actual PDF via resources/read. It also states the limitation for tool-only clients, so an agent knows when this tool alone is insufficient.

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

company_filing_historyGet Company Filing HistoryA
Read-onlyIdempotent
Inspect

Fetch one page of a company's Companies House filing chronology.

Returns the raw source facts for each filing — transaction ID, form type/category, dates, and the description_values CH uses to render its own text — as delivered upstream, not interpreted into DD conclusions. links.document_metadata on each filing is the identifier a future document-retrieval tool would need; no document content is fetched here.

Unlike company_officers/company_psc/company_charges, this does NOT auto-fetch every page — a long-lived company's filing history is unbounded in practice (a decades-old PLC can carry thousands of filings). total_count/returned/has_more are always reported truthfully for whatever page and category filter was requested; nothing is silently truncated. Narrow with category= for a specific slice (e.g. category='mortgage' for charge-related filings, category='insolvency' for administration/liquidation filings) — a note is included when an unfiltered history is large.

A company_number that doesn't resolve to any company returns a structured not_found error, distinct from a genuine zero-filing result — Companies House's filing-history endpoint alone cannot tell these apart, so existence is confirmed separately when the result would otherwise be empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by CH filing category — comma-separated for multiple, e.g. 'mortgage' or 'mortgage,officers'. Omit for all categories. Common values: accounts, confirmation-statement, officers, address, capital, mortgage, persons-with-significant-control, incorporation, insolvency, resolution, annual-return, change-of-name, change-of-constitution, gazette, miscellaneous.
start_indexNoPagination offset. Default 0. Re-call with start_index=start_index+returned while has_more is true.
company_numberYesCompanies House company number (8 digits, e.g. '03782379'). Returned by company_search.
items_per_pageNoResults per page (Companies House caps at 100 regardless of a higher value). Default 100.

Output Schema

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

TDQS

A4.5/5.0
Behavior5/5

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

The description richly discloses behaviors beyond the annotations: it fetches exactly one page, never silently truncates, reports total_count/returned/has_more truthfully, returns raw source data rather than interpreted conclusions, and distinguishes a structured not_found error from an empty result. These details are not covered by the readOnly/openWorld/idempotent hints, so the description carries crucial execution context.

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

Conciseness5/5

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

The description is longer than average, but every sentence earns its place: purpose, pagination contract, category narrowing, raw-data caveat, and not_found handling. The key limitation ('does NOT auto-fetch every page') is front-loaded, and the not_found discussion is substantive rather than filler.

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

Completeness5/5

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

The description covers all critical operational dimensions: pagination contract, category filtering, raw vs interpreted data, document identifier purpose, and error handling for unknown company numbers. With an output schema present, return values don't need to be spelled out, and no essential behavior an agent would need to call this tool correctly is missing.

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

Parameters3/5

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

All four parameters are already fully documented in the schema with descriptions, defaults, and enumeration examples (100% coverage), so the baseline of 3 applies. The description adds contextual value by mentioning category='mortgage'/'insolvency' and the pagination idiom, but it doesn't reveal new parameter semantics beyond what the schema already states.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Fetch one page of a company's Companies House filing chronology.' It immediately distinguishes this tool from siblings by emphasizing raw source facts, one-page pagination, and the absence of document-content fetching, so an agent can easily tell it apart.

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

Usage Guidelines4/5

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

The description explicitly contrasts with company_officers/company_psc/company_charges on auto-fetching and states that no document content is fetched, signaling when this tool is not appropriate. It also advises pagination via start_index while has_more is true and narrowing with category= for specific slices. It doesn't name company_filing_document as the document-retrieval alternative, but the mention of a future document-retrieval tool makes the boundary fairly clear.

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

company_officersGet Company OfficersA
Read-onlyIdempotent
Inspect

Fetch officers for a Companies House company number.

Returns directors, secretaries, and other officers with appointment dates, nationality, and country of residence. Resigned officers are excluded by default; set include_resigned=true for historical DD. Pagination is handled internally.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesTotal officers returned (filtered by include_resigned).
officersNoOfficer records.
company_numberYesCompanies House company number.
include_resignedYesWhether resigned officers were included in this result.
high_appointment_count_flagNoNumber of active officers with 10+ total appointments, or null if appointment counts were not fetched. Non-zero values are a nominee/phoenix director risk signal.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds genuine behavioral context beyond the annotations: the default exclusion of resigned officers, the flag to include them for historical due diligence, and the fact that pagination is handled internally. These are meaningful traits not inferable from the schema or annotations alone.

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

Conciseness5/5

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

The description is three concise sentences with no filler: it leads with the core purpose, lists returned data, and then covers the important defaults and pagination behavior. Every sentence earns its place.

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

Completeness5/5

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

For a read-only list tool with an output schema, full parameter documentation, and safety annotations, the description covers all necessary operational details: scope, returned fields, default behavior, the optional flag, and pagination. Nothing that an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining that pagination is handled internally, which clarifies why start_index and items_per_page are ignored, and by stating the default behavior of include_resigned. This goes beyond the parameter descriptions.

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

Purpose4/5

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

The description states a specific verb and resource ('Fetch officers for a Companies House company number') and enumerates the officer types and returned fields. It clearly distinguishes the tool's function, though it does not explicitly contrast it with sibling tools like officer_appointments or company_profile.

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

Usage Guidelines4/5

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

The description gives clear invocation context: what data is returned, that resigned officers are excluded by default, and when to set include_resigned=true for historical data. It does not explicitly name alternative tools or when not to use this one, but the scope is specific enough for an agent to select it appropriately.

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

company_profileGet Company ProfileA
Read-onlyIdempotent
Inspect

Fetch the full Companies House profile for a company number.

Returns status, registered address, SIC codes, filing compliance (overdue accounts and confirmation statement flags), and whether the company has outstanding charges. Use company_search first to find the company number.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountsNoAccounts filing status and due dates.
sic_codesNoStandard Industrial Classification codes.
has_chargesNoTrue if the company has at least one outstanding or part-satisfied charge (secured debt) — not yet fully discharged. False if every charge on record is fully satisfied, or there are none. Null if the charges check could not be completed, or if a charge was returned with an unrecognized status that can't be confidently classified. Use company_charges for the full charge-by-charge detail.
company_nameNoRegistered company name.
company_typeNoCompanies House company type code.
company_numberYesCompanies House company number.
company_statusNoCurrent status (active, dissolved, in liquidation, etc.).
date_of_creationNoIncorporation date (ISO YYYY-MM-DD).
confirmation_statementNoConfirmation statement filing status and next due date.
registered_office_addressNoRegistered office address as returned by Companies House.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover readOnly, openWorld, idempotent, and non-destructive behavior. The description adds useful behavioral context by specifying what the profile includes, such as overdue accounts, confirmation statement flags, and outstanding charges. No contradiction exists between the description and annotations.

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

Conciseness5/5

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

Three compact sentences: purpose, return contents, and prerequisite workflow. Every sentence adds value, and the most important information is front-loaded. No filler or redundant restatement of the tool name.

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

Completeness5/5

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

The single parameter is fully documented in the schema, output schema exists so return values are defined elsewhere, annotations cover the safety profile, and the description provides scope and a prerequisite. Nothing critical is missing for an agent to invoke the tool correctly.

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

Parameters3/5

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

The input schema already documents company_number with length constraints, format example, and a pointer to company_search. The description reinforces that the tool is called with a company number but adds little beyond what the schema provides. With 100% schema coverage, the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: 'Fetch the full Companies House profile for a company number.' It also lists the returned data (status, registered address, SIC codes, filing compliance, outstanding charges), which clearly distinguishes it from sibling tools like company_search, company_officers, and company_psc.

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

Usage Guidelines4/5

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

The description gives explicit workflow guidance: 'Use company_search first to find the company number.' This is clear and actionable, though it doesn't explicitly state when not to use this tool in favor of other siblings like company_officers or company_charges.

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

company_pscGet Persons with Significant ControlA
Read-onlyIdempotent
Inspect

Fetch Persons with Significant Control (beneficial ownership) for a company.

Returns PSC entries with natures of control, nationality, and country of residence. Flags overseas corporate PSC entries as a beneficial ownership risk signal. Returns an explanatory note for widely-held PLCs with no registrable PSC.

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

Output Schema

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail by explaining that overseas corporate PSC entries are flagged as a risk signal and that widely-held PLCs with no registrable PSC receive an explanatory note.

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

Conciseness5/5

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

The description is three sentences with no filler. It front-loads the core purpose and then efficiently covers key output details and a special-case behavior, earning its length.

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

Completeness5/5

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

For a simple read-only lookup with one documented parameter and an output schema, the description covers purpose, key result fields, risk flagging behavior, and an important edge case. Nothing essential is missing for an agent to invoke it correctly.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is already well described with format guidance and an example in the schema. The description does not add additional parameter-level detail, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Fetch') with a clear resource ('Persons with Significant Control') and adds 'beneficial ownership' for disambiguation. It clearly distinguishes itself from sibling tools like company_officers and company_profile by focusing on PSC data specifically.

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

Usage Guidelines4/5

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

The description makes it clear this tool is for retrieving PSC/beneficial ownership information for a company, which gives strong contextual guidance. It does not explicitly name alternatives or exclusions, but the purpose is distinct enough that an agent can infer when to use it.

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

disqualified_profileGet Disqualified Director ProfileA
Read-onlyIdempotent
Inspect

Fetch the full disqualification record for a director by officer ID.

Returns all disqualification orders: reason, Act/section cited, disqualification period, and associated company names. Use disqualified_search first to find the officer ID.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds specific return fields (reason, Act/section, period, company names), which is useful beyond annotations. No contradictions.

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

Conciseness5/5

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

Two sentences, no filler. Efficiently conveys purpose, prerequisite, and return content.

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

Completeness5/5

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

With an output schema present, the description covers the essential prerequisite and return structure. Fully adequate for a simple fetch tool.

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

Parameters3/5

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

Schema coverage is 100% with description for officer_id. Description restates the origin of the officer ID but does not add new parameter semantics beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

Clearly states verb 'Fetch' and resource 'full disqualification record for a director'. Distinguishes from sibling disqualified_search by specifying the prerequisite to first search for the officer ID.

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

Usage Guidelines5/5

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

Explicitly instructs to use disqualified_search first to obtain the officer ID, and states what the tool returns. Provides clear context for when and how to use the tool.

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

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

Fetch the full record for an ID returned by search.

Routes by prefix to the appropriate register:

  • company:{number} → Companies House full profile

  • charity:{number} → Charity Commission full profile

  • disqualification:{officer_id} → Disqualified director full record

  • notice:{notice_id} → Gazette notice full legal text

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Beyond annotations (readOnly, etc.), the description adds valuable context: routing behavior by prefix and what each route returns (full profile, record, legal text). This enhances understanding of the tool's behavior.

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

Conciseness5/5

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

The description is concise: a single header sentence followed by a clear bullet list. No redundant information, effectively front-loading the key action.

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

Completeness4/5

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

Given a single parameter, output schema, and annotations, the description thoroughly covers the tool's purpose and routing. It could optionally clarify differences from specific profile siblings, but overall it's complete.

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

Parameters4/5

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

The schema already documents the parameter format. The description adds the routing mapping from prefix to register, which is not in the schema, providing additional semantic value beyond the 100% coverage.

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

Purpose4/5

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

The description clearly states it fetches full records for IDs from search and details routing by prefix. It distinguishes from siblings by being a generic fetch tool, though it does not explicitly differentiate from specific profile tools like company_profile.

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

Usage Guidelines3/5

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

The description implies use after search to get full records, but does not explicitly state when not to use this tool or provide alternatives. No exclusion or comparison with sibling tools is given.

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

gazette_insolvencySearch Gazette Corporate Insolvency NoticesA
Read-onlyIdempotent
Inspect

Search The Gazette's insolvency notice index by entity name.

Searches The Gazette's corporate-insolvency notice index using the authoritative Gazette notice-code taxonomy. Results are sorted by an internal DD severity score; the notice label itself remains a source fact.

Each result includes a notice_numeric_id. Read the full legal wording via the notice://{notice_numeric_id} resource.

The Gazette is the official UK public record. A notice here means the event has been formally published and is legally effective.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCompany or individual name to search for in Gazette insolvency notices
queryNoAlias for name.
end_dateNoFilter notices up to this date (YYYY-MM-DD)
start_dateNoFilter notices from this date (YYYY-MM-DD)
entity_nameNoDeprecated alias for name.
max_noticesNoCap on notices returned, applied after severity/date sort. Default 20. The Gazette insolvency feed returns up to 100 results per search — raise to 100 to see the full set.
notice_typeNoFilter by Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order, '2410' appointment of administrators). Omit to search all.

Output Schema

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

TDQS

A4.1/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: results are sorted by an internal DD severity score, the notice label is preserved as a source fact, and a published notice is legally effective. These details are not visible in the annotations and help an agent interpret results and avoid assuming chronological ordering.

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

Conciseness4/5

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

The description is well-structured and mostly front-loaded, but the first two sentences both announce the same search operation with slightly different phrasing. Every other sentence earns its place by explaining sorting, result IDs, or the legal significance of a Gazette notice.

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

Completeness4/5

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

The description covers the key non-obvious behaviors an agent needs: the insolvency-specific scope, severity-based sorting, the presence of notice_numeric_id, the separate notice resource for full wording, and the legal effectiveness of published notices. Given that an output schema exists and the parameter schema is fully documented, nothing critical appears missing.

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

Parameters3/5

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

The input schema already provides 100% coverage of parameter meanings, including aliases, date formats, max_notices caps, and notice_type examples. The description adds some useful context around the notice-code taxonomy and the result's numeric ID, but it does not materially improve parameter-level understanding beyond the schema.

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

Purpose5/5

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

The description names a specific verb ('Search') and a specific resource ('The Gazette's corporate-insolvency notice index'), and also indicates the search is by entity name. It differentiates this tool from siblings like gazette_notice by noting results contain a notice_numeric_id and that the full legal wording is available separately via a notice:// resource.

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

Usage Guidelines4/5

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

The description clearly frames this as the entry point for finding insolvency notices and then directs the user to read the full legal wording via notice://{notice_numeric_id}, which functions as an implicit alternative path. It does not explicitly state 'use gazette_notice for full notices' or list exclusions, but the context is clear enough for an agent to choose correctly.

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

gazette_noticeGet Gazette Notice Full TextA
Read-onlyIdempotent
Inspect

Fetch the full legal wording of a Gazette notice by numeric notice ID.

Returns the complete JSON-LD linked-data record for the notice: parties, legal basis, court, and full text. Use gazette_insolvency first to find notice_numeric_id values.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by specifying the output structure: 'complete JSON-LD linked-data record for the notice: parties, legal basis, court, and full text.' This provides context beyond annotations.

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

Conciseness5/5

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

Three concise sentences: first states purpose, second describes return content, third provides usage guidance. Every sentence is essential and front-loaded. No redundancy or filler.

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

Completeness5/5

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

The tool has an output schema (true) and annotations covering safety. The description lists key return fields and references pipelining with a sibling tool. This is fully adequate for an agent to understand when and how to use the tool.

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

Parameters3/5

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

Schema coverage is 100%. The input schema already describes 'Numeric Gazette notice ID. Returned as notice_numeric_id by gazette_insolvency.' The description does not add additional parameter semantics, so baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Fetch the full legal wording of a Gazette notice by numeric notice ID.' It specifies the verb (fetch), the resource (Gazette notice full text), and the method (by numeric notice ID). This clearly distinguishes from sibling tool gazette_insolvency.

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

Usage Guidelines5/5

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

The description explicitly instructs 'Use gazette_insolvency first to find notice_numeric_id values.' This provides clear when-to-use guidance and directs the agent to a prerequisite tool, effectively preventing misuse.

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

officer_appointmentsGet Officer Appointment HistoryA
Read-onlyIdempotent
Inspect

Fetch a person's full company appointment history by officer ID.

Returns every appointment — current and historic — with each company's number, name, status, role, and appointment/resignation dates. Use company_officers first to find an officer_id, then this tool to discover other companies that person has been a director or secretary of, including dissolved or insolvent ones not mentioned anywhere else. Always returns full history; there is no current-only filter, since historical discovery is the point.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoOfficer name as recorded at CH.
totalYesTotal appointments returned.
officer_idYesCompanies House officer ID.
active_countNoUpstream count of appointments Companies House categorizes as 'active' — this reflects the officer's own appointment/resignation state at that company, NOT whether the company itself is currently trading. An appointment at a company in liquidation or administration still counts as active here if the officer was never formally resigned. Check each appointment's own company_status field for the company's actual status. Null if not provided upstream.
appointmentsNoEvery appointment, current and historic.
date_of_birthNoPartial date of birth (month/year), or empty if not disclosed upstream.
inactive_countNoUpstream count of appointments Companies House categorizes as 'inactive', passed through as-is. Exact categorization semantics have not been independently verified against per-appointment data — treat as an unverified upstream fact, not a derived signal, or null if not provided.
resigned_countNoUpstream count of resigned appointments, or null if not provided.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds meaningful context beyond that: it returns current and historic appointments, includes dissolved or insolvent companies, and explicitly discloses that there is no current-only filter. No contradiction with annotations.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by return details, the prerequisite workflow, and an explicit limitation. Every sentence adds decision-relevant information and there is no filler or repetition.

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

Completeness5/5

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

With a single parameter, a strong output schema, and annotations covering safety and idempotency, the description fills the remaining gaps: what data is returned, how to obtain the required officer_id, and what filtering behavior to expect. Nothing essential is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains officer_id as a Companies House officer ID returned by company_officers. The description adds a little context by saying the officer ID is used to fetch appointment history, but it does not materially expand on the schema. This meets the baseline for high schema coverage.

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

Purpose5/5

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

The description starts with a specific verb and resource: 'Fetch a person's full company appointment history by officer ID.' It clearly distinguishes itself from the sibling company_officers tool by emphasizing historical appointment discovery across companies, not just a company's current officers.

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

Usage Guidelines5/5

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

The description gives an explicit workflow: use company_officers first to find an officer_id, then use this tool. It also states the tool always returns full history and has no current-only filter, which prevents misuse when a current-only view is needed.

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

sanctions_screenScreen a Name Against Sanctions ListsA
Read-onlyIdempotent
Inspect

Screen a name against the UK (OFSI), US (OFAC), EU and UN consolidated sanctions lists.

Returns every list entry whose primary name or alias matches, with the regime, source reference and listing date. Use it to check whether a counterparty — or its officers / persons with significant control — appears on a sanctions list.

MATCHING is deterministic: normalised exact + alias match (case-, accent- and punctuation-insensitive). A company/entity legal name matches reliably; PERSON names with transliteration variants may not (e.g. 'Mohammed' vs 'Muhamad'). An empty result is therefore NOT a guarantee of clearance, and a hit on a common name may be a false positive to disambiguate. This is a screening aid, not a compliance determination.

lists_screened reports which of OFSI/OFAC/EU/UN were actually loaded — if any is missing the result is partial. as_at is when the lists were last refreshed on this server.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNoMatching list entries. An empty list means no exact/alias match on the screened lists — NOT a guarantee of clearance (see the tool description on matching limits).
as_atNoWhen this server last refreshed the loaded lists (ISO timestamp). Provenance for the screen — the lists update on designation.
queryYesThe name that was screened.
match_countYesNumber of list entries that matched the query.
lists_screenedNoWhich consolidated lists were loaded and actually screened for this call. A list absent here failed to load and was NOT screened — treat the result as partial if any of OFSI/OFAC/EU/UN is missing.
normalized_queryYesThe normalised form used for matching (upper-cased, accent- and punctuation-stripped, whitespace-collapsed).
entity_type_filterNoentity_type filter applied to the screen ('person'/'entity'), or null.

TDQS

A5/5.0
Behavior5/5

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

Annotations (readOnlyHint, openWorldHint, idempotentHint) are fully supported by the description, which adds details on matching algorithm (case-/accent-/punctuation-insensitive), deterministic nature, and partial result conditions. No contradictions.

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

Conciseness5/5

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

The description is concise and well-structured, with a clear first sentence stating purpose, followed by output explanation, usage guidance, and matching details. Every sentence adds value with no fluff.

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

Completeness5/5

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

Given the complexity of sanctions screening, the description is highly complete: it covers matching algorithm, limitations, output fields, and caveats about empty results and false positives. An output schema exists but the description already explains return values sufficiently.

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

Parameters5/5

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

Schema description coverage is 100%, and the description adds significant value beyond the schema: it explains the matching behavior, transliteration uncertainties, and the meaning of output fields, which aids correct interpretation.

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

Purpose5/5

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

The title and description clearly state that the tool screens a name against multiple sanctions lists (UK, US, EU, UN). The verb 'screen' and resource 'sanctions lists' are specific, and there is no sibling tool with similar purpose.

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

Usage Guidelines5/5

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

The description explicitly states when to use it (check counterparty against sanctions lists) and provides important caveats: empty result is not clearance, deterministic matching limitations, and screening aid only. It also explains output fields like lists_screened and as_at.

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

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

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

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

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

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

Output Schema

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

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, etc. The description adds useful behavioral context: returns trading name and address, and notes that the VAT address often differs from Companies House address as a due diligence signal. This goes beyond what annotations provide.

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

Conciseness5/5

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

Concise, well-structured, with no unnecessary words. Three short paragraphs: purpose, output, and scope limitation. Every sentence adds value.

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

Completeness5/5

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

For a single-parameter tool with high schema coverage and an output schema (not shown but present), the description fully explains the tool's purpose, output, and limitations. No gaps remain.

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

Parameters4/5

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

Schema coverage is 100% and the schema description already explains format and normalization. The description adds context about what the parameter is used for and what the tool returns, but does not add strictly new parameter semantics. A 4 is appropriate for the added contextual value.

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

Purpose5/5

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

Describes exactly what the tool does: validate a UK VAT number against the HMRC register. The verb 'validate' and resource 'UK VAT number (HMRC)' are specific. It is clearly distinct from sibling tools like company_search or sanctions_screen.

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

Usage Guidelines5/5

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

Explicitly states UK numbers only and directs users to the EU VIES service for non-UK numbers. Provides clear when-to-use and 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.

TDQS

A4.1/5.0
Disambiguation4/5

Most tools are clearly separated by register and action, with company_* prefixes and search/profile pairs making selection straightforward. The generic `search` and `fetch` tools overlap somewhat with the register-specific search and profile tools, and `disqualified_search` vs `sanctions_screen` are adjacent screening checks, but descriptions generally resolve the ambiguity.

Naming Consistency4/5

The set is predominantly snake_case with predictable domain prefixes such as company_, charity_, disqualified_, and gazette_. Deviations exist: generic `search`/`fetch`, the search-vs-fetch pair roles of `gazette_insolvency` vs `gazette_notice` are not obvious from names, and `vat_validate`/`sanctions_screen` use a different verb placement.

Tool Count4/5

At 19 tools, the set is slightly heavy, but the count is justified by the breadth of UK due diligence data sources covered: Companies House, charities, disqualifications, Gazette notices, Land Registry, HMRC VAT, and sanctions. Each tool has a distinct, non-redundant role, so the count feels earned rather than padded.

Completeness3/5

The set covers many key due diligence surfaces, including officers, PSC, charges, filings, disqualifications, sanctions, and charity data. Notable gaps remain: there is no person-directed search to find a person's companies without a known officer_id, no direct financial/accounts extraction, and `land_title_search` only queries price-paid data rather than actual title ownership.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    An MCP server for anti-money laundering (AML) compliance, including customer due diligence, transaction monitoring, and SAR filing, compliant with 6AMLD, UK MLR 2017, and FinCEN.
    4
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server exposing the full UK Companies House Public Data API, enabling natural language queries for company profiles, search, officers, filing history, charges, insolvency, and persons with significant control, as well as downloading and reading PDF documents.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/paulieb89/uk-due-diligence-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server