Property Price Search MCP Server
This server enables searching UK property price data and performing postcode lookups using HM Land Registry and Ordnance Survey data.
Search Property Prices (search-property-prices)
Search by postcode or street + city combination
Filter by price range (min/max in GBP), property type (detached, semi-detached, terraced, flat, other), and date range (YYYY-MM-DD)
Sort by date or price (ascending/descending) and paginate with
limitandoffsetReturns price, date, postcode, property type, street, city, and optional address components (PAON/SAON)
Postcode Lookup (lookup-postcodes)
Look up UK postcodes or find nearest-neighbour postcodes within a specified radius (up to 200,000m) from a postcode or OSGB36 easting/northing coordinates
Filter by admin district, control result count (up to 500), and optionally include the search postcode itself
Returns easting/northing coordinates, positional quality, country code, admin district code, and distance in metres
Additional Features
Local postcode database for fast lookups without external API calls
Case-insensitive input (auto-converted to uppercase for HM Land Registry queries)
Integrates with MCP clients (e.g., Claude Desktop) via stdio transport
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Property Price Search MCP Serverfind recent property prices for flats in postcode SW1A 1AA"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Property Price Search MCP Server
A Model Context Protocol (MCP) server that allows users to search for property prices by postcode using the HM Land Registry's SPARQL endpoint.
Features
Search property prices by postcode or street/city combination
Filter results by price range, property type, and date range
Connect to HM Land Registry's public SPARQL endpoint
Implements MCP stdio transport for IDE integration
TypeScript implementation with full type safety
Comprehensive test suite
Local postcode lookup & nearest-neighbour tool using Ordnance Survey Code-Point Open (downloaded separately)
CLI interface for direct usage
Related MCP server: UK Property Intelligence
Prerequisites
Node.js >= 20
npm >= 7
Installation
Global Installation
npm install -g property-prices-mcpLocal Installation
npm install property-prices-mcpUsage
As an MCP Server
This server is designed to be used with MCP clients (like Claude Desktop, IDEs with MCP support, etc.). Configure your MCP client to use this server via stdio transport:
{
"mcpServers": {
"property-prices": {
"command": "property-prices-mcp"
}
}
}Once connected, you can use the search-property-prices tool with the following parameters:
{
"postcode": "SW1A 1AA",
"minPrice": 1000000,
"propertyType": "flat",
"limit": 5
}You can also use the lookup-postcodes tool (built on Ordnance Survey Code-Point Open) to resolve postcodes and find nearby postcodes:
{
"postcode": "SW1A 1AA",
"radiusMeters": 2000,
"limit": 5
}Note: The Code-Point Open CSVs are not bundled. Download them once, then build the local postcode database:
npm run setup:postcodes(downloads + builds), or
npm run fetch:codepothennpm run build:postcodesManual download: https://api.os.uk/downloads/v1/products/CodePointOpen/downloads?area=GB&format=CSV&redirect Contains Ordnance Survey data © Crown copyright and database right, Royal Mail data © Royal Mail copyright and database right, and National Statistics data © Crown copyright and database right.
Command Line Interface
For testing or direct usage:
property-prices-mcpUsage Notes
Case Sensitivity
The UK Land Registry data is case-sensitive for street names and city names. However, this MCP automatically converts these parameters to uppercase before sending to the Land Registry API, so you can use any case in your searches.
Example:
"Cherry Drive" and "CHERRY DRIVE" will both work correctly.Search Parameters
The server accepts the following search parameters:
Parameter | Type | Description | Default |
postcode | string | UK postcode to search | - |
street | string | Street name | - |
city | string | City name | - |
minPrice | number | Minimum property price | - |
maxPrice | number | Maximum property price | - |
propertyType | string | One of: detached, semi-detached, terraced, flat, other | - |
fromDate | string | Start date (YYYY-MM-DD) | - |
toDate | string | End date (YYYY-MM-DD) | - |
limit | number | Maximum number of results | 10 |
offset | number | Number of results to skip | 0 |
sortBy | string | Sort by 'date' or 'price' | 'date' |
sortOrder | string | Sort order 'asc' or 'desc' | 'desc' |
Response Format
The API returns results in the following format:
interface PropertyPrice {
price: number;
date: string;
postcode: string;
propertyType: 'detached' | 'semi-detached' | 'terraced' | 'flat' | 'other';
street: string;
city: string;
paon?: string;
saon?: string;
}
interface SearchResponse {
properties: PropertyPrice[];
total: number;
offset: number;
limit: number;
}Error Handling
The server returns standard HTTP status codes:
200: Successful request
400: Invalid parameters
404: No results found
500: Server error
Error responses include a message explaining the error:
{
"error": "Invalid postcode format"
}Development
Clone the repository:
git clone https://github.com/joemclo/property-prices-mcp.git cd property-prices-mcpInstall dependencies:
npm installBuild the project:
npm run buildRun tests:
npm test # Run unit tests (fast, mocked) npm run test:unit # Run unit tests only npm run test:e2e # Run e2e tests (requires internet, hits real API) npm run test:all # Run all tests including e2eNote: E2E tests make real API calls to the HM Land Registry SPARQL endpoint and are skipped by default. They require internet connectivity and may fail in sandboxed environments.
Start in development mode:
npm run dev
Testing
This project uses a three-tier testing approach:
Test Structure
src/__tests__/
├── unit/ # Unit tests (fast, all mocked)
│ ├── queries.test.ts
│ ├── sparqlService.test.ts
│ └── mcpTool.test.ts
└── e2e/ # End-to-end tests (slow, real API calls)
└── propertySearch.e2e.test.tsRunning Tests
Unit tests (default): Fast tests with mocked dependencies
npm test # or npm run test:unitE2E tests: Real API calls to HM Land Registry
npm run test:e2eNote: E2E tests are skipped by default and require:
Internet connectivity
Access to https://landregistry.data.gov.uk
Setting
RUN_E2E_TESTS=trueenvironment variable
All tests: Run both unit and e2e tests
npm run test:all
Manual Testing
For ad-hoc testing with real data:
npm run test-mcpTroubleshooting
Common Issues
SPARQL Endpoint Connection Issues
Check your internet connection
Verify the HM Land Registry endpoint is available
Ensure your IP is not being rate limited
Invalid Postcode Format
Ensure postcodes are in the correct UK format
Remove any extra spaces
Use uppercase letters
No Results Found
Try broadening your search criteria
Check if the date range is too narrow
Verify the postcode exists
Contributing
Please read CONTRIBUTING.md for details on our code of conduct and the process for submitting pull requests.
Changelog
See CHANGELOG.md for a list of changes and version history.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Available Tools
2 toolslookup-postcodesA
Look up UK postcodes (Code-Point Open) and find nearest neighbours using OSGB36 eastings/northings. Provide either postcode or both easting and northing as the center. Optional: radiusMeters (meters), limit (default 10), includeSelf (default false), adminDistrict filter. Returns { center, postcodes: [{ postcode, easting, northing, positionalQuality, countryCode, adminDistrictCode, distanceMeters }], total }. Requires a local database built from the bundled codepo_gb CSVs via npm run build:postcodes.
| Name | Required | Description | Default |
|---|---|---|---|
| postcode | No | ||
| easting | No | ||
| northing | No | ||
| limit | No | ||
| radiusMeters | No | ||
| includeSelf | No | ||
| adminDistrict | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: the tool returns a structured result with center and postcodes data, requires a local database built from specific CSVs, and has default values for 'limit' and 'includeSelf'. It covers output format, prerequisites, and some defaults, though it lacks details on error handling, rate limits, or performance characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, starting with the core purpose. Every sentence adds value: the first explains the tool's function, the second details input requirements and optional parameters, the third describes the return structure, and the fourth covers prerequisites. There is no redundant information, and the structure flows logically from purpose to usage to output to setup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 parameters, no annotations, no output schema), the description is mostly complete. It covers purpose, input semantics, output format, and prerequisites. However, it lacks explicit error scenarios (e.g., invalid postcodes or coordinates) and does not mention the sibling tool 'search-property-prices' for contextual differentiation, which could enhance completeness for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate. It adds significant meaning beyond the schema: it explains that 'postcode' or both 'easting' and 'northing' are needed as the center, describes 'radiusMeters' as in meters, specifies default values for 'limit' (10) and 'includeSelf' (false), and clarifies 'adminDistrict' as a filter. This covers all 7 parameters with practical usage context, fully compensating for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up UK postcodes (Code-Point Open) and find nearest neighbours using OSGB36 eastings/northings.' It specifies the verb ('look up' and 'find nearest neighbours'), the resource ('UK postcodes'), and the coordinate system ('OSGB36 eastings/northings'), distinguishing it from the sibling tool 'search-property-prices' which deals with property prices rather than postcode geolocation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool: to look up UK postcodes and find nearest neighbours based on coordinates. It specifies input requirements ('Provide either `postcode` or both `easting` and `northing` as the center') and optional parameters for filtering. However, it does not explicitly state when not to use it or compare it to alternatives like the sibling tool, which might be relevant for some use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-property-pricesA
Search HM Land Registry price-paid data. Provide either postcode or both street and city (case-insensitive; uppercased for the query). Optional filters: minPrice/maxPrice (GBP), propertyType (detached | semi-detached | terraced | flat | other), fromDate/toDate (YYYY-MM-DD), limit/offset (pagination), sortBy (date | price), sortOrder (asc | desc). Returns JSON: { properties: [{ price, date, postcode, propertyType, street, city, paon?, saon? }], total, offset, limit }, where paon is the Primary Addressable Object Name (e.g., house number/name) and saon is the Secondary Addressable Object Name (e.g., flat/unit/apartment).
| Name | Required | Description | Default |
|---|---|---|---|
| postcode | No | ||
| street | No | ||
| city | No | ||
| minPrice | No | ||
| maxPrice | No | ||
| propertyType | No | ||
| fromDate | No | ||
| toDate | No | ||
| limit | No | ||
| offset | No | ||
| sortBy | No | ||
| sortOrder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does an excellent job describing the tool's behavior: case-insensitive input handling, uppercasing for queries, pagination support, sorting options, and detailed return format. The only minor gap is not mentioning rate limits or authentication requirements, but overall it provides substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured and front-loaded with the core purpose, followed by input requirements, optional filters, and return format. Every sentence adds value with no redundancy. Despite covering extensive parameter details, it remains focused and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (12 parameters, no annotations, no output schema), the description provides exceptional completeness. It covers the tool's purpose, input requirements, all parameter semantics, behavioral details, and the exact return format. For a search tool with rich filtering options, this description gives the agent everything needed to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage for 12 parameters, the description fully compensates by explaining every parameter's purpose, format, and constraints. It clarifies the relationship between postcode vs street/city parameters, explains currency units (GBP), provides enum values for propertyType, date format (YYYY-MM-DD), pagination parameters, and sorting options. This adds significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Search HM Land Registry price-paid data') and resource ('property prices'), distinguishing it from the sibling 'lookup-postcodes' tool by focusing on price data rather than postcode information. It provides a complete picture of what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about when to use this tool (searching property price data) and specifies input requirements ('Provide either `postcode` or both `street` and `city`'), but doesn't explicitly mention when NOT to use it or contrast with the sibling 'lookup-postcodes' tool. The guidance is helpful but could be more comprehensive about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The two tools have clearly distinct purposes: one looks up postcode data and finds nearest neighbours, while the other searches property price data. There is no overlap in functionality, making it easy for an agent to choose the correct tool based on the task.
Both tools follow a consistent verb_noun pattern with hyphens: 'lookup-postcodes' and 'search-property-prices'. This naming convention is predictable and readable throughout the set.
With only 2 tools, the server feels under-scoped for a property price search domain. While the tools cover postcode lookup and price search, there are likely missing operations such as filtering by property features or retrieving detailed property records, making the surface thin and incomplete.
The server lacks comprehensive coverage for property price search. It includes basic lookup and search functions but misses essential operations like updating or deleting data, advanced analytics, or integration with other property databases, which could lead to agent failures in complex tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search UK companies, land registry prices, charities, OS locations, and traffic data
UK property research tools - crime stats, schools, demographics, valuations for AI.
UK area & property intelligence for AI agents: reports, EPC, comparables, with source provenance.
Query UK Parliament, elections, crime stats, ONS census data, and national archives
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables access to UK property listings, price estimates, agent information, and market data through the Zoopla API for searching properties for sale or rent with detailed filters and analytics.22MIT
- AlicenseNot gradedqualityBmaintenanceUK property data MCP server for AI hosts (Claude, ChatGPT). Wraps Land Registry, Rightmove, EPC, rental yields, stamp duty, and Companies House into 13 tools.2MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to query UK property data including EPCs, sale history, planning, flood risk, council tax, demographics, and more via the Homedata API.18MIT

Zyfy MCP Serverofficial
AlicenseAqualityCmaintenanceEnables natural language queries about UK postcodes and vehicles, including flood risk, crime rate, broadband coverage, property prices, MOT history, and ULEZ compliance.454MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/joemclo/property-prices-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server