Server definition
- Hash
- sha256:c24745322ae1bdbc22d92335acaee1516a0aef779f736bf46676fbeb98a542df
- What it is
- What a remote MCP server returned when asked what it offers: 5 tools
The blob, as servednamed by its sha256
{
"instructions": "UK neighbourhood research from government open data. postcode_lookup resolves a postcode to its geography; postcode_report gathers eleven categories of data about it; postcode_compare lines several postcodes up side by side; postcode_search_datasets and postcode_get_dataset cover the 45 underlying sources for anything the report does not answer directly. Every figure states the geography it describes and the period it covers — an LSOA is a neighbourhood of ~1,500 people and Ofcom mobile coverage describes a whole local authority, so read those before treating a number as being about one address. Coverage varies by UK nation and is reported explicitly rather than silently omitted.",
"tools": [
{
"description": "Compare two to five UK postcodes on chosen categories, aligned measure by measure.\n\nFetches each postcode's report concurrently and lines the facts up in a table, so you can answer \"which of these is better connected / quieter / cheaper\" in one call instead of several.\n\nArgs:\n - postcodes (string[]): 2-5 UK postcodes\n - categories (string[]): 1-6 of demographics, crime, deprivation, prices, broadband, mobile, noise, transport, amenities, schools, environment\n - response_format ('markdown' | 'json'): default 'markdown'\n\nReturns:\n One row per measure with a column per postcode, each cell carrying the value, its band, and the category status for that postcode. Caveats collect anything that makes a row not strictly comparable.\n\nComparability warnings you must respect, and which this tool surfaces:\n - Deprivation ranks from different UK nations are NOT comparable — different indices over different numbers of areas.\n - A measure missing for one postcode because the dataset does not cover that nation is not a low score; the cell says \"out_of_coverage\".\n - Ofcom mobile figures describe a whole local authority, so two postcodes in the same authority will always be identical.\n - Crime counts describe a 1 km square and depend on each police force submitting data; a very low count can be a gap rather than a quiet street.\n\nExamples:\n - \"Which has better broadband, SW11 1AA or M1 1AE?\" -> postcodes=[...], categories=[\"broadband\"]\n - \"Compare these three on crime and schools\" -> categories=[\"crime\",\"schools\"]\n\nDon't use when: you have one postcode (use postcode_report) or want the underlying datasets (use postcode_search_datasets).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"categories": {
"description": "Which categories to compare on. Keep it tight — comparing all eleven across five postcodes produces a very large answer.",
"items": {
"enum": [
"demographics",
"crime",
"deprivation",
"prices",
"broadband",
"mobile",
"noise",
"transport",
"amenities",
"schools",
"environment"
],
"type": "string"
},
"maxItems": 6,
"minItems": 1,
"type": "array"
},
"postcodes": {
"description": "Two to five UK postcodes to compare, e.g. [\"SW11 1AA\", \"M1 1AE\"]",
"items": {
"maxLength": 10,
"minLength": 5,
"type": "string"
},
"maxItems": 5,
"minItems": 2,
"type": "array"
},
"response_format": {
"default": "markdown",
"description": "'markdown' for a side-by-side table, 'json' for the structured comparison",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"required": [
"postcodes",
"categories"
],
"type": "object"
},
"name": "postcode_compare",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"categories": {
"items": {
"type": "string"
},
"type": "array"
},
"caveats": {
"items": {
"type": "string"
},
"type": "array"
},
"postcodes": {
"items": {
"type": "string"
},
"type": "array"
},
"rows": {
"items": {
"additionalProperties": false,
"properties": {
"category": {
"type": "string"
},
"measure": {
"type": "string"
},
"values": {
"additionalProperties": {
"additionalProperties": false,
"properties": {
"band": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"display": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
},
"tone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
]
},
{
"type": "null"
}
]
}
},
"required": [
"display",
"value",
"band",
"tone",
"status"
],
"type": "object"
},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"required": [
"category",
"measure",
"values"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"postcodes",
"categories",
"rows",
"caveats"
],
"type": "object"
}
},
{
"description": "Full registry entry for one dataset, by id.\n\nReturns everything needed to call the source yourself: its home page, machine-readable endpoint, API documentation, format, licence, geographic coverage, update cadence, and the concrete questions it can answer.\n\nArgs:\n - id (string): registry id, e.g. \"police-street-crime\", \"land-registry-ppd\", \"ea-flood\"\n - response_format ('markdown' | 'json'): default 'markdown'\n\nExamples:\n - \"How do I call the police API?\" -> id=\"police-street-crime\"\n - \"What licence is Price Paid under?\" -> id=\"land-registry-ppd\"\n\nErrors:\n - Returns the closest matching ids when the id is not found.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "Registry id, e.g. \"police-street-crime\" — find one with postcode_search_datasets",
"maxLength": 60,
"minLength": 2,
"type": "string"
},
"response_format": {
"default": "markdown",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "postcode_get_dataset",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"api": {
"type": "string"
},
"api_docs": {
"type": "string"
},
"category": {
"type": "string"
},
"coverage": {
"type": "string"
},
"dataset": {
"type": "string"
},
"format": {
"type": "string"
},
"id": {
"type": "string"
},
"licence": {
"type": "string"
},
"link": {
"type": "string"
},
"publisher": {
"type": "string"
},
"questions": {
"items": {
"type": "string"
},
"type": "array"
},
"update_frequency": {
"type": "string"
}
},
"required": [
"id",
"dataset",
"publisher",
"link",
"api",
"api_docs",
"format",
"licence",
"coverage",
"update_frequency",
"questions",
"category"
],
"type": "object"
}
},
{
"description": "Resolve a UK postcode to its geography — coordinates, local authority, ward, constituency, LSOA/MSOA/output area, police force, rural-urban class and deprivation rank.\n\nOne fast call with no downstream data fetching. Use it to check a postcode exists, to get the codes needed for other datasets, or when you only need where somewhere is rather than what it is like.\n\nArgs:\n - postcode (string): UK postcode, spaces optional\n - response_format ('markdown' | 'json'): default 'markdown'\n\nReturns:\n Coordinates, administrative geography, statistical geography codes (LSOA/MSOA/OA — these are the keys most UK open datasets are published against), and the deprivation rank with the index it came from.\n\nExamples:\n - \"Where is SW11 1AA?\" -> postcode=\"SW11 1AA\"\n - \"What LSOA covers M1 1AE?\" -> postcode=\"M1 1AE\"\n - \"Is XY1 2AB a real postcode?\" -> postcode=\"XY1 2AB\" (returns an error with suggestions)\n\nDon't use when: you want data about the area — use postcode_report instead.\n\nNote: deprivation ranks are NOT comparable between UK nations. Each nation ranks its own areas against its own index, over a different number of areas; the index and its size are returned so you do not compare them by mistake.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"postcode": {
"description": "A UK postcode, e.g. \"SW11 1AA\"",
"maxLength": 10,
"minLength": 5,
"type": "string"
},
"response_format": {
"default": "markdown",
"description": "'markdown' to read, 'json' for the structured record",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"required": [
"postcode"
],
"type": "object"
},
"name": "postcode_lookup",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"constituency": {
"type": "string"
},
"country": {
"type": "string"
},
"deprivation_index": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"deprivation_rank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"latitude": {
"type": "number"
},
"local_authority": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"code"
],
"type": "object"
},
"longitude": {
"type": "number"
},
"lsoa": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"code"
],
"type": "object"
},
"msoa": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"code"
],
"type": "object"
},
"national_park": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"output_area": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"police_force": {
"type": "string"
},
"postcode": {
"type": "string"
},
"region": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"rural_urban": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"ward": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"code"
],
"type": "object"
}
},
"required": [
"postcode",
"latitude",
"longitude",
"country",
"region",
"local_authority",
"ward",
"constituency",
"lsoa",
"msoa",
"output_area",
"police_force",
"rural_urban",
"national_park",
"deprivation_rank",
"deprivation_index"
],
"type": "object"
}
},
{
"description": "Full neighbourhood report for one UK postcode, assembled live from UK government open data.\n\nCovers eleven categories: demographics (Census 2021), crime (data.police.uk), deprivation (IMD/WIMD/SIMD/NIMDM), property prices (HM Land Registry), broadband and 5G (Ofcom), noise (Defra), transport, amenities (OpenStreetMap), schools (DfE register: name, phase and distance only, no Ofsted grades) and planning constraints (Planning Data platform, Environment Agency).\n\nEvery figure carries the geography it describes (a postcode, an LSOA of ~1,500 people, or a whole local authority), the period it covers, and a benchmark where one exists. Read those: a crime count describes a 1 km square, and Ofcom mobile coverage describes an entire local authority, not the street.\n\nArgs:\n - postcode (string): UK postcode, spaces optional\n - categories (string[], optional): subset to fetch; omit for all eleven\n - include_sources (boolean): append publisher and licence per category (default false)\n - response_format ('markdown' | 'json'): default 'markdown'\n\nReturns:\n Per category: a status, a one-paragraph summary, the facts (label, value, band, benchmark, geography, period, source id) and any caveats.\n\n Statuses that are normal rather than failures:\n - \"out_of_coverage\": the dataset genuinely does not cover this nation. Census tables are England & Wales; police.uk excludes Scotland; Planning Data, Defra noise and the DfE school register are England-only. The reason and the devolved equivalent are given.\n - \"unavailable\": a pre-built extract has not been generated for this area yet (noise, currently).\n - \"partial\": some sources answered and some did not; check notes.\n\nExamples:\n - \"What's SW11 1AA like?\" -> postcode=\"SW11 1AA\"\n - \"Is the broadband any good at M1 1AE?\" -> postcode=\"M1 1AE\", categories=[\"broadband\",\"mobile\"]\n - \"Crime and schools near LA23 1AA\" -> postcode=\"LA23 1AA\", categories=[\"crime\",\"schools\"]\n\nErrors:\n - \"No such postcode\" with suggestions when the postcode does not exist\n - Terminated postcodes are reported with the year they were withdrawn\n\nNot a survey, valuation or conveyancing search. Check anything decision-critical against the source.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"categories": {
"description": "Which sections to fetch. Omit for all eleven. Fetching only what you need is faster and much smaller — e.g. [\"crime\",\"schools\"] for a family-safety question.",
"items": {
"enum": [
"demographics",
"crime",
"deprivation",
"prices",
"broadband",
"mobile",
"noise",
"transport",
"amenities",
"schools",
"environment"
],
"type": "string"
},
"type": "array"
},
"include_sources": {
"default": false,
"description": "Append the publisher and licence of each dataset used (default false)",
"type": "boolean"
},
"postcode": {
"description": "A UK postcode, with or without a space, e.g. \"SW11 1AA\" or \"m11ae\"",
"maxLength": 10,
"minLength": 5,
"type": "string"
},
"response_format": {
"default": "markdown",
"description": "'markdown' to read, 'json' for the full structured facts",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"required": [
"postcode"
],
"type": "object"
},
"name": "postcode_report",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"categories": {
"items": {
"additionalProperties": false,
"properties": {
"facts": {
"items": {
"additionalProperties": false,
"properties": {
"band": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"benchmark": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"display": {
"type": "string"
},
"geography": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"label": {
"type": "string"
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"source_id": {
"type": "string"
},
"tone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"unit": {
"type": "string"
},
"value": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
]
}
},
"required": [
"label",
"value",
"display",
"source_id"
],
"type": "object"
},
"type": "array"
},
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"notes": {
"items": {
"type": "string"
},
"type": "array"
},
"status": {
"type": "string"
},
"summary": {
"type": "string"
}
},
"required": [
"id",
"label",
"status",
"facts",
"notes"
],
"type": "object"
},
"type": "array"
},
"country": {
"type": "string"
},
"local_authority": {
"type": "string"
},
"postcode": {
"type": "string"
}
},
"required": [
"postcode",
"local_authority",
"country",
"categories"
],
"type": "object"
}
},
{
"description": "Search a curated registry of 45 UK open datasets and APIs for property and neighbourhood research.\n\nEach entry records the dataset's home page, its machine-readable endpoint, format, licence, geographic coverage, update cadence, and the concrete questions it can answer. Use it to find the right source for something this server does not report directly — EPC ratings, planning applications, flood risk, council tax bands, bus timetables, air quality, ground stability, land ownership.\n\nArgs:\n - query (string, optional): free text over name, publisher, category, endpoint and questions\n - category (string, optional): category prefix, e.g. \"Crime\", \"Transport\", \"Environment\"\n - limit (number): 1-45, default 10\n - offset (number): pagination offset, default 0\n - response_format ('markdown' | 'json'): default 'markdown'\n\nReturns:\n { total, count, offset, has_more, next_offset, datasets: [{ id, dataset, publisher, category, api, licence, coverage, update_frequency }] }\n\nExamples:\n - \"Where do I get EPC data?\" -> query=\"EPC\"\n - \"What flood datasets are there?\" -> query=\"flood\"\n - \"List every transport source\" -> category=\"Transport\", limit=20\n\nFollow up with postcode_get_dataset for the full entry including API docs and the questions it answers.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"category": {
"description": "Filter by category prefix, e.g. \"Crime\", \"Transport\", \"Environment\"",
"maxLength": 80,
"type": "string"
},
"limit": {
"default": 10,
"description": "Maximum results (default 10)",
"maximum": 45,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Results to skip, for pagination",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"query": {
"description": "Free text matched against dataset name, publisher, category, API endpoint and the questions each dataset answers. Omit to list everything.",
"maxLength": 200,
"type": "string"
},
"response_format": {
"default": "markdown",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"type": "object"
},
"name": "postcode_search_datasets",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"type": "number"
},
"datasets": {
"items": {
"additionalProperties": false,
"properties": {
"api": {
"type": "string"
},
"category": {
"type": "string"
},
"coverage": {
"type": "string"
},
"dataset": {
"type": "string"
},
"id": {
"type": "string"
},
"licence": {
"type": "string"
},
"publisher": {
"type": "string"
},
"update_frequency": {
"type": "string"
}
},
"required": [
"id",
"dataset",
"publisher",
"category",
"api",
"licence",
"coverage",
"update_frequency"
],
"type": "object"
},
"type": "array"
},
"has_more": {
"type": "boolean"
},
"next_offset": {
"type": "number"
},
"offset": {
"type": "number"
},
"total": {
"type": "number"
}
},
"required": [
"total",
"count",
"offset",
"has_more",
"datasets"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:c24745322ae1bdbc22d92335acaee1516a0aef779f736bf46676fbeb98a542df | sha256sum