# UK Property Data

> UK property data — Land Registry comps, EPC, Rightmove, rental yields, stamp duty, Companies House

- name: io.github.paulieb89/property-shared
- version: 1.5.1
- connection class: R0 (autonomous)
- trust: 86/100
- quality: 76/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.paulieb89%2Fproperty-shared
- tools: https://api.protogrid.dev/v1/servers/io.github.paulieb89%2Fproperty-shared/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "property-shared": {
      "type": "http",
      "url": "https://property-shared.fly.dev/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 45
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-100% -stale-183d
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 76/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 14 of 14 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: property_comps (destructiveHint, idempotentHint, openWorldHint); property_yield (destructiveHint, idempotentHint, openWorldHint); property_epc_search (destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 2,680 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 75 (weight 15)

- warn `stability.changes`: 28 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: 75 (weight 15)

- warn `deps.known_vulns`: 2 advisories of lower severity or without a published fix: GHSA-4xgf-cpjx-pc3j in pydantic-settings@2.12.0 (direct, fixed in 2.14.2), GHSA-gc5v-m9x4-r6x2 in requests@2.32.5 (direct, fixed in 2.33.0)
- n/a `deps.mcp_sdk_version`: the official MCP SDK is not in the dependency graph
- pass `deps.resolvable`: property-shared@1.5.1 resolved: 22 packages

- tools: 14, about 2,680 tokens to load them all
- tool set hash: fc27e24f2e2b00f34671224225640901
- tools last changed: 2026-10-05T01:56:45.671Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.paulieb89/property-shared.svg)](https://protogrid.dev/servers/io.github.paulieb89/property-shared)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-05 `ppd_transactions` added
  - Land Registry Price Paid transactions for a postcode, most recent first. Returns up to `limit` most recent transactions **within snapshot coverage** (`coverage_from`-`coverage_to` in the response's `provenance`). Unfiltered by default -- category-B bulk transfers and commercial sales are included. Pass `property_type` (F=flat, D=detached, S=semi, T=terraced, O=other) to restrict the result to a single type. **Not a complete property history.** Check `provenance.older_records_exist` and `provenance.sample_complete` before saying anything about what a property has or has not sold for. An empty result means "no sales within the stated coverage" -- never "never sold". For clean residential comparable sales, use `property_comps`.
- 2026-10-05 `planning_search` added
  - Find the council planning portal URL for a postcode.
- 2026-10-05 `company_search` added
  - Search Companies House for a company by name.
- 2026-10-05 `property_blocks` added
  - Property block analysis — identify buildings with multiple flat sales (block-buy opportunities).
- 2026-10-05 `rightmove_listing` added
  - Full detail for a single Rightmove listing. property_id is the numeric Rightmove property ID (the digits at the end of a rightmove.co.uk/properties/... URL), max 12 digits. Full URLs are not accepted. include_images fetches and embeds photos and floorplans as MCP image content. max_images caps the number of property photos (default 3); floorplans always included.
- 2026-10-05 `rightmove_search` added
  - Fetch Rightmove listings for a postcode. listing_type: "sale" or "rent". sort_by: "newest", "most_reduced", "price_asc", "price_desc". Images are excluded from results.
- 2026-10-05 `stamp_duty` added
  - UK Stamp Duty Land Tax (SDLT) calculation with full breakdown.
- 2026-10-05 `epc_certificate` added
  - Fetch a single EPC certificate by its GOV.UK certificate number. Use after property_epc_summaries has listed the candidates and you have picked one — this is faster than property_epc(postcode, address) as it makes a direct lookup with no address matching or postcode re-fetch. The parameter is named lmk_key as a compatibility alias; pass the certificate number, which is returned in every property_epc_summaries row. (property_epc_search is deprecated and raises — do not call it.) Returns the full EPC certificate, or null only when no such certificate is lodged. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.
- 2026-10-05 `property_epc_summaries` added
  - List EPC certificate summaries at a postcode — for candidate selection. Returns one bounded page. Each entry contains only what the EPC search exposes: certificate_number, address, uprn (often absent), energy band, registration_date and schema_type. Energy score, floor area and property type are NOT available here — fetch a specific certificate for those. Workflow when a Rightmove listing has no house number: 1. property_epc_summaries(postcode) to list candidates. 2. Narrow by address text and, where present, uprn. 3. epc_certificate(lmk_key=<certificate_number>) for the chosen one, then cross-check its floor_area against the listing. 4. If several candidates remain equally plausible, present them all — do not guess. Selecting arbitrarily attaches another property's data. `complete` is false when the postcode holds more records than this page returns. Upstream page traversal is not snapshot-stable, so a multi-page result is a bounded sample, not a guaranteed-complete set. An empty `results` list means no certificates are lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.
- 2026-10-05 `property_epc_search` added
  - DEPRECATED — use property_epc_summaries then epc_certificate. This tool returned score, floor_area, property_type, habitable_rooms and inspection_date for every certificate at a postcode. The EPC service no longer exposes those fields in a search: they exist only on a full certificate. Reproducing the old response would require one upstream request per certificate, so this tool is unsupported rather than silently degraded or silently expensive.

Full history: https://api.protogrid.dev/v1/servers/io.github.paulieb89%2Fproperty-shared/changes

## Dependencies

- pypi property-shared@1.5.1: resolved, 21 dependencies
  - GHSA-4xgf-cpjx-pc3j (moderate) in `` pydantic-settings@2.12.0 ``, direct, fixed in `` 2.14.2 ``, advisory summary: "pydantic-settings: NestedSecretsSettingsSource follows symlinks outside secrets\_dir, enabling local file read and bypassing secrets\_dir\_max\_size" https://osv.dev/vulnerability/GHSA-4xgf-cpjx-pc3j
  - GHSA-gc5v-m9x4-r6x2 (moderate) in `` requests@2.32.5 ``, direct, fixed in `` 2.33.0 ``, advisory summary: "Requests has Insecure Temp File Reuse in its extract\_zipped\_paths() utility function" https://osv.dev/vulnerability/GHSA-gc5v-m9x4-r6x2

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://property-shared.fly.dev/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

- pypi property-shared@1.5.1

## Tools (14)

- `company_search`: Search Companies House for a company by name.
- `epc_certificate`: Fetch a single EPC certificate by its GOV.UK certificate number.

Use after property_epc_summaries has listed the candidates and you have
picked one — this is faster than property_epc(postcode, address) as it makes
a direct lookup with no address matching or postcode re-fetch.

The parameter is named lmk_key as a compatibility alias; pass the
certificate number, which is returned in every property_epc_summaries row.
(property_epc_search is deprecated and raises — do not call it.)

Returns the full EPC certificate, or null only when no such certificate is lodged. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.
- `planning_search`: Find the council planning portal URL for a postcode.
- `ppd_transactions`: Land Registry Price Paid transactions for a postcode, most recent first.

Returns up to `limit` most recent transactions **within snapshot coverage**
(`coverage_from`-`coverage_to` in the response's `provenance`).
Unfiltered by default -- category-B bulk transfers and commercial sales are
included. Pass `property_type` (F=flat, D=detached, S=semi, T=terraced,
O=other) to restrict the result to a single type.

**Not a complete property history.** Check `provenance.older_records_exist`
and `provenance.sample_complete` before saying anything about what a
property has or has not sold for. An empty result means "no sales within
the stated coverage" -- never "never sold". For clean residential
comparable sales, use `property_comps`.
- `property_blocks`: Property block analysis — identify buildings with multiple flat sales (block-buy opportunities).
- `property_comps`: Comparable sales from Land Registry Price Paid Data.

Defaults return the standard residential set:
- property_type=None means residential (F+D+S+T). Pass "F"/"D"/"S"/"T"/"O"
  for a single type, or "ALL" to disable type filtering (firehose).
- transaction_category defaults to "A" (standard sales). Pass None to
  include category-B (bulk transfers, non-standard conveyances).
- filter_outliers=False by default; set True for IQR-trimmed stats AND
  transaction list (1.5*IQR rule, needs >=4 prices).

limit caps returned transactions (max 200). enrich_epc attaches EPC floor
area and price-per-sqft to each transaction — slower but richer.
- `property_epc`: Energy Performance Certificate data for a UK property or postcode area.

With address: returns the matched EPC certificate for that specific property.
Without address: returns the record count and, when the bounded response
contains every matching summary, the rating distribution. Property-type
breakdown and floor-area statistics are NOT available — the EPC service
exposes them only on individual certificates.

Returns null only when no certificates are lodged for the postcode. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.
- `property_epc_search`: DEPRECATED — use property_epc_summaries then epc_certificate.

This tool returned score, floor_area, property_type, habitable_rooms and
inspection_date for every certificate at a postcode. The EPC service no
longer exposes those fields in a search: they exist only on a full
certificate. Reproducing the old response would require one upstream
request per certificate, so this tool is unsupported rather than silently
degraded or silently expensive.
- `property_epc_summaries`: List EPC certificate summaries at a postcode — for candidate selection.

Returns one bounded page. Each entry contains only what the EPC search
exposes: certificate_number, address, uprn (often absent), energy band,
registration_date and schema_type. Energy score, floor area and property
type are NOT available here — fetch a specific certificate for those.

Workflow when a Rightmove listing has no house number:
  1. property_epc_summaries(postcode) to list candidates.
  2. Narrow by address text and, where present, uprn.
  3. epc_certificate(lmk_key=<certificate_number>) for the chosen one, then
     cross-check its floor_area against the listing.
  4. If several candidates remain equally plausible, present them all —
     do not guess. Selecting arbitrarily attaches another property's data.

`complete` is false when the postcode holds more records than this page
returns. Upstream page traversal is not snapshot-stable, so a multi-page
result is a bounded sample, not a guaranteed-complete set.

An empty `results` list means no certificates are lodged. If the EPC service
cannot be reached the tool raises an error instead — never treat an error as
evidence that a property has no certificate.
- `property_yield`: Gross rental yield for a UK postcode.

Combines Land Registry sale comps (median sale price) with Rightmove rental
listings (median monthly rent) to produce a gross yield percentage.
- `rental_analysis`: Rental market analysis and achievable rent estimate.

auto_escalate widens the Rightmove search RADIUS when fewer than 5 listings
are found (thin market). This is rental-radius escalation and is unaffected
by the PPD geography containment: it does not change a postcode's outcode or
sector, so it carries none of the limit-dependence that disabled PPD
auto-widening. Response includes thin_market, escalated_from, escalated_to
fields when escalation occurs.
- `rightmove_listing`: Full detail for a single Rightmove listing.

property_id is the numeric Rightmove property ID (the digits at the end of a
rightmove.co.uk/properties/... URL), max 12 digits. Full URLs are not accepted.
include_images fetches and embeds photos and floorplans as MCP image content.
max_images caps the number of property photos (default 3); floorplans always included.
- `rightmove_search`: Fetch Rightmove listings for a postcode.

listing_type: "sale" or "rent". sort_by: "newest", "most_reduced",
"price_asc", "price_desc". Images are excluded from results.
- `stamp_duty`: UK Stamp Duty Land Tax (SDLT) calculation with full breakdown.
