tool · mcp server
uk land registry mcp
thirty years of every property sale in england and wales, handed to claude as eighteen tools — and taught when to refuse to answer.
the land registry publishes all of this already. the problem is shape: sold prices come out of a sparql endpoint, the index is a linked-data cube, and company ownership is a 300mb monthly csv with no query api at all. so the server does the joining — you ask in english, it picks the endpoint, and every number below came back from a live query while this page was being written.
- 18tools
- ~30Mtransactions
- 1995records from
- 0keys to start
what it does
eighteen tools, four questions
install it and your assistant can answer four kinds of question about property in england and wales — what something sold for, how prices have moved, which company owns what, and what sits around a plot. ask in plain english; the server picks the endpoint, writes the query and hands back a table.
what it sold for
3 toolsevery sale registered since 1995 — one address’s full history with the appreciation worked out, everything that changed hands on a street or in a postcode, or the median, mean and type breakdown for a whole district.
- what did 14 manvers street, bath sell for?
- what sold on this street in 2023?
- median flat price in ts1 2 last year, against the year before
how prices moved
3 toolsthe official house price index — mix-adjusted, so it is not thrown by which houses happened to sell. sliceable by property type, first-time-buyer status and cash-versus-mortgage, and it will restate an old price in any later month’s money.
- how has middlesbrough tracked against england?
- first-time buyer prices in wales over five years
- £185,000 in march 2017 — what is that today?
who owns it
4 toolsthe corporate and overseas ownership registers: titles held by a named company, every corporately-owned title in an area, and overseas holdings broken down by jurisdiction of incorporation. companies only — property held by individuals is not published in bulk.
- what does this company own in england and wales?
- who owns property in sw1 through offshore companies?
- which jurisdictions own the most in westminster?
what surrounds it
5 toolsinspire title boundaries — a parcel’s geometry and area, what adjoins it, everything inside a radius filtered by size — plus registered lease and restrictive-covenant flags against a title. the polygons are indicative, not legal boundaries.
- how big is this plot, and what adjoins it?
- any corporately-owned land within 50m?
- does this title carry a restrictive covenant?
three more tools do the plumbing: postcode → coordinates, district and ward; a status call that reports what is cached and what to fetch next; and the downloader for the bulk datasets. three bundled prompts wrap the common jobs — a due-diligence report on an address, an ownership investigation, a site analysis.
with a key, and without
the two halves
the split is not a paywall — it is how hm land registry publishes. sold prices and the index are live query endpoints, so those tools work the moment you install. ownership and boundaries ship only as monthly bulk files with no query api, so they need a free key and a one-off download that lands in a local duckdb cache. everything runs on your machine over stdio; nothing leaves it but the government queries.
straight out of the box
nothing to sign up for
sold prices, the house price index and postcode lookups are live query endpoints — the server talks to them directly, so they answer the moment you have installed it. no key, no download, no waiting: the question goes out as sparql and the table comes back.
- every registered sale in england and wales since 1995
- one address’s history, with the appreciation worked out
- medians and type breakdowns for a street, postcode or district
- the official index, and old prices restated in today’s money
“what did 52 coates avenue, ts4 3aq sell for?”
52 COATES AVENUE, TS4 3AQ — 2 registered sales
29 jul 2022 £186,100 — —
20 apr 2026 £195,000 +4.8% +1.3%/yrone round trip to the land registry’s sparql endpoint, no local state at all.
with a free land registry key
registration, plus one download per dataset
ownership, boundaries and the due-diligence flags are published only as monthly bulk files — there is no query api to point at. so the key is not a paywall, it is a licence acceptance: you register, tick the licence for each dataset, and the server pulls that file down once into a local duckdb cache. after that the queries are local and fast, and the datasets refresh monthly whenever you ask it to.
- which companies — uk or overseas — hold title in an area
- everything one named company owns, nationwide
- overseas holdings ranked by jurisdiction of incorporation
- a plot’s boundary, its area, and what adjoins it
- registered lease and restrictive-covenant flags on a title
“who owns property in sw1 through offshore companies?”
→ hmlr_data_status ocod cached · july 2026
→ hmlr_search_ownership_by_area
title · proprietor · country of incorporationanswered from the local cache — the shape of the return, not a live figure. ask the server for the actual numbers.
one flat, twenty-three years
the flat that never caught up
flat 34, connaught mansions — a georgian block on great pulteney street in bath. five sales since 1995. the black line is what it actually changed hands for; the pink line is that first £170,000 carried forward on bath and north east somerset's own house price index. they part in 2006 and never rejoin.
- +210.6%over 22.87 years
- +5.1%a year, compounded
- −32%below the local index
the gap is the finding, not the explanation. a shortening lease, the condition of one flat, or simply a 1998 sale struck above the going rate would each produce this shape — and indexing from a single transaction inherits whatever that transaction got wrong. the server reports the divergence and stops there.
the market around it
bath, and everywhere else
the same question one level up. 2,568 arm's-length residential sales completed in bath and north east somerset during 2024 — median £400,000, up 1.6% on the year before.
| type | sales | median |
|---|---|---|
| detached | 555 | £632,250 |
| semi-detached | 652 | £387,500 |
| terraced | 817 | £370,000 |
| flat | 544 | £284,000 |
category a only — arm's-length residential sales at full market value. leave the repossessions and corporate transfers in and one £11m warehouse moves a whole district's mean.
the part i am proudest of
what it will not tell you
ask for the history of 33 st james's square in bath and an earlier build answered confidently: thirteen sales, a tidy appreciation column, one line reading +3,742.8% a year.
11 feb 2000£173,000+3,742.8%/yr
none of it was real. 33 st james's square is a georgian townhouse cut into flats, and the land registry recorded those flats without unit numbers — so "consecutive sales" were different flats. a 75% fall in a month was one flat being smaller than the last.
11 feb 2000£173,000—
the server now checks whether a run of sales can belong to one dwelling before it does any arithmetic. when it cannot, the percentages come back empty and it says why. the sales are still listed — it just refuses to subtract them.
these 13 sales cannot be attributed to a single dwelling, because the sales are of flats and no saon was given, so this address may cover every flat in the building rather than one of them.
a tool that is wrong out loud is worse than one that is silent, because a table of percentages reads as fact. most of the work here was not adding tools — it was finding the places where confident output was fiction.
under it
the same query, 250× apart
the endpoint holds about thirty million transactions and evaluates patterns roughly in the order you write them. put the postcode filter after the optional blocks and it walks the lot.
so the query builder emits the selective triples first, drops the type triple entirely — it alone matches every row — and keeps the optional projections last. searches too broad to be made selective are refused locally rather than sent off to time out. the ordering is asserted in the test suite, because nothing else would catch it going wrong.
run it yourself
setup, from nothing
it is not on npm yet, so there is no one-line install — you clone it and build it once. about two minutes, and you need nothing but node. the first three steps are the whole job; step four is only for the ownership and boundary tools.
check you have node 22
the server is a node process your client starts on demand. nothing else to install — no docker, no python, no account.
node --version # v22 or laterolder node will build and then fail at runtime; the test suite uses native typescript stripping.
clone and build it
one command, run wherever you keep repos. it compiles to dist/index.js — that file is what your client will run.
git clone https://github.com/light-vp/uk-land-registry-mcp.git cd uk-land-registry-mcp npm install npm run buildpoint your client at it
stay in the repo directory for the claude code line — $PWD fills in the absolute path for you. for claude desktop, paste the block into claude_desktop_config.json and swap in the real path, then restart the app.
claude codeclaude mcp add land-registry -- node "$PWD/dist/index.js"claude desktop · claude_desktop_config.json{ "mcpServers": { "land-registry": { "command": "node", "args": ["/absolute/path/to/uk-land-registry-mcp/dist/index.js"] } } }that is it for sold prices, the index and postcode lookups. ask “how has the middlesbrough housing market moved over the last five years?” and you should get a table back.
optional — turn on ownership and boundaries
register free at use-land-property-data.service.gov.uk, then accept the licence for each dataset you want — access is granted per dataset, and a key that works for ccod will not fetch ocod until you accept ocod’s licence too. that one thing causes nearly every 403. add the key to the same config and restart.
claude codeclaude mcp add land-registry --env HMLR_API_KEY=your-key-here -- node "$PWD/dist/index.js"claude desktop · alongside "args""env": { "HMLR_API_KEY": "your-key-here" }then ask it to download the overseas ownership dataset — smallest of the bulk files, and a good first one. the downloader always reports the file name and size before fetching anything, so you see the cost before you commit; ccod is several hundred mb. everything lands in ~/.hmlr-mcp.
the readme covers the rest — every tool, the failure modes worth knowing, and why a boundary polygon can never be joined to its owner using open data alone.