Skip to main content
Glama
joemclo

Property Price Search MCP Server

by joemclo

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-mcp

Local Installation

npm install property-prices-mcp

Usage

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:codepo then npm run build:postcodes

Manual 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-mcp

Usage 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

  1. Clone the repository:

    git clone https://github.com/joemclo/property-prices-mcp.git
    cd property-prices-mcp
  2. Install dependencies:

    npm install
  3. Build the project:

    npm run build
  4. Run 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 e2e

    Note: 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.

  5. 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.ts

Running Tests

  • Unit tests (default): Fast tests with mocked dependencies

    npm test           # or npm run test:unit
  • E2E tests: Real API calls to HM Land Registry

    npm run test:e2e

    Note: E2E tests are skipped by default and require:

  • All tests: Run both unit and e2e tests

    npm run test:all

Manual Testing

For ad-hoc testing with real data:

npm run test-mcp

Troubleshooting

Common Issues

  1. SPARQL Endpoint Connection Issues

    • Check your internet connection

    • Verify the HM Land Registry endpoint is available

    • Ensure your IP is not being rate limited

  2. Invalid Postcode Format

    • Ensure postcodes are in the correct UK format

    • Remove any extra spaces

    • Use uppercase letters

  3. 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 tools
lookup-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
postcodeNo
eastingNo
northingNo
limitNo
radiusMetersNo
includeSelfNo
adminDistrictNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
postcodeNo
streetNo
cityNo
minPriceNo
maxPriceNo
propertyTypeNo
fromDateNo
toDateNo
limitNo
offsetNo
sortByNo
sortOrderNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

A4.3/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness2/5

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

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables 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.
    22
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to query UK property data including EPCs, sale history, planning, flood risk, council tax, demographics, and more via the Homedata API.
    18
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables natural language queries about UK postcodes and vehicles, including flood risk, crime rate, broadband coverage, property prices, MOT history, and ULEZ compliance.
    4
    54
    MIT

Latest Blog Posts

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