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.
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 |
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_searchreturns 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: nullmeans 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_appointmentsreturns historical relationships. Companies House doesn't auto-resign a director when a company enters insolvency — checkcompany_statuson each appointment, not justresigned_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
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uk_due_diligence_mcp-1.3.0.tar.gz.
File metadata
- Download URL: uk_due_diligence_mcp-1.3.0.tar.gz
- Upload date:
- Size: 200.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
997805380963a5664a47120a3628daf9a2a0f80c529d282aa817cb7250119c20
|
|
| MD5 |
35448d35679c0bdfa917bf4da75d4a2b
|
|
| BLAKE2b-256 |
b483ff1dc870e787367d0caa337673e856e7482009367510d95322fe0dfefde1
|
Provenance
The following attestation bundles were made for uk_due_diligence_mcp-1.3.0.tar.gz:
Publisher:
release.yml on paulieb89/uk-due-diligence-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
uk_due_diligence_mcp-1.3.0.tar.gz -
Subject digest:
997805380963a5664a47120a3628daf9a2a0f80c529d282aa817cb7250119c20 - Sigstore transparency entry: 2574986957
- Sigstore integration time:
-
Permalink:
paulieb89/uk-due-diligence-mcp@8dd311fc430d765d317612ff44fe6b38188f23bc -
Branch / Tag:
refs/tags/v1.3.0 - Owner: https://github.com/paulieb89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8dd311fc430d765d317612ff44fe6b38188f23bc -
Trigger Event:
release
-
Statement type:
File details
Details for the file uk_due_diligence_mcp-1.3.0-py3-none-any.whl.
File metadata
- Download URL: uk_due_diligence_mcp-1.3.0-py3-none-any.whl
- Upload date:
- Size: 62.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
508a1f447e894cbf7097e3f0d4a291b134255a97bc67274d59908bed279b9865
|
|
| MD5 |
4e9cb43943ec53b305f16b2543696145
|
|
| BLAKE2b-256 |
1ad17ce7fecc4e4b8ce7a3e130f7fd80781f6c83f90aade1d60f8e3160224c80
|
Provenance
The following attestation bundles were made for uk_due_diligence_mcp-1.3.0-py3-none-any.whl:
Publisher:
release.yml on paulieb89/uk-due-diligence-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
uk_due_diligence_mcp-1.3.0-py3-none-any.whl -
Subject digest:
508a1f447e894cbf7097e3f0d4a291b134255a97bc67274d59908bed279b9865 - Sigstore transparency entry: 2574986998
- Sigstore integration time:
-
Permalink:
paulieb89/uk-due-diligence-mcp@8dd311fc430d765d317612ff44fe6b38188f23bc -
Branch / Tag:
refs/tags/v1.3.0 - Owner: https://github.com/paulieb89
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8dd311fc430d765d317612ff44fe6b38188f23bc -
Trigger Event:
release
-
Statement type: