UK Property Data

io.github.paulieb89Published by GitHub account paulieb89v1.5.1Updated Oct 27, 2026

UK property data — Land Registry comps, EPC, Rightmove, rental yields, stamp duty, Companies House

VerifiedStreamable HTTPWeb executableLocation & LifestyleFinanceBusiness & Commerce

Overview

AI-generated overview

UK property data server: Land Registry sold prices, EPC certificates, Rightmove listings, rental yields, stamp duty, planning links and Companies House lookups.

What you can do
  • Look up sold prices and comparable sales, plus Land Registry transactions for a postcode
  • Search Rightmove sale and rental listings and fetch full detail for a single listing
  • Estimate gross rental yield and achievable rent from sales and rental data
  • Search EPC certificate summaries and fetch a single certificate by number
  • Calculate stamp duty and find the council planning portal for a postcode
  • Search Companies House by company name and group flat sales by building
When to use it
Useful when researching UK residential property: valuing a postcode, checking comparable sales, estimating rental yield, reviewing EPC ratings, costing stamp duty, or screening buildings with many flat sales. Also handy for quick company checks and finding the right planning portal.
Requirements
Runs as a remote HTTP endpoint with no install, or locally via the PyPI package with uvx or pip (Python). EPC lookups need EPC_API_TOKEN; company search needs COMPANIES_HOUSE_API_KEY; the planning scraper needs OPENAI_API_KEY. Land Registry and Rightmove data work without credentials. Network access is required.
Before you install
EPC, Companies House and planning features need API tokens or keys supplied by environment variable. Rightmove data is scraped, so results may be rate-limited or change. EPC coverage is England and Wales only, and ambiguous address matches are refused rather than guessed. Planning portal lookup is described as stdio only.

Installation

In SourceWeft

  1. Open UK Property Data in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.paulieb89%2Fproperty-shared/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "uk-property-data": {
      "type": "http",
      "url": "https://property-shared.fly.dev/mcp"
    }
  }
}

README

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

Data SourceWhat It Returns
Land Registry PPDSold 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
RightmoveCurrent listings (sale + rent), prices, agents, listing details
Yield AnalysisGross yield from PPD sales + Rightmove rentals combined
Stamp DutySDLT calculation with April 2025 bands, BTL surcharge, FTB relief
Block AnalyzerGroups flat sales by building to spot investor exits
PlanningLocal council planning portal lookup (99 verified councils, stdio only)
Companies HouseCompany search and lookup by name or number

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:

json
{  "mcpServers": {    "property-shared": {      "type": "http",      "url": "https://property-shared.fly.dev/mcp"    }  }}

Install

bash
pip install property-shared
# or with uvuv add property-shared

Extras: [cli] for CLI, [api] for HTTP server.

bash
pip install property-shared[cli]# oruv add property-shared --extra cli

Use as a Python Library

python
from property_core import PPDService, calculate_yield, calculate_stamp_duty
# Get comparable sales for a postcodecomps = PPDService().comps("SW1A 1AA", months=24, property_type="F")print(f"Median flat price: {comps.median:,}")
# Calculate rental yieldimport asyncioresult = asyncio.run(calculate_yield("NG1 1AA", property_type="F"))print(f"Gross yield: {result.gross_yield_pct}%")
# Stamp dutysdlt = calculate_stamp_duty(250000, additional_property=True)print(f"SDLT: {sdlt.total_sdlt:,.0f} ({sdlt.effective_rate}%)")

All models are available at top level:

python
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):

python
from property_core import classify_yield, classify_data_quality, generate_insights

Use as CLI

bash
pip install property-shared[cli]  # or: uv add property-shared --extra cli
# Comparable salesproperty-cli ppd comps "SW1A 1AA" --months 24 --property-type F
# Rental yieldproperty-cli analysis yield "NG1 1AA" --property-type F
# Stamp dutyproperty-cli calc stamp-duty 300000
# Rightmove search (with sort)property-cli rightmove search-url "NG1 1AA" --sort-by most_reduced
# Full property reportproperty-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.

Use as HTTP API

bash
pip install property-shared[api]  # or: uv add property-shared --extra apiproperty-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=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:

VariableRequired ForDescription
EPC_API_TOKENEPC lookupsBearer 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_KEYCompany searchFree key from Companies House
RIGHTMOVE_DELAY_SECONDSNo (default 0.6s)Rate limit delay for Rightmove scraping
OPENAI_API_KEYPlanning scraperVision-guided planning portal scraper

Land Registry PPD and Rightmove work without credentials.

Development

bash
# Install dependencies (dev tooling installs by default via [dependency-groups])uv sync
# Run API with reloaduv 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.

Source: README.md at commit e9cc1cc

Tools

14

property_comps

Comparable 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" (standard sales). Pass None to include category-B (bulk transfers, non-standard conveyances). - filter_outliers=False by default; set True for IQR-trimmed stats AND transaction list (1.5*IQR rule, needs >=4 prices). limit caps returned transactions (max 200). enrich_epc attaches EPC floor area and price-per-sqft to each transaction — slower but richer.

Parameterslimitmonthsaddresspostcoderequiredenrich_epcsearch_levelproperty_typefilter_outlierstransaction_category

property_yield

Gross 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.

Parametersmonthspostcoderequiredsearch_levelauto_escalateproperty_type

rental_analysis

Rental market analysis and achievable rent estimate. auto_escalate widens the Rightmove search RADIUS when fewer than 5 listings are found (thin market). This is rental-radius escalation and is unaffected by the PPD geography containment: it does not change a postcode's outcode or sector, so it carries none of the limit-dependence that disabled PPD auto-widening. Response includes thin_market, escalated_from, escalated_to fields when escalation occurs.

Parametersradiuspostcoderequiredauto_escalatepurchase_price

property_epc

Energy Performance Certificate data for a UK property or postcode area. With address: returns the matched EPC certificate for that specific property. Without address: returns the record count and, when the bounded response contains every matching summary, the rating distribution. Property-type breakdown and floor-area statistics are NOT available — the EPC service exposes them only on individual certificates. Returns null only when no certificates are lodged for the postcode. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.

Parametersaddresspostcoderequired

property_epc_summaries

List EPC certificate summaries at a postcode — for candidate selection. Returns one bounded page. Each entry contains only what the EPC search exposes: certificate_number, address, uprn (often absent), energy band, registration_date and schema_type. Energy score, floor area and property type are NOT available here — fetch a specific certificate for those. Workflow when a Rightmove listing has no house number: 1. property_epc_summaries(postcode) to list candidates. 2. Narrow by address text and, where present, uprn. 3. epc_certificate(lmk_key=<certificate_number>) for the chosen one, then cross-check its floor_area against the listing. 4. If several candidates remain equally plausible, present them all — do not guess. Selecting arbitrarily attaches another property's data. `complete` is false when the postcode holds more records than this page returns. Upstream page traversal is not snapshot-stable, so a multi-page result is a bounded sample, not a guaranteed-complete set. An empty `results` list means no certificates are lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.

Parameterspagepostcoderequired

epc_certificate

Fetch a single EPC certificate by its GOV.UK certificate number. Use after property_epc_summaries has listed the candidates and you have picked one — this is faster than property_epc(postcode, address) as it makes a direct lookup with no address matching or postcode re-fetch. The parameter is named lmk_key as a compatibility alias; pass the certificate number, which is returned in every property_epc_summaries row. (property_epc_search is deprecated and raises — do not call it.) Returns the full EPC certificate, or null only when no such certificate is lodged. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.

Parameterslmk_keyrequired

stamp_duty

UK Stamp Duty Land Tax (SDLT) calculation with full breakdown.

Parameterspricerequirednon_residentfirst_time_buyeradditional_property

rightmove_listing

Full detail for a single Rightmove listing. property_id is the numeric Rightmove property ID (the digits at the end of a rightmove.co.uk/properties/... URL), max 12 digits. Full URLs are not accepted. 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.

Parametersmax_imagesproperty_idrequiredinclude_images

property_blocks

Property block analysis — identify buildings with multiple flat sales (block-buy opportunities).

Parametersmonthspostcoderequiredsearch_level

ppd_transactions

Land Registry Price Paid transactions for a postcode, most recent first. Returns up to `limit` most recent transactions **within snapshot coverage** (`coverage_from`-`coverage_to` in the response's `provenance`). Unfiltered by default -- category-B bulk transfers and commercial sales are included. Pass `property_type` (F=flat, D=detached, S=semi, T=terraced, O=other) to restrict the result to a single type. **Not a complete property history.** Check `provenance.older_records_exist` and `provenance.sample_complete` before saying anything about what a property has or has not sold for. An empty result means "no sales within the stated coverage" -- never "never sold". For clean residential comparable sales, use `property_comps`.

Parameterslimitpostcoderequiredproperty_type

Version history

1
  1. v1.5.1LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts