Property Shared
[property-shared MCP server]
UK property data in one package. Pulls Land Registry sales, EPC certificates, Rightmove listings, rental yields, stamp duty calculations, planning portal links, and Companies House records.
Use it as a Python library, CLI, HTTP API, or MCP server.
What You Get
Skills & Plugins
Property and Legal packs coming soon. Please get in contact if you have working experiance or expert knowledge in UK property investing, UK Estate Agents, Property and Conveyencing and would like to help shape this. [email protected]
Use as MCP Server
No install required — paste the URL into your MCP client config and go.
Claude Code, Cursor, any MCP client:
Install
Extras: [cli] for CLI, [api] for HTTP server.
Use as a Python Library
All models are available at top level:
Interpretation helpers (core returns numbers, you decide how to label them):
Use as CLI
Add --api-url http://localhost:8000 to any command to route through the HTTP API instead of calling core directly.
Use as HTTP API
Interactive docs at http://localhost:8000/docs.
Key endpoints:
GET /v1/ppd/comps?postcode=SW1A+1AA&property_type=F&enrich_epc=true
GET /v1/analysis/yield?postcode=NG1+1AA&property_type=F
GET /v1/analysis/rental?postcode=NG1+1AA&purchase_price=200000
GET /v1/rightmove/search-url?postcode=NG1+1AA&sort_by=newest
GET /v1/calculators/stamp-duty?price=300000&additional_property=true
POST /v1/property/report with { "address": "10 Downing Street, SW1A 2AA" }
Full endpoint list in USER_GUIDE.md.
EPC notes (v1.14.0)
The EPC service moved to a GOV.UK Bearer API. Set EPC_API_TOKEN; the old
EPC_API_EMAIL/EPC_API_KEY pair authenticated against a retired host and is
not a supported fallback.
What the new upstream supports, and what it does not:
- Certificate lookup by certificate number — full detail, one request.
- Summary search by postcode — returns address, UPRN (often absent), energy
band, registration date and schema type. It does not return energy score,
floor area or property type; those exist only on a full certificate.
- A postcode selects an area, never a property. Identifying one property
needs a UPRN or an address matching a certificate exactly (case, punctuation
and a leading
Flat/Apartment designator aside). Anything less — no address,
no match, or several matches — is refused rather than resolved to a best guess.
See USER_GUIDE.md for the CLI and REST surfaces.
- Area statistics are limited to the record count and, when the bounded
response contains every matching summary, the rating distribution.
Property-type breakdown and floor-area statistics are reported as
None —
unavailable, not zero — because producing them would mean one request per
certificate.
- Coverage is England and Wales. Scotland, Northern Ireland and the Channel
Islands return "no certificates found": a coverage boundary, not a statement
about a property.
- Pagination is not a stable snapshot. Responses carry
complete,
duplicates_removed and unusable_rows; no operation claims a complete
harvest of an area.
- Ambiguous address matches are refused rather than resolved to an arbitrary
neighbouring certificate.
search_all_by_postcode() is unsupported — use search_summaries() for
candidate discovery, then get_certificate() for the one you need.
Environment Variables
Create a .env file in the repo root (it is gitignored) with the variables you need.
Leave optional variables out entirely rather than assigning them empty.
KEY= sets an empty string, which is not the same as unset: os.getenv("KEY", "default") returns "", so the default never applies. This bit the EPC live
tests, which sent an empty postcode upstream.
Key variables:
Land Registry PPD and Rightmove work without credentials.
Development
Deployed at https://property-shared.fly.dev with API docs at /docs and MCP endpoint at /mcp.