OpenProperties MCP server

OpenProperties is also a Model Context Protocol (MCP) server. AI assistants such as Claude, ChatGPT, Cursor and VS Code can use it to search, read and summarise every HM Land Registry Price Paid Data sale in England and Wales: a property's sale history, the sales in a postcode, sector or district, sales near a place, and price statistics for an area. It is read-only, needs no key, account or sign-in, and serves the same data, under the same licence, as the rest of this site.

Server URL
https://openproperties.uk/mcp
Transport
Streamable HTTP
Authentication
None
Version
1.0.0

Connect

Every client needs only the server URL. When a client asks how to authenticate, choose no authentication.

Claude (claude.ai, Desktop and mobile)

Add OpenProperties to Claude opens the Add custom connector dialog with the name and URL filled in; check them and click Add.

To add it by hand, go to Customize, then Connectors, and click Add custom connector. Enter the name OpenProperties and the URL https://openproperties.uk/mcp, and if the dialog asks about authentication, choose No sign-in. The connector then works in the Claude apps on desktop and mobile too. On Team and Enterprise plans an Owner adds it for everyone under Organization settings, Connectors, Add, Custom, Web (or with the prefilled admin link).

Claude Code

claude mcp add --transport http openproperties https://openproperties.uk/mcp

Add --scope project to share it through the project's .mcp.json, which looks like this:

{
  "mcpServers": {
    "openproperties": {
      "type": "http",
      "url": "https://openproperties.uk/mcp"
    }
  }
}

Prompts appear as slash commands such as /mcp__openproperties__area_report, and resources can be attached with @openproperties:.

ChatGPT

Turn on developer mode under Settings, Security and login, Developer mode. Then go to chatgpt.com/plugins, select the plus button, give it a name and description, enter https://openproperties.uk/mcp as the connection URL with no authentication, and create it. The search and fetch tools follow OpenAI's contract, so deep research can use them and cite openproperties.uk pages.

Cursor

Add to Cursor, or put this in ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "openproperties": {
      "url": "https://openproperties.uk/mcp"
    }
  }
}

VS Code

Install in VS Code, or add it to .vscode/mcp.json (the top-level key is servers):

{
  "servers": {
    "openproperties": {
      "type": "http",
      "url": "https://openproperties.uk/mcp"
    }
  }
}

From a terminal:

code --add-mcp '{"name":"openproperties","type":"http","url":"https://openproperties.uk/mcp"}'

OpenAI Codex

codex mcp add openproperties --url https://openproperties.uk/mcp

or in ~/.codex/config.toml:

[mcp_servers.openproperties]
url = "https://openproperties.uk/mcp"

Codex uses tools only, not prompts or resources.

Gemini CLI

gemini mcp add --transport http openproperties https://openproperties.uk/mcp

or in ~/.gemini/settings.json, where httpUrl (not url) selects Streamable HTTP:

{
  "mcpServers": {
    "openproperties": {
      "httpUrl": "https://openproperties.uk/mcp"
    }
  }
}

Windsurf (Devin Desktop)

Add it to mcp_config.json, which is at ~/.config/devin/mcp_config.json on macOS and Linux and %APPDATA%\devin\mcp_config.json on Windows:

{
  "mcpServers": {
    "openproperties": {
      "serverUrl": "https://openproperties.uk/mcp"
    }
  }
}

Zed

Use Settings, AI, MCP Servers, Add Server, Add Remote Server, or add it to your settings file:

{
  "context_servers": {
    "openproperties": {
      "url": "https://openproperties.uk/mcp"
    }
  }
}

Zed uses tools and prompts.

Goose

Run goose configure and add a remote extension (Streamable HTTP), or add it to ~/.config/goose/config.yaml:

extensions:
  openproperties:
    name: OpenProperties
    type: streamable_http
    uri: https://openproperties.uk/mcp
    enabled: true
    timeout: 300

For one session only:

goose session --with-streamable-http-extension "https://openproperties.uk/mcp"

MCP Inspector

To explore the server by hand, start the Inspector, choose Streamable HTTP and paste the URL:

npx @modelcontextprotocol/inspector

or use its command line (add --protocol-era modern to try the 2026-07-28 protocol):

npx @modelcontextprotocol/inspector --cli --transport http --server-url https://openproperties.uk/mcp --method tools/list

Clients that only run local servers

A client that can only start local (stdio) servers can reach OpenProperties through mcp-remote:

{
  "mcpServers": {
    "openproperties": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://openproperties.uk/mcp",
        "--transport",
        "http-only"
      ]
    }
  }
}

Things to ask

  • What has 165 Stonhouse Street, SW4 6AJ sold for over the years?
  • How have flat prices in SW4 moved since 2015, and how many sold each year?
  • Compare house prices in PL7 2 and PL7 4 by property type.
  • What has sold within 500 metres of M1 1AE in the last two years?
  • Which streets in the SW4 postcode district have the most recorded sales?
  • How up to date is the data, and what does it leave out?

Tools

14 tools, all read-only but send_feedback. Each returns structured data, repeated as JSON text, with openproperties.uk links to cite. Tools marked heavy share a small number of slots (see limits).

ToolWhat it does
Search properties
search_properties heavy
Find properties by postcode, street name or town, as the search box on openproperties.uk does.
Look up an address
lookup_address
Resolve one address to its property and full sale history in a single call. Drawn as a price chart in apps that support MCP Apps.
Property sale history
get_property
Every recorded sale of one property, newest first, with its address, postcode(s), location and sale count. Drawn as a price chart in apps that support MCP Apps.
Sale by transaction id
get_sale
One sale, by HM Land Registry's transaction id (a GUID, with or without braces).
List sales in an area
list_sales heavy for a sector or district
Individual sales in a postcode, a postcode sector or a postcode district, optionally on one street, filtered by date, price, property type, tenure, new build and category, sorted by date or price.
Sales near a place
find_nearby_sales heavy
Sales within a radius of a postcode, or of a latitude and longitude, with each sale's distance, across district and street boundaries, which list_sales cannot cross.
Price statistics for an area
get_price_statistics heavy
Sale price statistics (count, mean, median, quartiles, min and max) for a postcode, a postcode sector ("SW4 6", a few hundred homes), a postcode district, or one street in it, overall and grouped by year, property type, tenure or new build. Drawn as a price chart in apps that support MCP Apps.
List postcode districts
list_districts
Every postcode district with recorded sales, e.g.
Streets in a district
list_district_streets
Every street with recorded sales in a postcode district, with its property and sale counts.
Properties on a street
list_street_properties
Every property with recorded sales on one street in a postcode district, in house-number order, with its sale count and last sale.
Get data status
get_dataset_status
Report how current and complete the data is: record counts, when each source was last loaded, the first and latest sale dates, what the codes mean, what is not held, and the coverage caveats.
Search (connector)
search heavy
Search OpenProperties by postcode, street, town, postcode district or transaction id.
Fetch record (connector)
fetch
Fetch the full record for an id from search or other results: property:{address path} (e.g. property:sw4/stonhouse-street/165), sale:{transaction id}, street:{district}/{street} or district:{district} (e.g. district:SW4).
Send feedback
send_feedback
Ask the user first: show them the note as you will send it, and send it only once they agree, with user_agreed true.

Prompts

Prompts are ready-made tasks that your client may offer as commands. Each asks the assistant to use the tools above, cite its sources and pass on the caveats that apply.

PromptWhat it doesArguments
Sale history of a property
property_history
The story of one address: every recorded sale, and how its price moved between them. address
Housing-market report for an area
area_report
Prices, volumes and the mix of what sells in a postcode, district or street, year by year. area
property_type (optional)
since (optional)
Compare two areas
compare_areas
Two postcodes, districts or streets side by side: prices, volumes and property mix. area_a
area_b
property_type (optional)
since (optional)
Recent comparable sales
recent_comparables
Recent sales of similar properties near an address: context, not a valuation. address
years (optional)

Resources

Resources are documents a client can attach to a conversation. Their addresses are the same https URLs a browser opens, and reading one returns what the site serves: every page's JSON, the document you get by adding .json to its URL, is a resource too. Every postcode district is listed; the levels below it are reached through the templates.

Documents

ResourceWhat it holds
OpenProperties data guide
https://openproperties.uk/mcp/guide.md
What the data holds, how properties and address paths work, where to start, the caveats, the licence, and feedback.
Data status
https://openproperties.uk/mcp/status.json
Record counts, when each source was last loaded, coverage and the codes, as get_dataset_status returns them.
Price chart
ui://openproperties/price-chart
The MCP Apps view that draws a property's sale history or an area's price statistics.

Records by address

TemplateWhat it holds
Postcode district
https://openproperties.uk/{outcode}.json
Every street with recorded sales in a postcode district, e.g. outcode "sw4". Each part is lowercase, with every run of punctuation and spaces as one hyphen, as the site's URLs spell it.
Street
https://openproperties.uk/{outcode}/{street}.json
Every property with recorded sales on one street, e.g. "sw4" / "stonhouse-street". Each part is lowercase, with every run of punctuation and spaces as one hyphen, as the site's URLs spell it.
Property
https://openproperties.uk/{outcode}/{street}/{house}.json
Every recorded sale of one property, e.g. "sw4" / "stonhouse-street" / "165". Each part is lowercase, with every run of punctuation and spaces as one hyphen, as the site's URLs spell it.
Property within a building
https://openproperties.uk/{outcode}/{street}/{house}/{flat}.json
Every recorded sale of one flat or unit, e.g. "sw1a" / "downing-street" / "10" / "flat-2". Each part is lowercase, with every run of punctuation and spaces as one hyphen, as the site's URLs spell it.

Try it with curl

The server is stateless, so every request stands on its own. A modern (2026-07-28) request carries its protocol version and client capabilities in params._meta and repeats the version, method and tool name in headers. A legacy client starts with initialize; later requests name the agreed version in the MCP-Protocol-Version header and need no session id, because none is ever issued.

Modern (2026-07-28): ask the server what it supports

curl -s https://openproperties.uk/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: server/discover' \
  -d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{},"io.modelcontextprotocol/clientInfo":{"name":"curl","version":"1.0.0"}}}}'

Modern (2026-07-28): call get_property for sw4/stonhouse-street/165

curl -s https://openproperties.uk/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: tools/call' \
  -H 'Mcp-Name: get_property' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_property","arguments":{"address_path":"sw4/stonhouse-street/165"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{},"io.modelcontextprotocol/clientInfo":{"name":"curl","version":"1.0.0"}}}}'

Legacy (2025-11-25): the initialize handshake

curl -s https://openproperties.uk/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Legacy (2025-11-25): list the tools (no session to carry over)

curl -s https://openproperties.uk/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

Every answer is a single JSON response; there is no event stream.

Limits and fair use

  • Lists come a page at a time. Pass the next_cursor from one page as cursor to get the next. A search stops after 1,200 properties, a list of sales after 5,000, and a district's streets or a street's properties after 1,000; narrow the query to go further. A postcode district is the widest area any tool takes.
  • Totals stop counting at 1,000 where the tool has not already counted them, and total_is_capped says so.
  • Each database query may run for 8 seconds, and each tool call for 20 seconds in all. A query that runs out of time returns a message suggesting how to narrow it.
  • Tools marked heavy in the tools table run at most 2 at a time across the whole site. When they are all busy you get a short "busy" message; try again a few seconds later.
  • A tool result is at most 60,000 characters, a resource at most 1 MiB, and a request body at most 64 KiB. A legacy batch holds at most 10 messages.
  • Please keep automated use gentle, a few requests a second at most. Heavy traffic may be rate limited.
  • Please cache what you fetch. For work across the whole dataset, use HM Land Registry's bulk files rather than paging through the MCP server.

Data caveats

  • England and Wales only. Scotland and Northern Ireland are not covered.
  • Only sales for value lodged with HM Land Registry are recorded. Transfers that are not sales at full market value (gifts, transfers on divorce, right-to-buy sales at a discount, transfers under a court order) are not.
  • Prices are whole pounds as recorded, not adjusted for inflation.
  • A property is the set of sales recorded at one normalised address. It is an exact match on the address as recorded, so a re-spelling between two sales splits one building into two properties, and two dwellings recorded identically merge into one.
  • Category B entries (from 14 October 2013) are repossessions, buy-to-let purchases identifiable by a mortgage, and transfers to non-private buyers such as companies. They can distort averages, so the statistics leave them out unless asked.
  • Coordinates are the centre of the postcode (OS Code-Point Open), which usually covers a dozen or more addresses, never the building itself.
  • A sale appears only once it has been registered, which can take weeks or months after completion, so the most recent months are always incomplete.
  • Not held. Sales in Scotland and Northern Ireland; Transfers that were not sales at full market value; Floor area, bedrooms, condition, plot size or any other description of the home; Buyers' and sellers' names, and mortgages; Asking prices, valuations and rents; A position for each building: only the centre of its postcode; UPRNs and INSPIRE ids, which are archived from the monthly look-up tables but not served.

The data guide explains them in full, with how address paths work and what the codes mean, and status.json says how current each part is.

Feedback

send_feedback lets an assistant send the people who run OpenProperties a short note about these tools: something no tool could answer, an answer that was wrong or confusing, or an error that did not say what would work. Its description tells the assistant to show you the note and send it only once you agree.

What is kept: the note, its kind, the tool it names, the client's name and version, the protocol and server versions, and the time. Never your IP address: only a keyed hash of it, to limit each address to 10 notes a day. A note holding an email address, an IP address or a web address with a query string is refused. Notes are read only by the people who run OpenProperties, and deleted after 365 days.

Protocol

  • One endpoint, https://openproperties.uk/mcp, speaking Streamable HTTP over POST.
  • Modern clients use protocol version 2026-07-28: no handshake, per-request _meta, server/discover, and the MCP-Protocol-Version, Mcp-Method and Mcp-Name headers.
  • Legacy clients use initialize with 2025-11-25, 2025-06-18 or 2025-03-26. A legacy request without the MCP-Protocol-Version header is treated as 2025-03-26, the only revision that allows batches (up to 10 messages). Older revisions never see fields added after them.
  • Stateless: no sessions, no Mcp-Session-Id, no cookies and no GET stream. A GET from an MCP client gets 405; a browser gets this page.
  • Every answer is a single JSON response but one: a modern client's subscriptions/listen gets a short event stream that acknowledges it and ends at once, since nothing is ever pushed.
  • Tools, resources, prompts and completions, and the MCP Apps extension for the price chart. No logging, resource subscriptions, change notifications, sampling, elicitation or tasks.
  • No OAuth and no API keys: the server never asks a client to sign in. Requests from every origin are allowed (CORS).
  • Discovery documents: the server card and the AI catalog. The site's source also holds a server.json for the official MCP Registry.
Instructions the server gives the assistant
OpenProperties serves HM Land Registry Price Paid Data (Open Government Licence v3.0): every recorded sale of a residential property in England and Wales since 1995, with price, date, address, property type and tenure. A property is identified by its address path, e.g. sw4/stonhouse-street/165 (postcode district/street/house, then flat), and a sale by HM Land Registry's transaction id, a GUID.

It holds the sales, the properties they belong to (one per normalised address), postcode-centre locations, and price statistics for a full postcode, a sector (SW4 6), a district (SW4) or a street.

Coverage: England and Wales; sales for value only; prices nominal; the latest months are incomplete until registered. Statistics leave out category B entries (repossessions, buy-to-lets, company buyers) unless asked. Locations are postcode centres, not buildings. The guide (https://openproperties.uk/mcp/guide.md) has every caveat.

Lists are capped and paged; pass next_cursor back as cursor for more. A postcode district is the widest area any tool takes.

Where to start: lookup_address or search_properties for an address, then get_property; get_price_statistics and list_sales for an area; find_nearby_sales around a point; get_dataset_status for freshness.

Cite the openproperties.uk links in results, and give the attribution: Contains HM Land Registry data © Crown copyright and database right. Licensed under the Open Government Licence v3.0.

If no tool can answer what the user asked, or an answer looks wrong, offer to tell OpenProperties with send_feedback, and send it only once the user agrees.

Licence and attribution

The data is HM Land Registry Price Paid Data, reused under the Open Government Licence v3.0. When you publish something built from it, include this attribution: Contains HM Land Registry data © Crown copyright and database right. This data is licensed under the Open Government Licence v3.0. Where a postcode location is used, add: Contains OS data © Crown copyright and database right. Tool results carry the attribution that applies in every answer.

OpenProperties is an independent project and is not affiliated with HM Land Registry. HM Land Registry's own records are the authoritative source: where anything here differs from them, they take precedence.

OpenCommons

OpenProperties is one of the OpenCommons sites. Their MCP servers keep one contract (identity, paging, results, errors and feedback), so an assistant connected to more than one finds the same conventions in each. Where a record has a counterpart on another of the sites, its result links to it under external_links.

  • OpenCharities, UK charities from the three regulators' registers: England and Wales, Scotland and Northern Ireland: https://opencharities.uk/mcp
  • OpenCompanies, UK companies, officers, owners and accounts from Companies House: https://opencompanies.uk/mcp
  • OpenPostcodes, every live UK postcode from the ONS Postcode Directory, with its location, geographies and nearest services: https://openpostcodes.uk/mcp