
Wraps a comprehensive set of UK property data sources into MCP tools. Pulls Land Registry sold price data with area comps and percentiles, EPC certificates for energy ratings and floor plans, live Rightmove listings for sale and rent, and Companies House records. Exposes calculators for stamp duty (with 2025 bands and BTL surcharge) and rental yields derived from combining sales and rental data. Also includes a block analyzer that groups flat sales by building to identify investor activity patterns. The whole thing runs as a hosted MCP server at property-shared.fly.dev, so no local installation needed. Built by someone clearly deep in UK property analysis who needed programmatic access to data that normally requires manual lookups across multiple government portals and listing sites.
claude mcp add --transport http property-shared https://property-shared.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.
property_compsComparable sales from Land Registry Price Paid Data. Defaults return the standard residential set: - property_type=None means residential (F+D+S+T). Pass "F"/"D"/"S"/"T"/"O" for a single type, or "ALL" to disable type filtering (firehose). - transaction_category defaults to "A...9 paramsComparable sales from Land Registry Price Paid Data. Defaults return the standard residential set: - property_type=None means residential (F+D+S+T). Pass "F"/"D"/"S"/"T"/"O" for a single type, or "ALL" to disable type filtering (firehose). - transaction_category defaults to "A...
addressvalueenrich_epcbooleanfilter_outliersbooleanlimitintegermonthsintegerpostcode*stringproperty_typevaluesearch_levelstringtransaction_categoryvalueproperty_yieldGross rental yield for a UK postcode. Combines Land Registry sale comps (median sale price) with Rightmove rental listings (median monthly rent) to produce a gross yield percentage.5 paramsGross rental yield for a UK postcode. Combines Land Registry sale comps (median sale price) with Rightmove rental listings (median monthly rent) to produce a gross yield percentage.
auto_escalatebooleanmonthsintegerpostcode*stringproperty_typevaluesearch_levelstringrental_analysisRental market analysis and achievable rent estimate. auto_escalate widens the search area when fewer than 5 listings are found (thin market). Response includes thin_market, escalated_from, escalated_to fields when escalation occurs.4 paramsRental market analysis and achievable rent estimate. auto_escalate widens the search area when fewer than 5 listings are found (thin market). Response includes thin_market, escalated_from, escalated_to fields when escalation occurs.
auto_escalatebooleanpostcode*stringpurchase_pricevalueradiusnumberproperty_epcEnergy Performance Certificate data for a UK property or postcode area. With address: returns the matched EPC certificate for that specific property. Without address: returns an aggregated summary of every certificate at the postcode — count, rating distribution, property-type...2 paramsEnergy Performance Certificate data for a UK property or postcode area. With address: returns the matched EPC certificate for that specific property. Without address: returns an aggregated summary of every certificate at the postcode — count, rating distribution, property-type...
addressvaluepostcode*stringproperty_epc_searchBrowse all EPC certificates at a postcode — use when you have no house number. Returns a slim list of every certificate at the postcode. Each entry contains: address, rating, score, floor_area (sqm), property_type, floor_level, habitable_rooms, inspection_date, lmk_key. Workfl...1 paramsBrowse all EPC certificates at a postcode — use when you have no house number. Returns a slim list of every certificate at the postcode. Each entry contains: address, rating, score, floor_area (sqm), property_type, floor_level, habitable_rooms, inspection_date, lmk_key. Workfl...
postcode*stringepc_certificateFetch a single EPC certificate by its lmk_key (certificate hash). Use after property_epc_search has identified the correct cert — this is faster than property_epc(postcode, address) as it makes a direct lookup with no fuzzy matching or postcode re-fetch. lmk_key is returned in...1 paramsFetch a single EPC certificate by its lmk_key (certificate hash). Use after property_epc_search has identified the correct cert — this is faster than property_epc(postcode, address) as it makes a direct lookup with no fuzzy matching or postcode re-fetch. lmk_key is returned in...
lmk_key*stringstamp_dutyUK Stamp Duty Land Tax (SDLT) calculation with full breakdown.4 paramsUK Stamp Duty Land Tax (SDLT) calculation with full breakdown.
additional_propertybooleanfirst_time_buyerbooleannon_residentbooleanprice*integerrightmove_searchFetch Rightmove listings for a postcode. listing_type: "sale" or "rent". sort_by: "newest", "most_reduced", "price_asc", "price_desc". keywords filters by description text (e.g. "church conversion", "barn", "factory"). Images are excluded from results.9 paramsFetch Rightmove listings for a postcode. listing_type: "sale" or "rent". sort_by: "newest", "most_reduced", "price_asc", "price_desc". keywords filters by description text (e.g. "church conversion", "barn", "factory"). Images are excluded from results.
keywordsvaluelisting_typestringmax_pagesintegermax_pricevaluemin_bedroomsvaluepostcode*stringproperty_typevalueradiusnumbersort_byvaluerightmove_listingFull detail for a single Rightmove listing (URL or numeric ID). include_images fetches and embeds photos and floorplans as MCP image content. max_images caps the number of property photos (default 3); floorplans always included.3 paramsFull detail for a single Rightmove listing (URL or numeric ID). include_images fetches and embeds photos and floorplans as MCP image content. max_images caps the number of property photos (default 3); floorplans always included.
include_imagesbooleanmax_imagesintegerproperty_url_or_id*stringproperty_blocksProperty block analysis — identify buildings with multiple flat sales (block-buy opportunities).3 paramsProperty block analysis — identify buildings with multiple flat sales (block-buy opportunities).
monthsintegerpostcode*stringsearch_levelstringcompany_searchSearch Companies House for a company by name.1 paramsSearch Companies House for a company by name.
name*stringplanning_searchFind the council planning portal URL for a postcode.1 paramsFind the council planning portal URL for a postcode.
postcode*stringppd_transactionsRaw Land Registry Price Paid transactions for a postcode.3 paramsRaw Land Registry Price Paid transactions for a postcode.
limitintegerpostcode*stringproperty_typevalueUK 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.
| Data Source | What It Returns |
|---|---|
| Land Registry PPD | Sold prices, dates, property types, area comps with median/percentiles |
| EPC (GOV.UK) | Energy ratings, floor area, heating costs. England & Wales only. Certificate lookup and summary search — see EPC notes below |
| Rightmove | Current listings (sale + rent), prices, agents, listing details |
| Yield Analysis | Gross yield from PPD sales + Rightmove rentals combined |
| Stamp Duty | SDLT calculation with April 2025 bands, BTL surcharge, FTB relief |
| Block Analyzer | Groups flat sales by building to spot investor exits |
| Planning | Local council planning portal lookup (99 verified councils, stdio only) |
| Companies House | Company search and lookup by name or number |
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. paul@bouch.dev
No install required — paste the URL into your MCP client config and go.
Claude Code, Cursor, any MCP client:
{
"mcpServers": {
"property-shared": {
"type": "http",
"url": "https://property-shared.fly.dev/mcp"
}
}
}
pip install property-shared
# or with uv
uv add property-shared
Extras: [cli] for CLI, [api] for HTTP server.
pip install property-shared[cli]
# or
uv add property-shared --extra cli
from property_core import PPDService, calculate_yield, calculate_stamp_duty
# Get comparable sales for a postcode
comps = PPDService().comps("SW1A 1AA", months=24, property_type="F")
print(f"Median flat price: {comps.median:,}")
# Calculate rental yield
import asyncio
result = asyncio.run(calculate_yield("NG1 1AA", property_type="F"))
print(f"Gross yield: {result.gross_yield_pct}%")
# Stamp duty
sdlt = calculate_stamp_duty(250000, additional_property=True)
print(f"SDLT: {sdlt.total_sdlt:,.0f} ({sdlt.effective_rate}%)")
All models are available at top level:
from property_core import (
PPDTransaction, PPDCompsResponse, EPCData,
RightmoveListing, RightmoveListingDetail,
PropertyReport, YieldAnalysis, RentalAnalysis,
BlockAnalysisResponse, CompanyRecord, StampDutyResult,
)
Interpretation helpers (core returns numbers, you decide how to label them):
from property_core import classify_yield, classify_data_quality, generate_insights
pip install property-shared[cli] # or: uv add property-shared --extra cli
# Comparable sales
property-cli ppd comps "SW1A 1AA" --months 24 --property-type F
# Rental yield
property-cli analysis yield "NG1 1AA" --property-type F
# Stamp duty
property-cli calc stamp-duty 300000
# Rightmove search (with sort)
property-cli rightmove search-url "NG1 1AA" --sort-by most_reduced
# Full property report
property-cli report generate "10 Downing Street, SW1A 2AA" --property-type F
Add --api-url http://localhost:8000 to any command to route through the HTTP API instead of calling core directly.
pip install property-shared[api] # or: uv add property-shared --extra api
property-api # starts on port 8000
Interactive docs at http://localhost:8000/docs.
Key endpoints:
GET /v1/ppd/comps?postcode=SW1A+1AA&property_type=F&enrich_epc=trueGET /v1/analysis/yield?postcode=NG1+1AA&property_type=FGET /v1/analysis/rental?postcode=NG1+1AA&purchase_price=200000GET /v1/rightmove/search-url?postcode=NG1+1AA&sort_by=newestGET /v1/calculators/stamp-duty?price=300000&additional_property=truePOST /v1/property/report with { "address": "10 Downing Street, SW1A 2AA" }Full endpoint list in USER_GUIDE.md.
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:
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.None —
unavailable, not zero — because producing them would mean one request per
certificate.complete,
duplicates_removed and unusable_rows; no operation claims a complete
harvest of an area.search_all_by_postcode() is unsupported — use search_summaries() for
candidate discovery, then get_certificate() for the one you need.
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:
| Variable | Required For | Description |
|---|---|---|
EPC_API_TOKEN | EPC lookups | Bearer token from GOV.UK EPC data |
EPC_API_EMAIL | (deprecated) | Retired service; parsed only to raise a configuration error |
EPC_API_KEY | (deprecated) | Retired service; not a supported fallback |
COMPANIES_HOUSE_API_KEY | Company search | Free key from Companies House |
RIGHTMOVE_DELAY_SECONDS | No (default 0.6s) | Rate limit delay for Rightmove scraping |
OPENAI_API_KEY | Planning scraper | Vision-guided planning portal scraper |
Land Registry PPD and Rightmove work without credentials.
# Install dependencies (dev tooling installs by default via [dependency-groups])
uv sync
# Run API with reload
uv run --extra api uvicorn app.main:app --reload
# Full validation (lockfile check, pre-commit, all extras, full suite) —
# same entrypoint CI and the release gate use
./scripts/validate.sh
# + live integration tests (real network calls)
RUN_LIVE_TESTS=1 ./scripts/validate.sh
Deployed at https://property-shared.fly.dev with API docs at /docs and MCP endpoint at /mcp.