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).
| Tool | What it does |
|---|---|
Search propertiessearch_ heavy |
Find properties by postcode, street name or town, as the search box on openproperties.uk does. |
Look up an addresslookup_ |
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 historyget_ |
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 idget_ |
One sale, by HM Land Registry's transaction id (a GUID, with or without braces). |
List sales in an arealist_ 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 placefind_ 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 areaget_ 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 districtslist_ |
Every postcode district with recorded sales, e.g. |
Streets in a districtlist_ |
Every street with recorded sales in a postcode district, with its property and sale counts. |
Properties on a streetlist_ |
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 statusget_ |
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 feedbacksend_ |
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.
| Prompt | What it does | Arguments |
|---|---|---|
Sale history of a propertyproperty_ |
The story of one address: every recorded sale, and how its price moved between them. | address |
Housing-market report for an areaarea_ |
Prices, volumes and the mix of what sells in a postcode, district or street, year by year. | areaproperty_ (optional)since (optional) |
Compare two areascompare_ |
Two postcodes, districts or streets side by side: prices, volumes and property mix. | area_area_property_ (optional)since (optional) |
Recent comparable salesrecent_ |
Recent sales of similar properties near an address: context, not a valuation. | addressyears (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
| Resource | What it holds |
|---|---|
OpenProperties data guidehttps:// |
What the data holds, how properties and address paths work, where to start, the caveats, the licence, and feedback. |
Data statushttps:// |
Record counts, when each source was last loaded, coverage and the codes, as get_dataset_status returns them. |
Price chartui:// |
The MCP Apps view that draws a property's sale history or an area's price statistics. |
Records by address
| Template | What it holds |
|---|---|
Postcode districthttps:// |
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. |
Streethttps:// |
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. |
Propertyhttps:// |
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 buildinghttps:// |
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_cursorfrom one page ascursorto 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_cappedsays 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 theMCP-Protocol-Version,Mcp-MethodandMcp-Nameheaders. - Legacy clients use
initializewith 2025-11-25, 2025-06-18 or 2025-03-26. A legacy request without theMCP-Protocol-Versionheader 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/listengets 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.jsonfor 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