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 分