UK due diligence — Companies House, Charity Commission, Land Registry, Gazette, HMRC VAT
io.github.paulieb89/uk-due-diligence-mcp MCP Server
The MCP server io.github.paulieb89/uk-due-diligence-mcp provides official-source UK due-diligence data for AI agents. It supports searches across Companies House, Charity Commission, The Gazette, and HMLR price-paid data, plus checks of screen names against sanctions lists.
🛠️ Key Features
Integrations for Companies House, Charity Commission, The Gazette, and HMLR price-paid data
Sanctions screening against OFSI, OFAC, EU, and UN lists
Exposes atomic MCP tools for consuming agents to investigate
toolCount: 17
topics: ai-skills, claude, companies-house, due-diligence, mcp, mcp-server, uk
🚀 Use Cases
Company ownership and related evidence retrieval
Officer and cross-company appointment history checks
Secured charges, insolvency notices, and registry evidence lookup
⚡ Developer Benefits
Tool-based access: the consuming agent decides the investigation workflow
Uses legally-mandated registers with free official APIs
⚠️ Limitations
Does not decide how to investigate; it only exposes tools and data sources
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.
Parameters5
query
string
required
Company name or keyword to search for
company_status
any
optional
Filter by company status (e.g. 'active', 'dissolved'). Omit to search all.
company_type
any
optional
Filter by company type (e.g. 'ltd', 'llp'). Omit to search all.
items_per_page
integer
optional
Number of results to return (max 100). Default 20.
start_index
integer
optional
Pagination offset. Default 0.
Raw schema
{
"type": "object",
"properties": {
"query": {
"description": "Company name or keyword to search for",
"maxLength": 200,
"minLength": 2,
"type": "string"
},
"company_status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by company status (e.g. 'active', 'dissolved'). Omit to search all."
},
"company_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by company type (e.g. 'ltd', 'llp'). Omit to search all."
},
"items_per_page": {
"default": 20,
"description": "Number of results to return (max 100). Default 20.",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"start_index": {
"default": 0,
"description": "Pagination offset. Default 0.",
"maximum": 10000,
"minimum": 0,
"type": "integer"
}
},
"required": [
"query"
],
"additionalProperties": false
}
company_profile
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.
Parameters1
company_number
string
required
Companies House company number (8 digits, e.g. '03782379'). Returned by company_search.
Raw schema
{
"type": "object",
"properties": {
"company_number": {
"description": "Companies House company number (8 digits, e.g. '03782379'). Returned by company_search.",
"maxLength": 10,
"minLength": 1,
"type": "string"
}
},
"required": [
"company_number"
],
"additionalProperties": false
}
company_officers
Fetch active officers for a Companies House company number.
Returns directors, secretaries, and other active officers with
appointment dates, nationality, and country of residence.
Resigned officers are excluded. Pagination is handled internally —
do NOT pass items_per_page or start_index; this tool takes only
company_number.
Parameters3
company_number
string
required
Companies House company number (8 digits, e.g. '03782379'). Returned by company_search.
items_per_page
any
optional
Ignored — pagination is handled internally. Only accepted to avoid call failures.
start_index
any
optional
Ignored — all officers are returned in one call.
Raw schema
{
"type": "object",
"properties": {
"company_number": {
"description": "Companies House company number (8 digits, e.g. '03782379'). Returned by company_search.",
"maxLength": 10,
"minLength": 1,
"type": "string"
},
"items_per_page": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Ignored — pagination is handled internally. Only accepted to avoid call failures."
},
"start_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Ignored — all officers are returned in one call."
}
},
"required": [
"company_number"
],
"additionalProperties": false
}
company_psc
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.
Parameters1
company_number
string
required
Companies House company number (8 digits, e.g. '03782379'). Returned by company_search.
Raw schema
{
"type": "object",
"properties": {
"company_number": {
"description": "Companies House company number (8 digits, e.g. '03782379'). Returned by company_search.",
"maxLength": 10,
"minLength": 1,
"type": "string"
}
},
"required": [
"company_number"
],
"additionalProperties": false
}
charity_search
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.
Parameters3
query
string
required
Charity name or keyword to search for
offset
integer
optional
Number of items to skip before this page. Default 0.
limit
integer
optional
Max items to return in this page. Default 20; raise to 100 for bulk views.
Raw schema
{
"type": "object",
"properties": {
"query": {
"description": "Charity name or keyword to search for",
"maxLength": 200,
"minLength": 2,
"type": "string"
},
"offset": {
"default": 0,
"description": "Number of items to skip before this page. Default 0.",
"maximum": 10000,
"minimum": 0,
"type": "integer"
},
"limit": {
"default": 20,
"description": "Max items to return in this page. Default 20; raise to 100 for bulk views.",
"maximum": 100,
"minimum": 1,
"type": "integer"
}
},
"required": [
"query"
],
"additionalProperties": false
}
charity_profile
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.
Parameters1
charity_number
string
required
Charity Commission registration number (e.g. '1234567'). Returned by charity_search.
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.
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.
Parameters1
officer_id
string
required
Companies House officer ID. Returned by disqualified_search.
Raw schema
{
"type": "object",
"properties": {
"officer_id": {
"description": "Companies House officer ID. Returned by disqualified_search.",
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"officer_id"
],
"additionalProperties": false
}
land_title_search
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.
Parameters1
address_or_postcode
string
required
UK property address or postcode. Postcode is most reliable: e.g. 'NG1 1AB'. Full address also accepted.
Raw schema
{
"type": "object",
"properties": {
"address_or_postcode": {
"description": "UK property address or postcode. Postcode is most reliable: e.g. 'NG1 1AB'. Full address also accepted.",
"maxLength": 200,
"minLength": 4,
"type": "string"
}
},
"required": [
"address_or_postcode"
],
"additionalProperties": false
}
gazette_notice
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.
Parameters1
notice_id
string
required
Numeric Gazette notice ID. Returned as notice_numeric_id by gazette_insolvency.
Search The Gazette's insolvency notice index by entity name.
Searches the Gazette's insolvency endpoint which covers corporate
notice codes: winding-up orders (2443), administration orders (2448),
liquidator appointments (2452), striking-off notices (2460), and more.
Results are sorted by severity — winding-up orders and administration
orders appear first.
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.
Parameters5
entity_name
string
required
Company or individual name to search for in Gazette insolvency notices
notice_type
any
optional
Filter by notice code (e.g. '2441' winding-up petition, '2443' winding-up order, '2448' administration order, '2460' striking-off). Omit to search all.
start_date
any
optional
Filter notices from this date (YYYY-MM-DD)
end_date
any
optional
Filter notices up to this date (YYYY-MM-DD)
max_notices
integer
optional
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.
Raw schema
{
"type": "object",
"properties": {
"entity_name": {
"description": "Company or individual name to search for in Gazette insolvency notices",
"maxLength": 200,
"minLength": 2,
"type": "string"
},
"notice_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by notice code (e.g. '2441' winding-up petition, '2443' winding-up order, '2448' administration order, '2460' striking-off). Omit to search all."
},
"start_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter notices from this date (YYYY-MM-DD)"
},
"end_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter notices up to this date (YYYY-MM-DD)"
},
"max_notices": {
"default": 20,
"description": "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.",
"maximum": 100,
"minimum": 1,
"type": "integer"
}
},
"required": [
"entity_name"
],
"additionalProperties": false
}
vat_validate
Validate a UK VAT number against the HMRC register.
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.
Parameters1
vat_number
string
required
UK VAT registration number. Accepts: 'GB123456789', '123456789', 'GB 123 456 789'. GB prefix and spaces normalised automatically.
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.
Parameters2
name
string
required
Person or company/entity name to screen against the consolidated sanctions lists.
entity_type
any
optional
Optional filter: 'person' or 'entity'. Omit to screen both.
Raw schema
{
"type": "object",
"properties": {
"name": {
"description": "Person or company/entity name to screen against the consolidated sanctions lists.",
"maxLength": 200,
"minLength": 2,
"type": "string"
},
"entity_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional filter: 'person' or 'entity'. Omit to screen both."
}
},
"required": [
"name"
],
"additionalProperties": false
}
search
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.
Parameters1
query
string
required
Company name, charity name, director name, or keyword to search for across all UK due diligence registers
Raw schema
{
"type": "object",
"properties": {
"query": {
"description": "Company name, charity name, director name, or keyword to search for across all UK due diligence registers",
"maxLength": 200,
"minLength": 2,
"type": "string"
}
},
"required": [
"query"
],
"additionalProperties": false
}
fetch
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
Parameters1
id
string
required
Prefixed record ID returned by search. Format: company:{number}, charity:{number}, disqualification:{officer_id}, or notice:{notice_id}
Raw schema
{
"type": "object",
"properties": {
"id": {
"description": "Prefixed record ID returned by search. Format: company:{number}, charity:{number}, disqualification:{officer_id}, or notice:{notice_id}",
"maxLength": 100,
"minLength": 3,
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
list_prompts
List all available prompts.
Returns JSON with prompt metadata including name, description,
and optional arguments.
Get a prompt by name with optional arguments.
Returns the rendered prompt as JSON with a messages array.
Arguments should be provided as a dict mapping argument names
to values.
Parameters2
name
string
required
The name of the prompt to get
arguments
any
optional
Optional arguments for the prompt
Raw schema
{
"type": "object",
"properties": {
"name": {
"description": "The name of the prompt to get",
"type": "string"
},
"arguments": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional arguments for the prompt"
}
},
"required": [
"name"
],
"additionalProperties": false
}
Official-source UK due-diligence data for AI agents.
Search Companies House, Charity Commission, The Gazette and HMLR price-paid data, plus screen names against the OFSI, OFAC, EU and UN sanctions lists. Exposes atomic MCP tools for company ownership, officers, cross-company appointment history, secured charges, insolvency notices and related registry evidence — the consuming agent decides how to investigate, not the server.
Every data source is a legally-mandated register with a free official API. Zero paywalls.
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
Sanctions
Tool
Description
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
code
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).
code
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.
code
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.
code
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.