Metadata-Version: 2.4
Name: uk-due-diligence-mcp
Version: 1.0.0
Summary: UK due diligence MCP server — nine tools across five public registers
Project-URL: Homepage, https://github.com/paulieb89/uk-due-diligence-mcp
Project-URL: Repository, https://github.com/paulieb89/uk-due-diligence-mcp
Author: Paul Boucher
License: MIT
Keywords: charity-commission,companies-house,compliance,due-diligence,fastmcp,gazette,hmrc,kyc,land-registry,mcp,uk,vat
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.11
Requires-Dist: fastmcp>=2.0.0
Requires-Dist: httpx>=0.27.0
Requires-Dist: pydantic>=2.7.0
Requires-Dist: python-dotenv>=1.0.0
Description-Content-Type: text/markdown

# uk-due-diligence-mcp

Nine tools across five UK public registers. 

Give an agent a company name and it pulls corporate status, filing compliance, director networks, beneficial ownership chains, insolvency notices, VAT validation, and property transactions.

---

## Data Sources

| Register | API | Auth |
|----------|-----|------|
| Companies House | `api.company-information.service.gov.uk` | API key (free) |
| Charity Commission | `api.charitycommission.gov.uk` | API key (free) |
| HMLR Land Registry | `landregistry.data.gov.uk` (SPARQL + REST) | None |
| The Gazette | `thegazette.co.uk/all-notices` (Linked Data) | None |
| HMRC VAT | `api.service.hmrc.gov.uk` | None |

---

## Tools

| Tool | Register | Description |
|------|----------|-------------|
| `company_search` | Companies House | Search by name/keyword with status/type filters |
| `company_profile` | Companies House | Full profile: status, filing compliance, charges |
| `company_officers` | Companies House | Directors with high-appointment-count risk flag |
| `company_psc` | Companies House | Beneficial owners, PSC chain, offshore flags |
| `charity_search` | Charity Commission | Search by name, filter by registration status |
| `charity_profile` | Charity Commission | Full record: trustees, finances, governing doc |
| `land_title_search` | HMLR | Property ownership via SPARQL PPI query |
| `gazette_insolvency` | The Gazette | Corporate insolvency notices (codes 2441-2460) |
| `vat_validate` | HMRC VAT | Trading name + address as registered for VAT |

---

## Setup

### API Keys

| Key | Where to get it |
|-----|----------------|
| `CH_API_KEY` | [developer.company-information.service.gov.uk](https://developer.company-information.service.gov.uk) — free |
| `CHARITY_API_KEY` | [api-portal.charitycommission.gov.uk](https://api-portal.charitycommission.gov.uk) — free |

HMLR, Gazette, and HMRC VAT require no API key.

### Local development

```bash
git clone https://github.com/bch-nz/uk-due-diligence-mcp
cd uk-due-diligence-mcp

cp .env.example .env
# Fill in your API keys

pip install -e .
python server.py
```

Server starts at `http://localhost:8080/mcp`.

### Fly.io deployment

```bash
fly launch --name uk-due-diligence-mcp --region lhr
fly secrets set CH_API_KEY=xxx CHARITY_API_KEY=xxx
fly deploy
```

---

## Connecting

Add to your MCP client config:

```json
{
  "mcpServers": {
    "uk-due-diligence": {
      "url": "https://uk-due-diligence-mcp.fly.dev/mcp"
    }
  }
}
```

---

## Demo

```
Run due diligence on Carillion PLC
```

The agent calls `company_search` to resolve the company number, then `company_profile`, `company_officers`, `company_psc`, and `gazette_insolvency` — reasoning across all five registries to surface risk signals.

---

## Project Structure

```
uk-due-diligence-mcp/
├── server.py           # FastMCP init, tool registration, transport config
├── companies_house.py  # company_search, company_profile, company_officers, company_psc
├── charity.py          # charity_search, charity_profile
├── land_registry.py    # land_title_search (SPARQL + REST)
├── gazette.py          # gazette_insolvency (JSON-LD, notice codes 2441-2460)
├── hmrc_vat.py         # vat_validate
├── http_client.py      # Shared httpx clients, retry backoff, error formatting
├── inputs.py           # Pydantic v2 input models
├── fly.toml
├── Dockerfile
├── pyproject.toml
└── .env.example
```

---

## Technical Notes

### The Gazette API
REST+RDF linked-data pattern. Corporate insolvency notice codes span 2441-2460.
The read API is unauthenticated; auth is write-only (for placing notices).

### HMLR Land Registry
Free endpoint at `api.landregistry.data.gov.uk`. Returns RDF/Turtle by default —
the SPARQL endpoint is used for Price Paid Index queries. Covers England and Wales only.

### High-Appointment-Count Signal
Directors with 10+ other active appointments are flagged. A director on 40+ companies
is a common pattern in nominee director operations and phoenix company structures.

---

## Licence

MIT
