← All BumiAtlas MCP endpoints

BumiAtlas MCP

Thailand: DOL parcels and public land, comprehensive-plan zoning

Thai land parcels and NSL public land from the Department of Lands, and comprehensive-plan zoning from DPT and Bangkok, as tools an AI assistant can call: what is at a coordinate, who holds public land, and what the plan allows.

Server URL

Streamable HTTP with OAuth. The first time you connect, your client opens a browser window to sign in with Google; no API key needed.

https://bumiatlas.com/mcp/thailand

Connect

Claude (claude.ai, desktop)
Settings → Connectors → Add custom connector, paste the URL, then Connect and sign in with Google.
Claude Code
claude mcp add --transport http bumiatlas-thailand https://bumiatlas.com/mcp/thailand
ChatGPT
Settings → Apps & Connectors → Advanced → Developer mode, then Create with the URL and OAuth authentication.
Cursor
in ~/.cursor/mcp.json
{
  "mcpServers": {
    "bumiatlas-thailand": {
      "url": "https://bumiatlas.com/mcp/thailand"
    }
  }
}

Tools

Tool names and descriptions are in English, which models understand best; your assistant still answers in your language.

TH_parcel_search
Find Thai land parcels and public land (DOL LandsMaps) at a location, or public land by its NSL certificate id. query takes coordinates as 'latitude, longitude' (e.g. 13.8231, 100.5100), or an NSL id (province abbreviation + number, e.g. UB5004). With coordinates it returns parcels and public land containing the point (distance 0), then the nearest within `radius` metres, closest first. To search an address, geocode it first; a radius of 25–100 m helps with geocoded points. Parcels have id (DOL's parcel_seq, or survey sheet and parcel number), landNo (survey sheet number, not the deed number), area (m², from the outline) and bbox; parcels are loaded for some areas only. Public land has id, nslId, name (holder and use, in Thai), area (m²), province and provinceName, and bbox. There is no search by deed number or owner: the public data has neither. Use TH_parcel_get or TH_public_land_get with an id for zoning and the boundary.
query*string
'latitude, longitude', or an NSL id like UB5004
radiusnumber
Search radius in metres around coordinates(default 25)
limitinteger
Maximum results of each kind(default 20)
TH_parcel_get
One Thai parcel by id (DOL's 20-digit parcel_seq or survey-sheet id like 5036-2-4806-15-120, from TH_parcel_search): landNo (survey sheet number, not the deed number), area (m², computed from the outline: DOL's public layer has no recorded area) and zona, the comprehensive-plan zones covering it, largest share first: landUse with landUseEn, use (DPT code), plan, planLevel (town, province or bangkok) and share of the parcel (0–1). Where a town plan covers the parcel, the province plan's zones are left out. Zones covering under 5% are left out too. Set include_geometry for the boundary as GeoJSON.
id*string
Parcel id from TH_parcel_search: DOL's 20-digit parcel_seq (20000241000000000046) or, for parcels without one, survey sheet and parcel number (5036-2-4806-15-120)
include_geometryboolean
Include the boundary as a GeoJSON MultiPolygon(default false)
TH_public_land_get
One plot of Thai public land with an NSL certificate (นสล.) by id (from TH_parcel_search): nslId, name (holder and use in Thai, e.g. กระทรวงมหาดไทย (ป่าช้าสาธารณประโยชน์) = Ministry of Interior, public cemetery), area (m², from the certificate's rai-ngan-wa), survey scale, UTM map sheet and parcel number, moo (village number), village, tambon, amphoe, province and provinceName, office (responsible land office), and zona, the comprehensive-plan zones covering it (as in TH_parcel_get). Set include_geometry for the boundary as GeoJSON.
id*integer
Public land id from TH_parcel_search
include_geometryboolean
Include the boundary as a GeoJSON MultiPolygon(default false)
TH_zoning_get
Comprehensive-plan (ผังเมืองรวม) land-use zoning at a location in Thailand, or one zone by id. Pass query as 'latitude, longitude' (e.g. 13.7563, 100.5018), or id. Each zone has id, plan (DPT's plan code; xx00000 is a province-wide plan) and planName, planLevel (town, province or bangkok), province and provinceName, landUse (RESIDENTIAL_LOW, COMMERCIAL, INDUSTRY, COMMUNITY, RURAL_AGRICULTURE, …) with landUseEn, use (DPT land-use code), block, Bangkok's zone and subZone (Thai numerals), far (floor area ratio), bcr (building coverage ratio), osr (open space ratio, %), maxHeight (m), minLot (m²), and area (m², the whole zone polygon). Empty fields are left out. Town plans come first: where one covers the point it applies, and the province plan's COMMUNITY zone under it only marks the town. An empty result means no plan is loaded there.
querystring
'latitude, longitude'
idstring
Zone id, e.g. 1306102-152
include_geometryboolean
Include each zone's boundary as a GeoJSON MultiPolygon(default false)
TH_parcel_image
A map image centred on a Thai parcel (id, DOL's parcel id from TH_parcel_search) or a point (query), with every parcel in view outlined and labelled with its land number (landNo, from the survey sheet, not the deed number), so you can see which parcel is where. The parcel passed as id is drawn in red with a larger label; a query point is a red dot. Returns the parcels in view as JSON (label: the land number, with /2 on a repeated one and #n on parcels without one; id, landNo, area in m² from the outline; labelled: false where its label didn't fit), then one JPEG per basemap. Public land isn't drawn. Basemaps: satellite (Esri World Imagery, often a few years old), hybrid (the same imagery with road and place names), streets and topo (Esri's street and topographic maps). Pass several to compare, e.g. ['satellite', 'streets'] to match buildings with street names. Parcel outlines are yellow on imagery and magenta on maps. Parcels are only loaded for some areas, so elsewhere the image has none. Imagery is not always aligned with DOL boundaries: offsets of a few metres are possible. A scale bar is at bottom left. Labels are left off where they'd overlap; call again with a smaller radius to read them. Each image costs about as much context as 1,000 words, so ask for what you need.
idstring
Parcel id from TH_parcel_search, drawn in red
querystring
'latitude, longitude' to centre on instead of a parcel
radiusnumber
Metres from the centre to the image edge. Default: fits the parcel with a margin, or 80 m around a point
basemapsarray
One image per basemap(default ["satellite"])
sizeinteger
Image width and height in pixels(default 768)

Try asking

About the data