← All BumiAtlas MCP endpoints

BumiAtlas MCP

Malaysia: JUPEM land lots and PLANMalaysia local-plan zoning

Malaysian cadastral lots from JUPEM and local-plan zoning from PLANMalaysia, as tools an AI assistant can call: find a lot by UPI, lot number or coordinates, and see what the local plan zones it for.

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/malaysia

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-malaysia https://bumiatlas.com/mcp/malaysia
ChatGPT
Settings → Apps & Connectors → Advanced → Developer mode, then Create with the URL and OAuth authentication.
Cursor
in ~/.cursor/mcp.json
{
  "mcpServers": {
    "bumiatlas-malaysia": {
      "url": "https://bumiatlas.com/mcp/malaysia"
    }
  }
}

Tools

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

MY_lot_search
Find Malaysian land lots (JUPEM cadastre) by UPI, lot number or location. query takes a UPI (e.g. 1601400113193; dots, dashes and spaces allowed), a lot number ('Lot 3193', 'PT 1234') with negeri and optionally daerah, mukim and seksyen codes to narrow it, or coordinates as 'latitude, longitude' (e.g. 2.9264, 101.6964). With coordinates it returns the lots 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. Lots are only loaded for some states so far, so no result may just mean the state isn't loaded. Each lot has id (the UPI), negeri and negeriName, daerah, mukim (and mukimName where known), seksyen, lot, keluasan (m²) and bbox. Use MY_lot_get with an id for zoning and the boundary.
query*string
UPI, lot number ('Lot 3193'), or 'latitude, longitude'
negeristring
State code (01 Johor … 16 W.P. Putrajaya) or name, to narrow a lot number
daerahstring
2-digit district code, to narrow a lot number
mukimstring
2-digit mukim code, to narrow a lot number
seksyenstring
3-digit section code, to narrow a lot number
radiusnumber
Search radius in metres around coordinates(default 25)
limitinteger
Maximum results(default 20)
MY_lot_get
One Malaysian lot by UPI (id from MY_lot_search): negeri, daerah, mukim, seksyen and lot, keluasan (area recorded by JUPEM, m²), and zona, the local-plan zones covering it, largest share first: gunatanah (land use, Malay) with gunatanahEn (English), status (Sediada existing, Komited committed, Cadangan proposed) and share of the lot (0–1). Zones covering under 5% of the lot are left out, since zone and lot boundaries come from different surveys; empty zona means no local plan is loaded there. Set include_geometry for the boundary as GeoJSON.
id*string
UPI, e.g. 1601400113193
include_geometryboolean
Include the boundary as a GeoJSON MultiPolygon(default false)
MY_zoning_get
Local-plan land-use zoning (Rancangan Tempatan, PLANMalaysia) at a location in Malaysia, or one zone by id. Pass query as 'latitude, longitude' (e.g. 1.4927, 103.7414), or id. Each zone has id, negeri and negeriName, gunatanah (land use in Malay: Perumahan, Komersial, Industri, Pertanian, …) with gunatanahEn (English), kod (land-use code: class prefix + sub-class digits, e.g. TRM203 housing, PT103 farming), status (Sediada existing, Komited committed: approved but not built, Cadangan proposed by the plan), rancangan (the local plan, e.g. 'RT Daerah Kota Tinggi'), pbt (local authority), tahun (data year), luasHektar (zone area recorded in the plan, hectares), and lot, daerah, mukim and seksyen as the plan writes them (names or bare numbers, not codes). Empty fields are left out. Zoning is loaded for some states only; an empty result means no plan is loaded there, not that the land is unzoned. Where plans overlap, more than one zone is returned, smallest first.
querystring
'latitude, longitude'
idstring
Zone id, e.g. 01-325186
include_geometryboolean
Include each zone's boundary as a GeoJSON MultiPolygon(default false)
MY_lot_image
A map image centred on a Malaysian lot (id, the UPI from MY_lot_search) or a point (query), with every lot in view outlined and labelled with its lot number, so you can see which lot is where. The lot passed as id is drawn in red with a larger label; a query point is a red dot. Returns the lots in view as JSON (label: the lot number, with /2 on a number repeated from another mukim or section; id (UPI), lot, keluasan in m²; labelled: false where its label didn't fit), then one JPEG per basemap. 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. Lot outlines are yellow on imagery and magenta on maps. Lots are only loaded for some states, so elsewhere the image has none. Imagery is not always aligned with the cadastre: 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
UPI from MY_lot_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