Koskamo

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.

UK Property MCP logo, by BOUCH B BOUCH / WORKSCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by BOUCH B BOUCH / WORKS
MCP endpoint (Streamable HTTP)
https://property-shared.fly.dev/mcp
Vendor documentation

What its tools do

14 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

14 of 14 have a description · 14 of 14 declare behavior hints · 1 of 14 with parameters document them all

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

Community listingRegistry 1.5.1
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
Server-advertised capabilities
{
  "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.

UK property data tools. For a comprehensive single-property analysis, invoke the `full_property_analysis` prompt — it instructs you to call property_comps, property_yield, property_epc and rightmove_search and synthesise. For postcode-only data fetches use property_comps and property_yield separately. ppd_transactions for recent transactions at a postcode -- bounded by the stated coverage in each response's `provenance`, never a full property history; an empty result means 'no sales in coverage', not 'never sold'. rightmove_search to browse listings by postcode, rightmove_listing for full detail on one listing, property_epc for energy certificates, rental_analysis for rental market figures, stamp_duty for SDLT, property_blocks for block-buy analysis, planning_search for council planning portals, company_search to find a company by name. Price Paid Data: contains HM Land Registry data (c) Crown copyright and database right, licensed under the Open Government Licence v3.0; see GET /v1/meta.

Tools

14 advertised

property_comps
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

property_comps input schema
{
  "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
}
property_comps output schema
{
  "type": "object",
  "additionalProperties": true
}
property_comps annotations
{
  "readOnlyHint": true
}
property_yield
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

property_yield input schema
{
  "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
}
property_yield output schema
{
  "type": "object",
  "additionalProperties": true
}
property_yield annotations
{
  "readOnlyHint": true
}
rental_analysis
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

rental_analysis input schema
{
  "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
}
rental_analysis output schema
{
  "type": "object",
  "additionalProperties": true
}
rental_analysis annotations
{
  "readOnlyHint": true
}
property_epc
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

property_epc input schema
{
  "type": "object",
  "required": [
    "postcode"
  ],
  "properties": {
    "address": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "postcode": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
property_epc output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "x-fastmcp-wrap-result": true
}
property_epc annotations
{
  "readOnlyHint": true
}
property_epc_search
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

property_epc_search input schema
{
  "type": "object",
  "required": [
    "postcode"
  ],
  "properties": {
    "postcode": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
property_epc_search output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "x-fastmcp-wrap-result": true
}
property_epc_search annotations
{
  "readOnlyHint": true
}
property_epc_summaries
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

property_epc_summaries input schema
{
  "type": "object",
  "required": [
    "postcode"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "default": 1
    },
    "postcode": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
property_epc_summaries output schema
{
  "type": "object",
  "additionalProperties": true
}
property_epc_summaries annotations
{
  "readOnlyHint": true
}
epc_certificate
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

epc_certificate input schema
{
  "type": "object",
  "required": [
    "lmk_key"
  ],
  "properties": {
    "lmk_key": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
epc_certificate output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "x-fastmcp-wrap-result": true
}
epc_certificate annotations
{
  "readOnlyHint": true
}
stamp_duty
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

stamp_duty input schema
{
  "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
}
stamp_duty output schema
{
  "type": "object",
  "additionalProperties": true
}
stamp_duty annotations
{
  "readOnlyHint": true
}
rightmove_search
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

rightmove_search input schema
{
  "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
}
rightmove_search output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    }
  },
  "x-fastmcp-wrap-result": true
}
rightmove_search annotations
{
  "readOnlyHint": true
}
rightmove_listing
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

rightmove_listing input schema
{
  "type": "object",
  "required": [
    "property_id"
  ],
  "properties": {
    "max_images": {
      "type": "integer",
      "default": 3
    },
    "property_id": {
      "type": "string"
    },
    "include_images": {
      "type": "boolean",
      "default": false
    }
  },
  "additionalProperties": false
}
rightmove_listing annotations
{
  "readOnlyHint": true
}
property_blocks
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

property_blocks input schema
{
  "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
}
property_blocks output schema
{
  "type": "object",
  "additionalProperties": true
}
property_blocks annotations
{
  "readOnlyHint": true
}
company_search
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search Companies House for a company by name.

company_search input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
company_search output schema
{
  "type": "object",
  "additionalProperties": true
}
company_search annotations
{
  "readOnlyHint": true
}
planning_search
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find the council planning portal URL for a postcode.

planning_search input schema
{
  "type": "object",
  "required": [
    "postcode"
  ],
  "properties": {
    "postcode": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
planning_search output schema
{
  "type": "object",
  "additionalProperties": true
}
planning_search annotations
{
  "readOnlyHint": true
}
ppd_transactions
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

ppd_transactions input schema
{
  "type": "object",
  "required": [
    "postcode"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10
    },
    "postcode": {
      "type": "string"
    },
    "property_type": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "additionalProperties": false
}
ppd_transactions output schema
{
  "type": "object",
  "additionalProperties": true
}
ppd_transactions annotations
{
  "readOnlyHint": true
}

Prompts

3 advertised

investment_analysis

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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_list_resource URI
councils://list

MIME type: text/plain

sdlt_bands_resource

Advertised by the server during the last successful anonymous check.

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_resource URI
sdlt-bands://current

MIME type: text/plain

epc_ratings_resource

Advertised by the server during the last successful anonymous check.

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_resource URI
epc-ratings://reference

MIME type: text/plain

council_resource

Advertised by the server during the last successful anonymous check.

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_resource URI template
council://{code}

MIME type: text/plain

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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http uk-property-mcp-fly https://property-shared.fly.dev/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add uk-property-mcp-fly --url https://property-shared.fly.dev/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable uk-property-mcp-fly in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "uk-property-mcp-fly": {
      "url": "https://property-shared.fly.dev/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "uk-property-mcp-fly": {
      "type": "streamableHttp",
      "url": "https://property-shared.fly.dev/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start uk-property-mcp-fly and inspect its tools.
VS Code configuration
{
  "servers": {
    "uk-property-mcp-fly": {
      "type": "http",
      "url": "https://property-shared.fly.dev/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http uk-property-mcp-fly https://property-shared.fly.dev/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://property-shared.fly.dev/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.