Skip to main content
Glama

Search Price Paid Transactions by Postcode

land_title_search
Read-onlyIdempotent

Search HM Land Registry Price Paid Index by postcode or address.

Returns up to 10 recent sale transactions for the postcode: price, date, address, property type, and tenure (Freehold/Leasehold). Covers England and Wales only. Postcode gives the most reliable results — a full address is also accepted and the postcode is extracted automatically.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
address_or_postcodeYesUK property address or postcode. Postcode is most reliable: e.g. 'NG1 1AB'. Full address also accepted.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
totalYesNumber of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query.
postcodeYesNormalised UK postcode extracted from the input.
transactionsNoRecent Price Paid transactions for the postcode, sorted newest first.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Added
  2. Removed
  3. Changed2 schema fields changed
    • changedOutput schema / description
      Previous value: -"HMLR land registry search result for a given postcode."New value: +"HMLR Price Paid Index search result for a given postcode."
    • removedOutput schema / properties / title_data
      Removed value: -{
      -  "additionalProperties": true,
      -  "description": "Title ownership data from the HMLR title endpoint. Currently always empty — the free title endpoint does not return data for most lookups.",
      -  "type": "object"
      -}
  4. Changed9 schema fields changed
    • removedInput schema / properties / response_format
      Removed value: -{
      -  "default": "markdown",
      -  "description": "Output format: 'markdown' or 'json'",
      -  "type": "string"
      -}
    • changedOutput schema / description
      Previous value: -"Generic wrapper for non-object return types."New value: +"HMLR land registry search result for a given postcode."
    • addedOutput schema / properties / postcode
      Added value: +{
      +  "description": "Normalised UK postcode extracted from the input.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / result
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / title_data
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Title ownership data from the HMLR title endpoint. Currently always empty — the free title endpoint does not return data for most lookups.",
      +  "type": "object"
      +}
    • addedOutput schema / properties / total
      Added value: +{
      +  "description": "Number of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query.",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / transactions
      Added value: +{
      +  "description": "Recent Price Paid transactions for the postcode, sorted newest first.",
      +  "items": {
      +    "description": "A single Price Paid transaction for a property.",
      +    "properties": {
      +      "county": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "County."
      +      },
      +      "estate_type": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Tenure / estate type label (e.g. 'Freehold', 'Leasehold')."
      +      },
      +      "paon": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Primary addressable object name (house number or name)."
      +      },
      +      "postcode": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Property postcode."
      +      },
      +      "price_paid": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Sale price in GBP (integer pounds)."
      +      },
      +      "property_type": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Property type label extracted from the HMLR URI (e.g. 'Terraced', 'Semi Detached', 'Flat')."
      +      },
      +      "saon": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Secondary addressable object name (flat/unit identifier)."
      +      },
      +      "street": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Street name."
      +      },
      +      "town": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Town/city."
      +      },
      +      "transaction_date": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Transaction date (ISO YYYY-MM-DD)."
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "result"
      -]New value: +[
      +  "postcode",
      +  "total"
      +]
    • removedOutput schema / x-fastmcp-wrap-result
      Removed value: -true
  5. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds valuable behavioral context beyond these: it returns a maximum of 10 transactions, lists the exact data fields, restricts to England and Wales, and explains automatic postcode extraction from addresses. This is useful operational detail not present in the annotations.

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?

Three sentences, front-loaded with the main action, followed by return details and key constraints. No filler or redundancy. Every sentence contributes meaningful guidance, making this highly concise and well-structured.

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?

For a single-parameter tool with a provided output schema, the description is complete: it states the data source, coverage area, reliability guidance, and expected return fields/count. There's no ambiguity that would require additional narrative. The output schema covers structural details, so the description's brevity is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'address_or_postcode' is already described in the schema with the same guidance (postcode most reliable, full address accepted). The description adds a small extra detail about automatic postcode extraction, but with 100% schema coverage, the schema carries the semantic weight. Per the rubric, baseline 3 is appropriate.

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 opens with a specific verb+resource: 'Search HM Land Registry Price Paid Index by postcode or address.' It clearly distinguishes this tool from sibling tools by focusing on property transaction data, and states the return content (price, date, address, property type, tenure). This leaves no ambiguity about 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?

It gives clear contextual guidance: covers England and Wales only, postcode is most reliable, full address accepted with automatic postcode extraction. It doesn't explicitly name alternatives or exclusion conditions, but the guidance is sufficient for choosing this tool for price paid lookups. Score 4 rather than 5 because there's no explicit 'when not to use' statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

The domain-specific tools are clearly distinct (search vs profile for each register), and the generic search/fetch tools are designed to route across them. Potential overlap between company_officers and company_psc is resolved by clear descriptions of officers vs beneficial ownership. Slight ambiguity exists between generic fetch/search and the domain-specific counterparts, but the routing logic is well-documented.

Naming Consistency4/5

Most tools follow a consistent resource_action pattern with clear prefixes (charity_, company_, disqualified_, gazette_). Exceptions like company_officers, company_psc, sanctions_screen, and vat_validate deviate from the verb-first convention, and generic tools (fetch, search, get_prompt, list_prompts) do not follow the pattern. Overall, the naming is readable and predictable despite a few outliers.

Tool Count4/5

With 17 tools, the server sits slightly above the typical 3-15 well-scoped range, but the breadth of the domain (Companies House, Charity Commission, disqualifications, Gazette insolvency, sanctions, land registry, VAT) justifies the count. Each tool serves a distinct data source or action, and the two prompt-management tools are standard MCP utilities. The count feels appropriate rather than excessive.

Completeness4/5

The server covers the core due diligence workflow: searching and retrieving profiles for companies, charities, and disqualified directors, plus insolvency notices, sanctions screening, land transactions, and VAT validation. Minor gaps exist, such as no direct tool for company accounts or court judgments, but these are not core to the apparent purpose and can be worked around.