unesco-heritage-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@unesco-heritage-mcp-serverfind World Heritage sites near Kyoto within 200 km"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Overview
Three UNESCO datasets from the UNESCO Data Hub: the World Heritage List, the Intangible Cultural Heritage lists, and the World Network of Biosphere Reserves. Search sites (the List of World Heritage in Danger included), intangible heritage elements, and biosphere reserves; read full records; find sites or reserves near a point; and turn country names into the ISO codes the filters take. Runs as a stdio process or a local Streamable HTTP server, with no API key.
Tools
Tool | Description |
| Search World Heritage sites by keyword, country, category, region, criteria, inscription years, Danger-list or transboundary status, or distance from a point |
| Fetch a site's full record: statement of Outstanding Universal Value, criteria with meanings, component parts, coordinates, and image credit |
| Search the three intangible heritage lists by keyword, country, list, inscription years, multinational status, or linked World Heritage site |
| Fetch an element's full record: description, list, countries, concept terms, linked sites, and image credit |
| Search biosphere reserves by keyword, country, region, MAB regional network, designation years, transboundary or SIDS status, or distance from a point |
| Fetch a reserve's full record: ecological and socio-economic profile, zoned areas and population, review years, and coordinates |
| Decode criteria, countries (name to ISO code), regions, intangible heritage lists, and MAB networks; report dataset coverage and data dates |
Resources
Resource | Description |
| One World Heritage site record |
| One intangible heritage element record |
| One biosphere reserve record |
Each resource mirrors a get tool, so tool-only clients lose nothing.
Related MCP server: open-meteo-mcp-server
Capability reference
unesco_search_sites tool
Filters:
query,country(ISO 3166-1 alpha-2 or alpha-3),category,region,criteria(every listed criterion required),in_danger,transboundary,inscribed_from/inscribed_to, andnear(latitude,longitude,radius_kmup to 5000, default 100)Up to 50 sites per page (default 20), continued with
next_cursor;sorttakesrelevance,name,inscribed_newest,inscribed_oldest,area_largest,danger_listed_newest, ordistancein_danger: trueis the List of World Heritage in Danger;totalCountandfacets(category, region, Danger status, criteria, top 10 countries) cover the whole match, and rows carrymatched_inanddistance_kmwhenqueryornearis set
unesco_get_site tool
One site by
id_no: a number, a digit string, or the site's whc.unesco.org page URL;max_componentslists 0–1000 component parts (default 20)Description, statement of Outstanding Universal Value,
criteria[]with meanings andsource: "recorded" | "inferred", States Parties with ISO codes, coordinates, area,secondary_years, Danger-list year, names in six languages, and the mainimagewith its creditcomponents_totalis UNESCO's count andcomponents_unparsedthe entries that could not be read; an unknown id fails assite_not_found
unesco_search_intangible_heritage tool
Filters:
query,country,list(Representative List, Urgent Safeguarding List, Register of Good Safeguarding Practices;RL/USL/Art18accepted),multinational,world_heritage_site(anid_no), andinscribed_from/inscribed_toUp to 50 elements per page (default 20), continued with
next_cursor; rows omit the description and carry primaryconceptsand linkedworld_heritage_sitesfacetscover list, multinational status, the top 10 countries, and the top 10 concept terms
unesco_get_intangible_heritage_element tool
One element by
ich_ref: a number, a digit string, or the element's ich.unesco.org page URLDescription, list, countries, inscription year, primary and secondary
concepts, linkedworld_heritage_sites, UNESCO page, and the mainimagewith its caption and credit; an unknown ref fails aselement_not_found
unesco_search_biosphere_reserves tool
Filters:
query(name, introduction, and ecological or socio-economic text; there is no biome field, so search habitat words),country,region,regional_network(name or acronym),transboundary,sids,designated_from/designated_to, andnearUp to 50 reserves per page (default 20), continued with
next_cursor;sorttakesrelevance,name,designated_newest,designated_oldest,area_largest, ordistanceA transboundary reserve appears once per participating country, each with its own
mab_id;facetscover region, regional network, transboundary and SIDS status, and the top 10 countries
unesco_get_biosphere_reserve tool
One reserve by
mab_id, matched without regard to case or accentsIntroduction, ecological and socio-economic characteristics, terrestrial and marine area by zone, population by zone, designation, extension, renaming, and periodic-review years, coordinates, website, and UNESCO page
Areas (hectares) and populations pass through as recorded: zone sums can differ from totals, and a population of
0can mean none or unreported; an unknown id fails asbiosphere_reserve_not_found
unesco_list_reference tool
topic:criteria,countries,regions,intangible_lists,biosphere_networks, ordatasetsfilterkeeps matching rows; oncountries, a country name, an ISO code, or a common former name returns the codes everycountryinput acceptsdatasetsreports each dataset's record count,data_as_of, license, attribution line, and coverage notes
unesco://site/{id_no} resource
The
unesco_get_siterecord with up to 20 components (components_totalcarries the full count), plussources, asapplication/jsonid_nocomes fromunesco_search_sites
unesco://intangible-heritage/{ich_ref} resource
The
unesco_get_intangible_heritage_elementrecord plussources, asapplication/jsonich_refcomes fromunesco_search_intangible_heritage
unesco://biosphere-reserve/{mab_id} resource
The
unesco_get_biosphere_reserverecord plussources, asapplication/jsonmab_idcomes fromunesco_search_biosphere_reserves; percent-encode an id that holds non-ASCII letters
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
UNESCO-specific:
Three UNESCO Data Hub datasets: the World Heritage List (
whc001), the Intangible Heritage List (ich001), and the Man and the Biosphere Programme (mab001)Each dataset loads on first use as an in-memory snapshot (two upstream requests) and refreshes every 24 hours; searching, facets, and distance run locally, and a failed refresh keeps serving the previous snapshot
Upstream traffic is paced at two concurrent requests and at most 200 a day, with a cooldown after a 429 that honors
Retry-AfterCriterion (vi), which UNESCO's criteria fields omit, is inferred from each site's statement of Outstanding Universal Value and marked as inferred wherever it appears
Country inputs take ISO 3166-1 alpha-2 or alpha-3 codes in any case and match every transboundary site or multinational element a country takes part in; site and element ids also accept their UNESCO page URLs
Agent-friendly output:
Attribution on every response:
sourcesnames each dataset with itsdata_as_ofdate, license, and credit lineSearch results report the whole match:
totalCount,facets, and anapplied_filtersecho of the filters and sort the server ranKeyword matching is word-prefix with every word required, and
matched_insays which field tier matched; a zero-hitnoticenames the filter whose removal would match the most recordsTyped error contracts (
unknown_country,invalid_year_range,sort_needs_input,cursor_mismatch,*_not_found,snapshot_unavailablewithretryAfter) carry a recovery hint naming the next call
Data and licensing
All three datasets come from the UNESCO Data Hub and are licensed CC BY-SA 4.0. Credit UNESCO when you reuse the data; every response's sources block carries a ready-made credit line. Under ShareAlike, adapted data must be shared under the same license.
Images are not covered by that license. Each World Heritage and intangible heritage image keeps its own copyright, and its holder and photographer travel with the image record. The server returns image links but never fetches or proxies them.
This server is an independent project and is not affiliated with or endorsed by UNESCO.
Getting started
Add the following to your MCP client configuration file.
{
"mcpServers": {
"unesco-heritage-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/unesco-heritage-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"unesco-heritage-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/unesco-heritage-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"unesco-heritage-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/unesco-heritage-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API key or account: the UNESCO Data Hub is open.
Installation
Clone the repository:
git clone https://github.com/cyanheads/unesco-heritage-mcp-server.gitNavigate into the directory:
cd unesco-heritage-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env to change the transport, port, or log levelConfiguration
The server has no settings of its own; these framework variables apply.
Variable | Description | Default |
| Transport: |
|
| HTTP server port. |
|
| HTTP server host. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Enable OpenTelemetry. |
|
See .env.example for the common framework overrides.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
Directory | Purpose |
|
|
| Tool definitions ( |
| Resource definitions. One record resource per dataset. |
| Input schemas and normalizers, enrichment fields, and markdown helpers shared by the tools and resources. |
| UNESCO Data Hub service: snapshot loading and refresh, row validation and repair, search and facets, the ISO 3166 table, and vocabularies. |
| Unit tests over synthetic fixtures, mirroring the |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging andctx.enrichfor attribution, totals, and noticesRegister new tools and resources in the
createApp()arrays insrc/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Search GeoNames places, walk admin hierarchies, reverse geocode, get postal codes and country info.
811Free GeoNames MCP: countries, cities, POIs, distance & nearby. Remote HTTP + agent token signup.
iso-codes MCP — lookups against the Debian iso-codes project JSON.
Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLook up countries, timezones, periodic table elements, physical constants, units, HTTP status codes, and MIME types via MCP. STDIO or Streamable HTTP.200 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceGeocode places, fetch global weather forecasts, ERA5 historical climate, marine conditions, air quality, and terrain elevation via MCP. Provides 11 tools over STDIO or Streamable HTTP.683 npm8Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables querying iNaturalist's wildlife observation data through MCP, including searching sightings by area, date, or taxon; reading identification threads; ranking species; charting phenology; and finding look-alike taxa. Supports stdio and Streamable HTTP transports with keyless, read-only access.518 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables querying UNHCR refugee, IDP, stateless populations, asylum decisions, returns, and resettlement statistics via MCP, including staging large datasets for SQL queries. Supports stdio or Streamable HTTP transports.212 npm1Apache 2.0