UK Property MCP
An open-source MCP server that aggregates UK property data from six public sources including HM Land Registry, EPC Register, Rightmove, Companies House, and council planning portals to provide comparables, yields, and stamp duty information.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://property-shared.fly.dev/mcpWhat its tools do
14 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Retrieve Land Registry Price Paid Data
- Access EPC Register records
- Fetch Rightmove listings
- Check Companies House data
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- property-data 1.19.1
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 14 advertised
- Resources
- 3 advertised
- Resource templates
- 1 advertised
- Prompts
- 3 advertised
{
"tools": {
"listChanged": true
},
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": false,
"listChanged": true
},
"extensions": {
"io.modelcontextprotocol/ui": {}
},
"experimental": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
14 advertised
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.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"limit": {
"type": "integer",
"default": 50
},
"months": {
"type": "integer",
"default": 24,
"minimum": 1,
"description": "Number of calendar months ending today; default 24. Results are limited to available coverage."
},
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"postcode": {
"type": "string"
},
"enrich_epc": {
"type": "boolean",
"default": false
},
"search_level": {
"type": "string",
"default": "sector"
},
"property_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"filter_outliers": {
"type": "boolean",
"default": false
},
"transaction_category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": "A"
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}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.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"months": {
"type": "integer",
"default": 24,
"minimum": 1,
"description": "Number of calendar months ending today; default 24. Results are limited to available coverage."
},
"postcode": {
"type": "string",
"description": "UK postcode (e.g. \"NG1 2NS\")."
},
"search_level": {
"type": "string",
"default": "sector",
"description": "PPD search granularity — \"postcode\", \"sector\" (default),\nor \"district\"."
},
"auto_escalate": {
"type": "boolean",
"default": true,
"description": "Compatibility parameter. Does NOT widen the search area on\nthe live source (see `warnings`); previously postcode→\nsector→district. Default True. Set False for strict-locality only."
},
"property_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter sales by type. None (default) = residential set\n(F+D+S+T). Pass \"F\"/\"D\"/\"S\"/\"T\"/\"O\" for one type, \"ALL\" for firehose."
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}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.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"radius": {
"type": "number",
"default": 0.5
},
"postcode": {
"type": "string"
},
"auto_escalate": {
"type": "boolean",
"default": true
},
"purchase_price": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}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.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"postcode": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"x-fastmcp-wrap-result": true
}{
"readOnlyHint": true
}property_epc_search
DEPRECATED — use property_epc_summaries then epc_certificate. This tool returned score, floor_area, property_type, habitable_rooms and inspection_date for every certificate at a postcode. The EPC service no longer exposes those fields in a search: they exist only on a full certificate. Reproducing the old response would require one upstream request per certificate, so this tool is unsupported rather than silently degraded or silently expensive.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"postcode": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
{
"type": "null"
}
]
}
},
"x-fastmcp-wrap-result": true
}{
"readOnlyHint": true
}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.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"page": {
"type": "integer",
"default": 1
},
"postcode": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}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.
{
"type": "object",
"required": [
"lmk_key"
],
"properties": {
"lmk_key": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"x-fastmcp-wrap-result": true
}{
"readOnlyHint": true
}stamp_duty
UK Stamp Duty Land Tax (SDLT) calculation with full breakdown.
{
"type": "object",
"required": [
"price"
],
"properties": {
"price": {
"type": "integer"
},
"non_resident": {
"type": "boolean",
"default": false
},
"first_time_buyer": {
"type": "boolean",
"default": false
},
"additional_property": {
"type": "boolean",
"default": false
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}rightmove_search
Fetch Rightmove listings for a postcode. listing_type: "sale" or "rent". sort_by: "newest", "most_reduced", "price_asc", "price_desc". Images are excluded from results.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"radius": {
"type": "number",
"default": 0.5
},
"sort_by": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"postcode": {
"type": "string"
},
"max_pages": {
"type": "integer",
"default": 3
},
"max_price": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"listing_type": {
"type": "string",
"default": "sale"
},
"min_bedrooms": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"property_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"x-fastmcp-wrap-result": true
}{
"readOnlyHint": true
}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.
{
"type": "object",
"required": [
"property_id"
],
"properties": {
"max_images": {
"type": "integer",
"default": 3
},
"property_id": {
"type": "string"
},
"include_images": {
"type": "boolean",
"default": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true
}property_blocks
Property block analysis — identify buildings with multiple flat sales (block-buy opportunities).
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"months": {
"type": "integer",
"default": 24,
"minimum": 1,
"description": "Number of calendar months ending today; default 24. Results are limited to available coverage."
},
"postcode": {
"type": "string"
},
"search_level": {
"type": "string",
"default": "sector"
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}company_search
Search Companies House for a company by name.
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}planning_search
Find the council planning portal URL for a postcode.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"postcode": {
"type": "string"
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}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`.
{
"type": "object",
"required": [
"postcode"
],
"properties": {
"limit": {
"type": "integer",
"default": 10
},
"postcode": {
"type": "string"
},
"property_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}{
"type": "object",
"additionalProperties": true
}{
"readOnlyHint": true
}Prompts
3 advertised
investment_analysis
Evaluate a UK property as a buy-to-let investment. Calls comps + yield + EPC + stamp duty, then synthesises a yield + tax + risk summary. Defaults assume an investor (additional_property=true).
- address
- Provide as a JSON string matching the following schema: {"type":"string"} (required)
- postcode
- Provide as a JSON string matching the following schema: {"type":"string"} (required)
- purchase_price
- Provide as a JSON string matching the following schema: {"type":"string"} (required)
- additional_property
- Provide as a JSON string matching the following schema: {"type":"string"}
- first_time_buyer
- Provide as a JSON string matching the following schema: {"type":"string"}
- non_resident
- Provide as a JSON string matching the following schema: {"type":"string"}
area_comparison
Compare 2-3 UK postcodes side-by-side for area-level investment evaluation. Postcodes passed as a comma-separated string (e.g. "NG1 2NS, DE12 7DH").
- postcodes
- Provide as a JSON string matching the following schema: {"type":"string"} (required)
- months
- Provide as a JSON string matching the following schema: {"type":"string"}
full_property_analysis
Comprehensive UK property analysis — composes comps, yield, EPC, asking prices, then synthesises. This is a workflow prompt, not a single API call. The LLM follows the instructions below to call the four primitive tools and synthesise the results explicitly, so every input is visible in the conversation.
- address
- Provide as a JSON string matching the following schema: {"type":"string"} (required)
- postcode
- Provide as a JSON string matching the following schema: {"type":"string"} (required)
- months
- Provide as a JSON string matching the following schema: {"type":"string"}
Resources
3 advertised
councils_list_resource
Return the 99-council UK planning portal registry as JSON. Static reference data sourced from property_core/planning_councils.json. Lets callers read the full registry once instead of calling planning_search for individual lookups.
councils://listsdlt_bands_resource
Return the current UK Stamp Duty Land Tax band schedule as JSON. Static reference data matching `property_core/stamp_duty.py` exactly. Lets an LLM cite the bands directly without calling the stamp_duty calculator.
sdlt-bands://currentepc_ratings_resource
Return EPC band definitions and score ranges as JSON. Canonical reference for UK domestic Energy Performance Certificate bands (A best, G worst), with SAP score ranges and one-line meanings. Grounds LLM explanations of EPC results in published reference data rather than training-data recall.
epc-ratings://referencecouncil_resource
Return a single council's record as JSON, keyed by its code/slug. Looks up the council in property_core/planning_councils.json. Raises ValueError if the code is unknown so callers see a clear error rather than a misleading empty result.
council://{code}30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1114 ms
- 95th percentile latency
- 1114 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1114 ms · metadata changed · 14 tool(s), 3 resource(s), 1 resource template(s), 3 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http uk-property-mcp-fly https://property-shared.fly.dev/mcpCodex
codex mcp add uk-property-mcp-fly --url https://property-shared.fly.dev/mcpCursor
{
"mcpServers": {
"uk-property-mcp-fly": {
"url": "https://property-shared.fly.dev/mcp"
}
}
}Cline
{
"mcpServers": {
"uk-property-mcp-fly": {
"type": "streamableHttp",
"url": "https://property-shared.fly.dev/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"uk-property-mcp-fly": {
"type": "http",
"url": "https://property-shared.fly.dev/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http uk-property-mcp-fly https://property-shared.fly.dev/mcpClaude Desktop
https://property-shared.fly.dev/mcpWindsurf
{
"mcpServers": {
"uk-property-mcp-fly": {
"serverUrl": "https://property-shared.fly.dev/mcp"
}
}
}Let your agent find its tools
Find servers like UK Property MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.