Property Shared
MCP serverDev toolsGive your AI access to UK property data so it can research sales, listings, and costs in one place. It draws on Land Registry sold prices, EPC ratings, Rightmove, rental yields, stamp duty, and Companies House records. Your AI can use these to compare properties and work out what a purchase or rental might really cost.
Use Property Shared in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Property Shared and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the property comps tool from Property Shared
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Details
Available today. Use it from your connected AI after setup.
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Add property-shared, then ask your AI a property question, such as recent sold prices in an area or the stamp duty on a purchase. From there you can ask it to compare properties or pull together the numbers behind a deal.
What your AI can do with it
- Find comparable sold prices from Land Registry
- Check a property's EPC energy rating
- Look up current Rightmove listings
- Estimate rental yields
- Work out stamp duty costs
- Look up companies on Companies House
Install Property Shared
The server’s own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each client’s config.
Claude Code
claude mcp add --transport http --scope user property-shared 'https://property-shared.fly.dev/mcp'Run it once in your project, then open /mcp to approve any sign-in the server asks for.
Claude Desktop
https://property-shared.fly.dev/mcpAdd a custom connector in Settings, paste this address, and approve the sign-in.
Cursor
cursor://anysphere.cursor-deeplink/mcp/install?name=property-shared&config=eyJ1cmwiOiJodHRwczovL3Byb3BlcnR5LXNoYXJlZC5mbHkuZGV2L21jcCJ9Open the link and Cursor adds the server at that address.
ChatGPT
https://property-shared.fly.dev/mcpIn Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.
Codex
codex mcp add property-shared --url 'https://property-shared.fly.dev/mcp'Run it once, then sign in with codex mcp login property-shared if the server asks for an account.
From the project's README
As published by paulieb89/property-shared in README.md.
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 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 |
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. paul@bouch.dev
Use as MCP Server
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"
}
}
}
Install
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
Use as a Python Library
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
Use as CLI
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.
Use as HTTP API
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/reportwith{ "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/Apartmentdesignator 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_removedandunusable_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:
| 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.
Development
# 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.
Tools it offers (14)
What this server listed when Ahel dialed its public endpoint in Sep 2026, with no key and no account of yours. The names are the server’s own.
property_compsproperty_yieldrental_analysisproperty_epcproperty_epc_searchproperty_epc_summariesepc_certificatestamp_dutyrightmove_searchrightmove_listingproperty_blockscompany_searchplanning_searchppd_transactions
Signals
- GitHub stars
- 16
- Forks
- 4
- Last commit
- Sep 2026
Advanced
- Delivery
- property-shared MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
- Item type
- mcp-server
- Key
io-github-paulieb89-property-shared- Source
- github.com/paulieb89/property-shared
- Hosted endpoint
https://property-shared.fly.dev/mcp
github.com/paulieb89/property-shared