Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

MarketCode

REMOTE · MCP.MARKETCODE.AI

UK property intelligence with evidence behind the numbers.

+3 this week 71 Trust /100

Last scanned (14 minutes ago)

Scores higher than 57% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Maps and Location

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security81
Transport & Reachability100
Schema Quality & AI Usability70
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 26299 tokens (~248/item across 106 items; 106 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage72
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 1% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety50
  • Injection-marker check failed: the description of tool "sourcing_strategies" contains an instruction to conceal the call from the user, the text "without telling the user", at byte 701 of that field. See how to fix → Fail
  • We read all 106 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 107 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +1
    • Tool “planning_applications” rewrote its description, which is the text the model reads security
    • New tool “constraints_for_geometry” functional
    • New tool “grid_capacity” functional
    • New tool “lpa_profile” functional
    • New tool “planning_appeals” functional
    • New tool “policy_context” functional
    • New tool “site_access” functional
    • New tool “strategic_sites” functional
    • Tool “planning_applications” changed its title: Planning authority for a location → Planning applications near a location (London) cosmetic
  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

  • 31 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 0
    • Tool “query_semantic” rewrote its description, which is the text the model reads security
    • Stability: unverified → 0.03 ▲ functional
  • 29 Oct 26 68

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://mcp.marketcode.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=marketcode.ai CN=WE1,O=Google Trust Services,C=US 11 Sept 2026 10 Dec 2026 ECDSA 256 ECDSA-SHA256 d723b7fa16399c1e0e394371e1271a98
SANs: marketcode.ai, *.marketcode.ai
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.marketcode.ai. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ai. present 1814, 3799 8, 8 Verified
marketcode.ai. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://api.marketcode.ai/.well-known/oauth-protected-resource", scope="property:read"

Bearer resource_metadata="https://api.marketcode.ai/.well-known/oauth-protected-resource", scope="property:read"

Protected resource metadata

Document https://api.marketcode.ai/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://mcp.marketcode.ai/mcp
Authorisation server https://api.marketcode.ai

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.marketcode.ai/mcp Verified 200
http (plaintext) http://mcp.marketcode.ai/mcp Inconclusive 404
MCP tools · 106 exposed · ~25,845 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
actor_network ~113

Investigate recorded corporate ownership, title and agency relationships. Requires the customer's account; never use an anonymous preview key. Depth 1–3, at most 100 nodes; clipped networks explicitly say truncated. Cite publication IDs and provenance on each hop. Missing links are not negative findings. Individuals are excluded. An unpublished root costs no credits. Costs 15 credits (15p).

NameTypeReqDescription
depthinteger––
entity_idstringyes–
kindstringyes–
limitinteger––

Structured output declared, but exposes no named fields.

No examples provided.

actor_path ~105

Find a recorded path between two corporate-network records within three hops. Requires the customer's account. A clipped search returns incomplete, never a claim that no relationship exists. Return the ordered hops with their source/publication evidence. Costs 15 credits (15p).

NameTypeReqDescription
depthinteger––
limitinteger––
source_idstringyes–
source_kindstringyes–
target_idstringyes–
target_kindstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

address_autocomplete ~120

Address autocomplete. Returns ranked candidates for a partial address or postcode. Use `address_resolve` to turn a candidate into a canonical UPRN. This is the free entry point: resolve, lookup and postcode listing are priced because they return OS AddressBase content, but narrowing a search is not. Prefer it for anything interactive, and resolve once at the end. UK only. Free.

NameTypeReqDescription
countrystring––
max_resultsinteger––
qstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

address_by_postcode ~39

Return all addresses at a UK postcode. Costs 2 credits (2p); free on marketcode.ai.

NameTypeReqDescription
postcodestringyes–

Structured output declared, but exposes no named fields.

No examples provided.

address_by_uprn ~79

Look up an address by UPRN (UK only). Costs 1 credit (1p); free on marketcode.ai. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uprnintegeryes–

Structured output declared, but exposes no named fields.

No examples provided.

address_resolve ~58

Resolve free-text address to canonical record (UPRN for UK). Costs 2 credits (2p); free on marketcode.ai.

NameTypeReqDescription
countrystring––
max_resultsinteger––
querystringyes–

Structured output declared, but exposes no named fields.

No examples provided.

agent_activity ~124

Which estate agents actually transact in an area, ranked by listing count. Sale and rental are counted and averaged SEPARATELY — an asking price and a monthly rent do not combine into one median, so read `median_asking_price` and `median_monthly_rent` as answering different questions. `area_id` is the marts area id from `area_resolve`. UK only. Free.

NameTypeReqDescription
area_idstringyes–
limitinteger––
listing_type–––
months–––

Structured output declared, but exposes no named fields.

No examples provided.

area_report ~208

The market for one area, as one document: sourcing readiness per strategy from the coverage register, the commercial capital and rent indices with rated stock, the planning decision record for the authority, and the live listing stock. THE TWO SCOPES ARE NOT INTERCHANGEABLE. Readiness, commercial stock and the planning register are keyed on the LOCAL AUTHORITY (`lad_code`, a GSS code — use `area_resolve` to get one); the live listing lane is keyed on POSTCODE DISTRICT. Pass both to fill every section, and expect the unsupplied half to read `not_available` with that reason rather than empty. As with `property_report`, check `sections_degraded` before describing the document as complete. UK only. Costs 25 credits (25p).

NameTypeReqDescription
lad_code–––
postcode_district–––
sectorstring––

Structured output declared, but exposes no named fields.

No examples provided.

area_resolve ~91

Resolve an area name or code ("Hackney", "E5") to its area_id, centroid and full hierarchy as breadcrumbs. Call this first when a question is about a named area rather than a specific address. UK only. Free.

NameTypeReqDescription
area_namestringyes–
h3_resolutioninteger––
include_h3boolean––

Structured output declared, but exposes no named fields.

No examples provided.

area_reverse_geocode ~87

The area of a given type containing a coordinate. `type_id` is an area type UUID and is required — a point sits inside one area per geography layer, so without it the answer would be ambiguous. UK only. Free.

NameTypeReqDescription
latnumberyes–
lngnumberyes–
type_idstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

area_stock_profile ~106

Composition of the built stock in an area: unit counts, HMO share, mixed-use share, median building height and footprint, solar penetration. Medians, not means — one tower would skew an average height enough to make a low-rise district read as mid-rise. Percentages are whole percentages. `area_id` is the marts area id from `area_resolve`. UK only. Free.

NameTypeReqDescription
area_idstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

ask_question ~104

Use the SAME Ask router as the portal. Route a place/kind into the published taxonomy, a dated figure to the governed semantic query, or exact company/property/title references to a bounded corporate network/path. This tool proposes execution; it does not execute paid work. Respect unsupported criteria and require acceptance of a paid proposal. Routing catalogue IDs are NOT evidence publication IDs; cite the eventual tool's data provenance. Free.

NameTypeReqDescription
place_slug–––
questionstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

asking_price_index_series ~328

Hedonic ASKING-PRICE index for one postcode district, local authority or Great Britain, from portal listings (Rightmove ~95%), 2022M01 = 100, with 80% bands and posterior standard errors, smoothed toward the parent geography. Use this for "how have asking prices in W14 moved since 2022" or to see whether sellers are ahead of or behind the sold-price index (market_index_series). Asking LEADS sold by months and includes what never sells; `value` is an index level, never a price. For asking-price LEVELS use listing_market_series. `area_code` is a postcode district ("W14") with area_type="district", a local authority NAME ("Camden") with area_type="lad", or "NATIONAL". An unknown area is an error naming the nearest matches; read them back. READ provenance.pub_freq: the pipeline judged which grain this area's data can resolve (posterior SE of the monthly move <= 1 pp). If it says quarterly, prefer frequency="quarterly" and say the monthly series is noisy. `inc_se_pp` on each point is the SE of that period's move. Free.

NameTypeReqDescription
area_codestring––
area_typestring––
end–––
frequencystring––
limitinteger––
methodstring––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

asking_rent_index_series ~229

Hedonic ASKING-RENT index for one postcode district, local authority or Great Britain, from portal lettings, 2022M01 = 100, with bands and SEs. This is the residential rent index; commercial_rent_index_series is the VOA one for commercial property. It is validated every build against the ONS Price Index of Private Rents by local authority and NOT published in a month where the two disagree by more than a few points a year — so a missing recent month is a refusal, not an outage; say so. Asking rents, not achieved; `value` is an index level, never a rent. For rent LEVELS and yields use listing_market_series. Same area and frequency rules as asking_price_index_series. Free.

NameTypeReqDescription
area_codestring––
area_typestring––
end–––
frequencystring––
limitinteger––
methodstring––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

auction_comps ~314

Auction comparables on ACHIEVED prices, each against our valuation. A portal tells you a property went to auction. This says what it MADE, and what our AVM thought it was worth at the same address — the difference between a comparable and a listing. Use it to judge whether a guide price is realistic, or what a lot is likely to fetch. `achieved_to_avm` is the hammer price as a share of our AVM. Below 1.0 the lot sold under the estimate; the useful spread is wide, from about 0.45 to 0.95 within a single postcode area. Read it alongside `auction_date`: all AVMs share one snapshot date, so an older lot carries market movement as well as discount. Bedrooms and property type come from the UPRN-matched unit rather than the auction catalogue, which populates property_type on 12% of sold lots and tenure on none at all. Give `postcode_district` or `postcode_area` — auction lots carry a postcode, not an area_id, so there is no area_id path here. UK only. Free.

NameTypeReqDescription
is_commercial–––
limitinteger––
max_beds–––
min_beds–––
monthsinteger––
postcode_area–––
postcode_district–––

Structured output declared, but exposes no named fields.

No examples provided.

auction_discount ~385

How far below our valuation UK auction actually clears — the one auction number nobody else can produce. An achieved hammer price against an automated valuation of the SAME property. EIG covers 530+ auctioneers to our six and sells API data, but runs no AVM; we have less auction data and the valuation. The join is the product, not the feed. Nationally over the last 24 months the median lot cleared at about 0.66 of our estimate — a ~34% discount — and 87% of lots sold below it. The spread by district is large and real: PR2 clears near 47% below, N1 under 8%. READ `by_year` BEFORE QUOTING THE HEADLINE, and read `meta.sufficient`. Every AVM in the warehouse shares ONE snapshot date, so this ratio is an auction discount only where the sale and the valuation are close in time. The series sits near 0.65 from 2021 and falls to ~0.44 in 2016-2019 — that fall is house-price growth sitting between the hammer and the estimate, not a deeper discount. Widening `months` past about 60 measures the market, not the auction. `min_lots` suppresses the headline where too few lots match; a median over three sales is not a market rate, and `meta.sufficient` says which you got. Geography is by POSTCODE, not area_id — auction lots carry a postcode. UK only. Free.

NameTypeReqDescription
is_commercial–––
min_lotsinteger––
monthsinteger––
postcode_area–––
postcode_district–––

Structured output declared, but exposes no named fields.

No examples provided.

auction_lots ~414

Individual UK auction lots: the guide price a lot was marketed at, whether it sold, the HAMMER PRICE where the auctioneer published one, and the net yield where quoted. Five auction houses, Allsop back to 1999. Nothing else on the market sells achieved auction outcomes through an API — a listings portal tells you a property went to auction, not what it made. Use this for: what did comparable lots actually sell for, is a guide price realistic, what yields are commercial lots trading at, how does a district's auction market behave. For asking-price or private-treaty sales use market_volume_series or property_history instead — auction is a different market and the prices are not interchangeable. Coverage is a real constraint, not a caveat: about a quarter of lots carry an achieved price and a fifth a net yield, because most auctioneers publish a guide and never the result. Set `with_achieved_price` or `with_yield` to restrict to lots that can answer an outcomes question, and read `meta.coverage` on the way out so a thin result reads as thin. `auctioneer` is one of: allsop, savills, acuitus, barnettross, agentsproperty. Acuitus is the one that publishes net yield beside the achieved price, so filter to it when yield is the question. Dates are ISO (YYYY-MM-DD). UK only. Free.

NameTypeReqDescription
auctioneer–––
date_from–––
date_to–––
is_commercial–––
limitinteger––
offsetinteger––
postcode_area–––
postcode_district–––
sold_onlyboolean––
with_achieved_priceboolean––
with_yieldboolean––

Structured output declared, but exposes no named fields.

No examples provided.

auction_stats ~293

Quarterly UK auction statistics by postcode district: lots offered, lots sold, the sale rate, and average guide, achieved and net yield. Use this for the shape of a local auction market over time — is it clearing, are yields moving, is stock rising. For individual comparables use auction_lots. READ `n_guide` AND `n_achieved` BEFORE COMPARING THE AVERAGES. They are computed over DIFFERENT POPULATIONS: a guide price is published for most lots, a hammer price by a minority of auctioneers. Subtracting one average from the other does not give an uplift, a discount, or any meaningful number — the two sets are not the same lots. Each row carries a `comparable` flag that is false when the two populations are too unbalanced for the difference to mean anything. When it is false, report the two figures separately with their counts, and say why. `quarter_from`/`quarter_to` are the first day of a quarter (2024-01-01, 2024-04-01, ...). UK only. Free.

NameTypeReqDescription
is_commercial–––
limitinteger––
postcode_district–––
quarter_from–––
quarter_to–––

Structured output declared, but exposes no named fields.

No examples provided.

build_cost ~248

Build cost for a scheme: the sector's cost index with its 1- and 5-year movement, the regional location factor (`region`: NATIONAL, LONDON, SOUTH_EAST — an error lists what is loaded), the editorial on-cost percentages (prelims, contingency, overheads & profit, professional fees) and, given `gia_m2` and `rate_gbp_m2` (your BCIS or in-house base rate, with `rate_period` in the series' own format, e.g. 2024Q1), an estimate: the rate carried through the index to the latest period, localised, multiplied out, with totals at low / mid / high on-costs. The £/m² benchmark leg says `not_available` until a tender benchmark is loaded — no rate is invented, and nothing here is a modelled number. UK only. Free.

NameTypeReqDescription
basisstring––
gia_m2–––
rate_gbp_m2–––
rate_period–––
regionstring––
sectorstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

building_physical ~240

Physical form of the buildings a set of UPRNs sit in: height, volume, footprint area, floor count, construction and roof material, basement, green roof, solar panels, and the residential/commercial unit mix. `year_built` and `num_floors` are thinly populated and come back null rather than estimated — treat null as unknown, not as absent. `footprint_geojson` is the recorded WGS84 building outline, simplified at 0.5 m, for report maps and illustrative 3D massing. Use `building_height_m` (volume divided by footprint), never altitude `height_m_above_sea_level`, for extrusion. Preserve `geometry_attribution`. The extrusion does not show actual facades, roof details, or a flat's internal boundaries. UK only. Costs 15 credits (15p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uprnsarrayyes–

Structured output declared, but exposes no named fields.

No examples provided.

changes_since ~479

What changed since you last looked — the portal change feed. Pass the `next_cursor` from your previous call to get only what is new; on a first call give a scope (`postcode_districts` or `uprns`) or a `since` date, because an unbounded read of a 14.6-million-row feed is refused. THE CURSOR IS AN EVENT ID, not a timestamp. Rows recorded late always take higher ids, so nothing slips behind your watermark between polls. Each event carries both `event_date` (when the portal says it happened) and `observed_at` (when our sweep saw it) — a backfill has an old date and a recent observation, which is exactly why the cursor is an id. READ `coverage.event_types` BEFORE TRUSTING AN EMPTY PAGE. `added` and `price_reduced` are live and daily. `price_increased` and `status_changed` are sparse and only start in late August. **`delisted` has ONE row in the whole table: withdrawal is NOT observed, so an empty result for it means we cannot see it, not that nothing was withdrawn.** Five change kinds a user may ask for — planning decisions, ownership changes, a lease crossing 80 or 60 years, a new EPC, an AVM move — have no feed at all and are listed under `coverage.not_yet_fed`. Say which of these you cannot answer. On a price change, `price.old_price_source` says whether the old price came from the event itself or was derived from the listing's previous event; the portal usually reports only the new price. Where neither is available the change is null, never zero. UK only. Costs 5 credits (5p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
channel–––
cursor–––
event_types–––
limitinteger––
postcode_districts–––
since–––
uprns–––

Structured output declared, but exposes no named fields.

No examples provided.

commercial_index_series ~401

Repeat-sales CAPITAL index for UK commercial property, quarterly, 1995Q1 = 100. Three families exist and nothing else: national ALL; national x sector for the sectors that passed the level gate (OFFICE, RETAIL, HOTEL, HOLIDAY_LET); and local authority x ALL for the 19 authorities with enough pooled repeat sales. There is deliberately NO local x sector series — a local sector cell is too thin to carry an index — so for "office values in Manchester" call twice, sector="OFFICE" (national) and area="Manchester" (ALL), and present the two side by side; each is real. `area`: omit for national; a local authority NAME ("Manchester", "South Hams") for the city scope. `sector`: omit for ALL, or a sector name. `start` / `end`: "2015", "2015Q1", "2015-Q1" or "2015-06"; `end` is inclusive. `provenance.method` is repeat_sales for the raw estimator and repeat_sales_shrunk where thin quarters were blended toward the national increment; `n_pairs` per quarter is the straddle count, and a quarter with few pairs is carried by the blend. An empty `series` with `available_sectors` means the area exists but that sector is not published for it; an unknown area is an error naming the nearest matches. This is a capital-value index. For RENTS use commercial_rent_index_series; the two are not interchangeable (capital = rent / yield, and yields moved). UK only. Free.

NameTypeReqDescription
area–––
end–––
limitinteger––
sector–––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

commercial_market ~290

The commercial market for a sector and a place: the repeat-sales CAPITAL index, the VOA rating-list RENT index, and the rated stock standing in the authority with its hereditament count, total and median rateable value. THE TWO INDICES ARE NOT COMPARABLE and must never be plotted on one axis or differenced. The capital index is quarterly and THIN — several quarters rest on single-digit sale pairs, `n_pairs` is on every point, and `thin_periods` names the recent ones you should not quote a move from. The rent index is keyed on VOA rating lists at their antecedent valuation dates, so it has four points in sixteen years and each is a revaluation of a constant sample, not a quarter. Only 19 local authorities carry a capital series, ALL sector only, because a local sector cell is too thin to publish. Ask for one that has none and the NATIONAL series comes back labelled as national — check `area.index_scope` before describing it as local. Rated stock is the 2026 list only, so it is a snapshot: RV change on appeal is not derivable per property. UK only. Free.

NameTypeReqDescription
area_key–––
lad_code–––
sector–––

Structured output declared, but exposes no named fields.

No examples provided.

commercial_property ~272

The commercial property report, by UPRN or by VOA UARN: the hereditament as the 2026 rating list describes it (rateable value, sector, description), the sector's rent index across the 2010/2017/2023/2026 lists and its capital index (national, plus the local authority where one exists), an income-basis value that capitalises the RV at the district's commercial auction net yield — with the yield's receipt, and `not_available` where the district published none — the auction history at the address, the district's commercial auction market by quarter, the registered owner and the lease. Blocks that cannot be derived today say `not_available` with the reason (the RV history per hereditament; the VOA measured area). RV is a rating measure at the antecedent valuation date, not passing rent — say so when you quote the income-basis figure. UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uarn–––
uprn–––

Structured output declared, but exposes no named fields.

No examples provided.

commercial_rent_index_series ~433

Commercial RENT index from the VOA rating lists — FOUR points, one per list (2010 / 2017 / 2023 / 2026), each dated at that list's antecedent valuation date (2008-04-01, 2015-04-01, 2021-04-01, 2024-04-01), with the 2010 list = 100. READ `basis` AND REPEAT IT when you quote a number: the index is derived from VOA rateable values — the Valuation Office Agency's assessment of open-market rent at each valuation date — NOT from advertised rents, and it is not a capital-value index. It moves in four steps; do not interpolate between them as if it were monthly, and date each point by `avd_date`, not `list_year`. Why it exists: it covers the sectors the repeat-sales capital index cannot (INDUSTRIAL_WAREHOUSE trades in portfolios, not Price Paid), for every VOA sector and 320 local authorities. `sector`: omit for ALL, or a VOA sector (OFFICE, RETAIL, INDUSTRIAL_WAREHOUSE, INDUSTRIAL_FACTORY, PUB_BAR, HOTEL, LEISURE, HEALTHCARE, EDUCATION, ...). `area`: omit for national; a local authority GSS code ("E08000003") or NAME ("Manchester", bridged to its code). `start` / `end`: rating-list years, e.g. "2017". `link_ratio` is the median rateable-value ratio between consecutive lists over the hereditaments present in both (`n_constant` of them). An empty `series` with `available_sectors` means the area is published but not that sector; an unknown area is an error. UK only. Free.

NameTypeReqDescription
area–––
end–––
sector–––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

comps_adjustments ~260

The evidence behind a valuation, itemised: same-building comparable sales for the property, each with its registered price and date, its time adjustment on the published repeat-sales index (the district's own series, else the local authority's, else national) to the index's latest settled month with the carry receipt (`index_unavailable` and no adjustment where no series covers the property), any relisting penalty (pass `relisted_uprns` only to model an explicit -10% sensitivity for relisted/withdrawn comps; this is an assumption, not a measured discount), and the IQR fence that decided which comps count. Use it to show WHY a value is what it is; `valuation_full` gives the value itself. `lookback_months` 12–120. UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
lookback_monthsinteger––
relisted_uprns–––
uprnintegeryes–

Structured output declared, but exposes no named fields.

No examples provided.

constraints_for_geometry ~394

Every planning and environmental designation on a red line, a piece of land or a point, from the current published layers: green belt, National Landscapes, national parks, SSSI, SAC, SPA, Ramsar, ancient woodland, nature reserves, nutrient neutrality, listed buildings, scheduled monuments, registered parks and battlefields, world heritage sites and buffers, heritage at risk, flood zones 2 and 3, historic floods, coal high-risk areas, access land, agricultural land class, conservation areas, Article 4, TPOs, the brownfield register, archaeological priority areas, open space and air quality areas. THREE-VALUED. Each answers `present` (with the share of the site it covers and up to five features with grade and reference), `absent` (with the distance to the nearest within 2 km) or `not_checked` with the reason: the layer is loaded for England only, it is not loaded yet, or the site's council has published none. not_checked is never a clean result. `buffer_m` (0-2000) widens the scope. Give exactly ONE scope: `location` ("lat,lng"), `postcode`, `area_geojson` (a red line, GeoJSON in WGS84, at most 150 km² and 64 vertices), `land_id` or `lpa_code` (GSS, e.g. E07000240); anything else is refused before any read and nothing is charged. UK only. Free.

NameTypeReqDescription
area_geojson–––
buffer_minteger––
include_featuresboolean––
land_id–––
location–––
postcode–––
types–––

Structured output declared, but exposes no named fields.

No examples provided.

cost_index ~169

Construction cost index series for a development appraisal's cost side: `basis` is tender (tender price indices), output (output price indices), deflator (the construction deflator) or labour. Optional `sector` (residential, commercial, industrial, infrastructure, all, …), `freq` (monthly | quarterly | annual) and an inclusive period window in the series' own format (2014Q1, 2014M01, 2014). Each series carries its base period and method. UK-wide; regional factors come with the site appraisal. UK only. Free.

NameTypeReqDescription
basisstringyes–
freq–––
from_period–––
sector–––
to_period–––

Structured output declared, but exposes no named fields.

No examples provided.

council_tax_band ~320

VOA council tax band for a property, from the official list. Every band is DECLARED — read from the VOA list, never inferred by a model. `band_source` states which, and a predicted band would arrive as a distinct value rather than folded in, because a caller cannot tell the two apart after the fact. DO NOT PRESENT A BAND AS A BILL. Three fields come back null on purpose and must not be filled in by estimating: * `annual_cost_gbp` — the per-band charge for each billing authority is a separate source we do not hold. * `effective_date` — the crawl records when the VOA refreshed the LIST, which is not when this property's band took effect. * `composite` — same reason; it lives on the per-property detail page. `status` is `not_found` when the band exists in the VOA list but address matching has not linked this UPRN to it. That is a matching gap on OUR side, not evidence the property has no band — report it that way round. England and Wales only: Scotland is the Scottish Assessors Association and Northern Ireland is Land & Property Services, neither of which is in this list. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uprnintegeryes–

Structured output declared, but exposes no named fields.

No examples provided.

data_coverage ~183

The data-coverage register for a local authority — read it before the data: per-field non-null and source shares over every unit in the authority (floor area, bedrooms, year built, EPC, last sale, tenure…), which designation flags were checked and how fully, how many units carry a registered lease or a hereditament, whether official planning data covers the authority and how deep it goes (applications, link shares, latest decision), and how much of the live listing stock the sweep has dated. `area` is a GSS code (E09000032), a local authority name (Wandsworth) or a warehouse area id. State the coverage before quoting a share from a thin field. UK only. Free.

NameTypeReqDescription
areastringyes–

Structured output declared, but exposes no named fields.

No examples provided.

distressed_assets ~491

Properties that keep going to auction and NEVER SELL — the distress screen. The clearest distress signal in the warehouse: a vendor who wants out and a market that has said no more than once, both on the public record. Ranked by how many separate auctions the lot has failed at, then by how long it has been on the circuit. READ `guide_to_avm` BEFORE CALLING ANY ROW AN OPPORTUNITY. It is the latest guide divided by our AVM, and it is the difference between the two reasons a lot fails: * above 1.0 — guided ABOVE our estimate. It keeps failing because it is priced wrong. That is a repricing conversation, not a discount. * 0.5-1.0 — guided below estimate and repeatedly unsold. The cohort worth a call. * below ~0.5 — check the lease before anything else. A flat guided at a fraction of a freehold estimate is usually short lease, ground rent or a garage, not a bargain. `max_guide_to_avm` filters on that ratio; 0.8 keeps only lots guided at least 20% below estimate. Lots with no guide or no AVM are EXCLUDED when it is set, because an unknown ratio is not a low one. Rows are grouped by ADDRESS, not UPRN. Flat-level UPRN matching in this table collapses separate flats onto one id — five flats in one Nottingham block share a single UPRN — so a per-UPRN count over-reports. `uprn` is returned for onward lookups but is not what rows are counted by, and for a subdivided building it may name a neighbouring unit. Geography is postcode district or area, not area_id — the auction table carries postcodes and the UPRN join is too weak to filter on. UK only. Free.

NameTypeReqDescription
is_commercial–––
limitinteger––
max_guide_to_avm–––
min_auctionsinteger––
offsetinteger––
postcode_area–––
postcode_district–––
yearsinteger––

Structured output declared, but exposes no named fields.

No examples provided.

energy_profile ~144

Energy composition of an area: EPC band mix, mains gas / electric / oil split, heat-pump penetration. `area_id` is the marts area id from `area_resolve` — pass `analytics_area_id`, not `area_id`, if the resolve response gives both. Percentages are of properties HOLDING an EPC, not of all stock, and are whole percentages (0-100). EPCs are lodged on sale or let, so long-held and social housing are under-represented — say so when reporting a figure. UK only. Free.

NameTypeReqDescription
area_idstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

entity_relationships ~88

Recorded relationship evidence from the derived graph. Use canonical ids from search. Cite path provenance and publication dates. Bounded and eventually consistent; missing links do not establish absence, ownership or off-market status. No private ownership payloads are returned. Free.

NameTypeReqDescription
depthinteger––
entity_idstringyes–
kindstringyes–
limitinteger––

Structured output declared, but exposes no named fields.

No examples provided.

entity_search_capabilities ~29

Governed entity families, criteria, coverage and query limits. Call before building searches. Free.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

epc_certificates ~238

Recent Energy Performance Certificates for a property, newest first: up to five mart certificates and up to five raw certificates. Raw readings include exact certificate URL/address, floor level, top-storey indicator, rooms, area and source dates. Compare source vintages; raw certificates may be newer than the property summary. Unknown floor codes remain unknown; habitable rooms are not bedrooms. Changes between certificates do not alone prove building works or a measured-area change. Each carries a `retrofit_gap`, or null where it cannot be computed. Null means unknown, NOT zero — a zero gap means the property is already at its potential, which is a different claim. No certificate is a real answer, not a failure: EPCs are lodged on sale or let, so a long-held property may never have had one. UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uprnintegeryes–

Structured output declared, but exposes no named fields.

No examples provided.

equity_estimate ~162

Current estimated value against the last recorded sale: gain in pounds and percent, and how long it has been held. NOT a loan-to-value: the warehouse holds no mortgage balance, so never describe the result as equity net of debt. The gain is NOMINAL — a 1998 purchase showing +747% has not beaten inflation by that much, and saying so is part of reporting it honestly. A null gain means no recorded sale, not a zero gain. UK only. Free. Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uprnsarrayyes–

Structured output declared, but exposes no named fields.

No examples provided.

grid_capacity ~261

Primary substations near a site, nearest first, with each network operator's published demand and generation headroom, voltage and distance; renewable energy projects (REPD) nearby; and which operators' figures we hold. Headroom is the operator's heat-map figure on its file date, NOT a connection offer. A substation with headroom null says why (the operator's figures are not loaded, or none is published for it); that is never "no capacity". Give exactly ONE scope: `location` ("lat,lng"), `postcode`, `area_geojson` (a red line, GeoJSON in WGS84, at most 150 km² and 64 vertices), `land_id` or `lpa_code` (GSS, e.g. E07000240); anything else is refused before any read and nothing is charged. GB. Free.

NameTypeReqDescription
area_geojson–––
land_id–––
limitinteger––
location–––
min_demand_headroom_mva–––
min_generation_headroom_mva–––
postcode–––
radius_minteger––

Structured output declared, but exposes no named fields.

No examples provided.

h3_density ~139

Hex-binned stock and transaction density for map layers, at H3 resolution 8. DENSITY ONLY. There is no usable price per cell — the hex cube's price column is populated on about 2% of rows and its rental, EPC and per-m2 columns are empty. The response lists what is and is not available; do not offer a price heatmap from this. `tx_n` is the transaction COUNT and `tx_value` is the total in pounds. UK only. Free.

NameTypeReqDescription
area_idstringyes–
limitinteger––

Structured output declared, but exposes no named fields.

No examples provided.

land_assembly ~327

The parcels adjacent to one parcel and who owns each — the first question of a site assembly. Returns each neighbour with its area, land use, constraints and registered proprietor, plus a `combined` block: total area in m² and hectares, the number of distinct owners, how many neighbours already share the subject's proprietor (the parcels needing no second negotiation), how many have no linked owner, and every constraint present across the whole assembly. Address the subject by `parcel_id`, `inspire_id`, `title_number` or `uprn`. Adjacency means a boundary intersecting the subject's buffered by `tolerance_m` (0.5 m default) — registered boundaries rarely share an exact edge, so a strict touch finds almost nothing. Widen `ring_m` to look further than immediate neighbours. A neighbour with no owner is one no registered title has been linked to, NOT one nobody owns — say which when you report it. UK only. Costs 10 credits (10p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
inspire_id–––
limitinteger––
parcel_id–––
ring_minteger––
same_owner_onlyboolean––
title_number–––
tolerance_mnumber––
uprn–––

Structured output declared, but exposes no named fields.

No examples provided.

lha_rate ~314

Local Housing Allowance for a postcode and bedroom category — the ceiling on housing benefit, and therefore the effective rent floor for a benefit-funded tenancy. Nothing else in this API tells you what the state will pay for a property. THE RATE IS WEEKLY. `rate_unit` says `gbp_per_week` and the figure is exactly as the rate-setting bodies publish it. Comparing it against a monthly rent — from `market_facts` rental_value, or a listing's monthly_rent — understates it by about 4.33x. Convert with 52/12, NOT by multiplying by 4: a "monthly" figure built from four weeks is 7.7% low and the error is invisible once it is in a spreadsheet. Resolved through the Broad Rental Market Area containing the postcode, not the local authority — a BRMA is its own geography and they do not align. `brma` names which one answered, and `shared_accommodation_rate` is the separate, lower figure for under-35 single claimants. Needs a FULL postcode (a district is not enough to place a BRMA), and there is no category above 4 bedrooms. Three bodies set these rates: the VOA in England, Rent Service Scotland, and Rent Officers Wales. Free.

NameTypeReqDescription
bedroomsintegeryes–
postcodestringyes–

Structured output declared, but exposes no named fields.

No examples provided.

listing_history ~145

Every marketing snapshot for a property: asking price over time, price reductions, days listed, status changes, agent, image count and whether it had a floor plan. `price_trajectory` appears only when at least two snapshots carry a price. No listing at all is a real answer, not a failure — a property sold off-market or never advertised has none. UK only. Costs 15 credits (15p). Keyed on a UPRN, not an address: call `address_autocomplete` (free) to narrow, then `address_resolve` to get one.

NameTypeReqDescription
uprnintegeryes–

Structured output declared, but exposes no named fields.

No examples provided.

listing_market_series ~311

Monthly supply-side statistics from portal listings for one area, channel and bedroom band: listings added and reduced, reduction share (the market-temperature signal), asking price or rent median and quartiles, £/m² where a floor area is stated, new-build share, agent concentration (HHI, top-3 share), and — on rent rows — gross yield on two bases (cell rent over cell price; per-listing rent over the unit's AVM value), and on sale rows the asking-to-sold ratio and days to completion on listings the registry matched to a sale. THREE THINGS TO SAY WHEN YOU QUOTE THIS. (1) listings_added_n is the NEVER-REDUCED cohort — listings later reduced carry no listing date — so it undercounts new listings by reduction_share. (2) sold_matched_n is a match-rate-limited subset; never divide it by listings_added_n and call it a sell-through rate. (3) There is no days-on-market-to-sale here: the portal records no exit dates. Use listing_stock_series for what is on the market NOW. Free.

NameTypeReqDescription
area_codestring––
area_typestring––
bedroom_bandstring––
channelstring––
end–––
limitinteger––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

listing_stock_series ~178

Live listings on the market by day for one area, channel and bedroom band — the stock-on-market series, with the median age of the dated live stock, median asking price or rent, and the new-build count. The series began 2026-09-05 and grows by one point a day: the portal keeps no exit dates, so stock cannot be reconstructed for the past, only observed forwards. A short series is therefore expected, not missing data. `start` / `end` are dates (YYYY-MM-DD). Free.

NameTypeReqDescription
area_codestring––
area_typestring––
bedroom_bandstring––
channelstring––
end–––
limitinteger––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

long_held_high_equity ~141

Long-held properties in an area carrying a large paper gain — the classic off-market cohort, ordered by gain rather than by value. Typical output for a London district: mid-1990s purchases at £23,000-37,000 now valued at £566,000-758,000. `area_id` is the marts area id from `area_resolve`. UK only. Costs 40 credits (40p).

NameTypeReqDescription
area_idstringyes–
limitinteger––
min_gain_pctnumber––
min_yearsinteger––

Structured output declared, but exposes no named fields.

No examples provided.

lookup_entities ~121

Find public records by title/address text, postcode or public UUID. Exact and lexical lookup uses no model or embeddings; supports token prefixes and bounded typo tolerance in accepted search publications. Returns separate families with UUID detail links and explicit searched coverage. Never claim an unlisted family was searched, or that no match proves nonexistence. For full address matching use address_autocomplete; for a UPRN use address_by_uprn. For attribute criteria use search_entities with the governed query. Free.

NameTypeReqDescription
limitinteger––
qstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

lpa_profile ~164

A planning authority at a glance: its local plans with stage, dates, period and housing requirement; the plan timetable; the Housing Delivery Test result and consequence and other published facts (five-year supply, affordable %, CIL) each with its source and date; Planning Inspectorate appeal outcomes over the last 12 months; and which land layers we hold for it. Pass `lpa_code` (GSS), or a `location`/`postcode` to use the authority there. A five-year-supply figure is the council's own claim; appeal decisions can find otherwise. England and Wales. Free.

NameTypeReqDescription
location–––
lpa_code–––
postcode–––

Structured output declared, but exposes no named fields.

No examples provided.

market_facts ~884

Price, price per sqm and turnover rate for ONE geography × asset class × bedroom band × period, from the pre-cubed area_facts table. Metrics: sales_price, price_psm, turnover_rate are populated today. rental_value, gross_yield and days_on_market are NOT — the pipeline has never backfilled them, so they come back null and are named in the response's `metrics_with_no_data`. Do not compare or rank on them, and do not report a null from them as "no activity"; it means "not collected". turnover_rate is sales as a share of the stock that could have sold. It is the liquidity measure — transaction COUNT is market size, not liquidity (W2 has the largest dwelling stock of any London district and near-bottom turnover). Geography is `postcode` (resolved to its district — the cube has no sector or unit grain) or `lad_code` (a local-authority NAME, e.g. "Lambeth", not a GSS code). There are no LSOA or ward areas in the warehouse; those selectors return 422. To compare AREAS against each other use `market_ranking`, not repeated calls here. For "how many sales" use `market_volume_series` — the `tx_n` here counts only UPRN-matched, non-anomalous sales and runs well short of the registry. The prices are sound; the count is a sample size. READ `tx_decision` BEFORE QUOTING A PRICE. Every row carries one, and it says how much evidence is behind that number. Measured over the whole cube: direct 2.7% 30+ sales in the cell. Quote it plainly. modeled 15.4% 5-29 sales. Sound, lightly smoothed. suppressed 44.0% 1-4 sales. Indicative — say the sample is thin. imputed 17.3% ZERO sales. The price is the prior BORROWED from a parent geography, not a measurement of this cohort. missing 20.7% zero sales and no price at all (null). An `imputed` row looks exactly like a real one — a confident, specific figure — and it repea…

NameTypeReqDescription
asset_class–––
asset_subtype–––
bedroom_band–––
h3_cell–––
lad_code–––
lsoa_code–––
max_periods–––
metrics–––
period–––
postcode–––
ward_code–––

Structured output declared, but exposes no named fields.

No examples provided.

market_forecast ~143

The published house-price index forecast for a postcode district or local authority: the last SETTLED index point as the anchor, then up to seven forecast periods with `lo`/`hi` bands, plus the method and publication grain behind them. Seven is the horizon the index publishes — nothing beyond it is offered, and a forecast is a projection of the smoothed repeat-sales index, not a valuation of any property. UK only. Free.

NameTypeReqDescription
area_codestringyes–
area_typestring––
frequencystring––
horizoninteger––

Structured output declared, but exposes no named fields.

No examples provided.

market_index_series ~522

The published house-price INDEX for one postcode district or local authority: the level per month (base period = 100), the forecast tail flagged, and provenance saying how the index was built. Use this for "how has W14 moved since 2015", "what is the trend in Camden", or to carry a known price to today: price(t2) = price(t1) x value(t2) / value(t1). It is the same series that shapes valuation_full's back-series (`provenance.series_basis` matches its `series_basis`). For PRICES by cohort use market_facts; for sale COUNTS use market_volume_series. `value` is an index level, never a price. `area_code` is a postcode district ("W14"; a full postcode is truncated) with area_type="district", or a local authority NAME ("Camden", "Manchester" — not a GSS code) with area_type="lad". An unknown area is an error naming the nearest matches; read them back to the user. `start` / `end` are periods: "2015", "2015-06" or "2015-Q2"; `end` is inclusive. `limit` keeps the most recent N periods inside the bounds (the default returns the whole monthly series, 1995 to present). READ `provenance` BEFORE QUOTING A MOVE. `index_method` is repeat_sales_area where the area carries its own repeat-sales index, and repeat_sales_national where the area was too thin and the pipeline published the NATIONAL index against it — the turns are then national, not local, and you must say so. `last_settled_period` is the last month the registry has filled; points after it carry is_forecast=true with lo/hi bands. `tx_n` per point is the cube's UPRN-matched sample, not the registry's count. The index is published monthly. frequency="quarterly" returns an empty series with a note wherever no quarterly rows exist. UK only. Free.

NameTypeReqDescription
area_codestringyes–
area_typestring––
end–––
frequencystring––
include_forecastboolean––
limitinteger––
start–––

Structured output declared, but exposes no named fields.

No examples provided.

market_profile ~175

One market profile: an area × residential bedroom cohort with every published measure — asking sale price and rent, completed sale price, gross yield on asking, live stock, new listings, price reductions, turnover and registry sale volume — each with its `basis` sentence, unit, coverage and an observed monthly series sliced to `window` months (default 60); plus the asking price/rent indexes, the whole-area house price index (labelled so; there is no cohort HPI), agent concentration and days to completion, and SearchQuery links to the related completed sales and listings. A measure the source does not publish for the cohort is null with the reason, never zero. Ids come from `search_entities` with entity `market_profiles`. Free.

NameTypeReqDescription
profile_idstringyes–
windowinteger––

Structured output declared, but exposes no named fields.

No examples provided.

Install

How do I install the MarketCode MCP server?

MarketCode is a hosted endpoint at https://mcp.marketcode.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.marketcode.ai

# add to Claude Code
claude mcp add --transport http ai-marketcode-marketcode 'https://mcp.marketcode.ai/mcp'
Common questions

What is the MarketCode MCP server?

MarketCode is an MCP server listed in the public MCP registry as ai.marketcode/marketcode. UK property intelligence with evidence behind the numbers. This page covers its hosted endpoint (https://mcp.marketcode.ai/mcp).

Is the MarketCode MCP server safe to use?

MarketCode scores 71 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the MarketCode MCP server expose?

MarketCode exposes 106 tools: entity_search_capabilities, lookup_entities, ask_question, search_entities, search_summary, and 101 more. Their descriptions and schemas cost roughly 25,845 tokens of context every time the server is loaded.

Does the MarketCode MCP server require authentication?

Yes. MarketCode asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the MarketCode MCP server still maintained?

MarketCode is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.