UK Property Data

io.github.paulieb89由 GitHub 账号 paulieb89 发布v1.5.1更新于 Oct 27, 2026

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

已验证Streamable HTTP可网页运行位置与生活金融商业与电商

概览

AI 生成的概览

英国房产数据服务器:提供土地登记成交价、EPC 证书、Rightmove 房源、租金收益率、印花税、规划门户与 Companies House 查询。

可以做什么
  • 查询邮编的成交价、可比成交与土地登记交易记录
  • 搜索 Rightmove 出售与出租房源,并获取单条房源详情
  • 结合成交与租金数据估算毛租金收益率与可达成租金
  • 列出 EPC 证书摘要并按证书编号获取单份证书
  • 计算印花税,并查找邮编对应的市政规划门户
  • 按公司名称搜索 Companies House,并按楼栋汇总公寓成交
适用场景
适合研究英国住宅房产时使用:评估某邮编房价、核对可比成交、估算租金收益率、查看 EPC 评级、计算印花税,或筛查多套公寓成交的楼栋。也可用于快速查公司与定位正确的规划门户。
运行要求
可作为远程 HTTP 端点直接使用、无需安装,也可通过 PyPI 包以 uvx 或 pip 在本地运行(需 Python)。EPC 查询需 EPC_API_TOKEN,公司搜索需 COMPANIES_HOUSE_API_KEY,规划抓取需 OPENAI_API_KEY。土地登记与 Rightmove 数据无需凭证。需要网络访问。
安装前请注意
EPC、Companies House 与规划功能需通过环境变量提供令牌或密钥。Rightmove 数据来自抓取,可能受限流或变动影响。EPC 仅覆盖英格兰与威尔士,地址匹配不明确时会拒绝而非猜测。规划门户查询据说明仅支持 stdio。

安装

在 SourceWeft 中

  1. 打开 控制台中的 UK Property Data,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.paulieb89%2Fproperty-shared/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "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.

来源:README.md,提交 e9cc1cc

工具

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.

输入参数limitmonthsaddresspostcode必填enrich_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.

输入参数monthspostcode必填search_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.

输入参数radiuspostcode必填auto_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.

输入参数addresspostcode必填

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.

输入参数pagepostcode必填

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.

输入参数lmk_key必填

stamp_duty

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

输入参数price必填non_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.

输入参数max_imagesproperty_id必填include_images

property_blocks

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

输入参数monthspostcode必填search_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`.

输入参数limitpostcode必填property_type

版本历史

1
  1. v1.5.1最新Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分