
Connects to five UK government registers for corporate due diligence without paywalls. Pulls company profiles, director appointments, beneficial ownership chains, and disqualification records from Companies House. Checks charity financials and trustees via the Charity Commission API. Queries HMLR for property ownership through SPARQL, scrapes insolvency notices from The Gazette's linked data feed, and validates VAT numbers against HMRC. Includes three orchestration prompts that chain searches across registers. Useful for KYC checks, investor due diligence, or flagging phoenix company patterns. The hosted endpoint needs no API keys, but local installs require free Companies House and Charity Commission credentials. Covers England and Wales only for land registry queries.
claude mcp add --transport http uk-due-diligence-mcp https://uk-due-diligence-mcp.fly.dev/mcpRun in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
company_searchSearch 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 wi...5 paramsSearch 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 wi...
company_statusvaluecompany_typevalueitems_per_pageintegerquery*stringstart_indexintegercompany_profileFetch 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.1 paramsFetch 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.
company_number*stringcompany_officersFetch 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...3 paramsFetch 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...
company_number*stringitems_per_pagevaluestart_indexvaluecompany_pscFetch 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-h...1 paramsFetch 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-h...
company_number*stringcharity_searchSearch 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...3 paramsSearch 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...
limitintegeroffsetintegerquery*stringcharity_profileFetch 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.1 paramsFetch 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.
charity_number*stringdisqualified_searchCheck 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. Ret...3 paramsCheck 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. Ret...
items_per_pageintegerquery*stringstart_indexintegerdisqualified_profileFetch 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.1 paramsFetch 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.
officer_id*stringland_title_searchSearch 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 a...1 paramsSearch 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 a...
address_or_postcode*stringgazette_noticeFetch 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.1 paramsFetch 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.
notice_id*stringgazette_insolvencySearch 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 a...5 paramsSearch 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 a...
end_datevalueentity_name*stringmax_noticesintegernotice_typevaluestart_datevaluevat_validateValidate 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 no...1 paramsValidate 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 no...
vat_number*stringsearchSearch 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.1 paramsSearch 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.
query*stringfetchFetch 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...1 paramsFetch 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...
id*stringlist_promptsList all available prompts. Returns JSON with prompt metadata including name, description, and optional arguments.List all available prompts. Returns JSON with prompt metadata including name, description, and optional arguments.
No parameters — call it with no arguments.
get_promptGet 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.2 paramsGet 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.
argumentsvaluename*stringOfficial-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.
| 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 |
{
"mcpServers": {
"uk-due-diligence": {
"type": "http",
"url": "https://uk-due-diligence-mcp.fly.dev/mcp"
}
}
}
{
"mcpServers": {
"uk-due-diligence": {
"type": "stdio",
"command": "uvx",
"args": ["uk-due-diligence-mcp"]
}
}
}
See Configuration for the environment variables it needs.
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 |
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.
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.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.| 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.
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
MIT