PluginWorld
Sa

sar-geo-mcp

MCP

Enables Claude to plan search-and-rescue operations on CalTopo maps by measuring terrain, staging areas, hasty search lines, parking, helicopter landing zones, egress routes, walking-time rings, hospitals, and urban assignments, and by exporting results as GeoJSON draft assignments. It is read-only and returns facts for human decision-making.

@paulzcgu · MIT License · updated today

SECURITY

B

SCORE

60

STARS

▲ 0

PLUG IN

git clone https://github.com/paulzcgu/sar-geo-mcp.git

See the README to configure this MCP server

README

sar-geo-mcp

Search and rescue planning tools for Claude, built on CalTopo maps.

SAR Geo gives Claude forty-four tools for planning a search: read a CalTopo map, stage the terrain around a place last seen, and ask for hasty search lines, parking, helicopter landing zones, the way out, walking-time rings, the nearest hospitals and trauma centers, and urban assignments of one size. Four scenarios run several of those in one call: a medevac, the initial response, an urban search and an assignment debrief. Results come back as facts with GeoJSON files CalTopo imports as draft assignments.

It is read-only: it never writes to a CalTopo map. The tools measure; the people running the search decide.

Install

Claude Desktop (no coding needed)

  1. Get sar-geo.mcpb from whoever shared SAR Geo with you.
  2. Open it, and click Install in Claude Desktop (macOS or Windows). Claude warns that the extension is not verified by Anthropic; that is expected for anything not in Anthropic's directory.
  3. Fill in any keys you have (all optional; see Keys below) and save.

It updates itself: each time Claude Desktop starts it, it runs the newest release. Ask Claude "check for a sar-geo update" to see your version, or set Pin version to stay on one, such as during an operation.

From source, for any MCP client

pip install "sar-geo-mcp[mcp]"
claude mcp add sar-geo -- sar-geo-mcp

Developers: see AGENTS.md.

Keys

Every key is optional. Without any, public CalTopo maps, terrain, OpenStreetMap, parking, hasty lines, egress and hospitals all work. Ask Claude "what's my sar-geo key status?" to see which are set and what each unlocks.

Key Turns on Where to get it
CalTopo WMS token Terrain pictures, slope shading, the canopy panel, landing-zone imagery, urban blocks CalTopo → your name → Your Account → API Access: the six characters between /api/ and /wms (paid plan or team)
CalTopo credential ID + key Private and team maps CalTopo → Your Account → Credentials (a read-only team credential is enough)
Mapbox token Mapbox satellite pictures of landing zones account.mapbox.com
Google Maps key Google satellite pictures of landing zones Google Cloud console, Maps Static API (its terms limit how images may be used)

From source, set them as ZA_WMS_TOKEN, ZA_CALTOPO_ID and ZA_CALTOPO_KEY (or a cts.ini), ZA_MAPBOX_TOKEN and ZA_GOOGLE_MAPS_KEY.

Where files go

Ask Claude to save a file (an export, an imagery chip) and it goes in Documents/sar_geo/<chat folder>, one folder per chat, and opens in Finder or Explorer. Downloaded terrain is cached out of the way, in ~/Library/Caches/sar_geo on a Mac and %LOCALAPPDATA%\sar_geo\cache on Windows, and is downloaded again if deleted.

The tools

Each tool carries its layer as an MCP tag - component, feature or scenario - so a client can list one layer; AGENTS.md says which tool is in which. The four scenarios, last in the table, call several features at once and answer in compact sections, each with its own status and the exact feature call that returns the full answer.

Tool What it answers
list_assignments What assignments are on this map, and where
get_assignment One assignment in full — geometry, description, centre
list_map_features Everything on the map, filterable by class
parse_coordinate Read a coordinate a person wrote or said
convert_coordinate The same point in DD, DDM, DMS, UTM, and MGRS/USNG
distance_bearing Geodesic ground distance and initial bearing
point_in_geometry Is this clue inside the assignment, and how far from the edge
geometry_bounds Bounding box and centre of any GeoJSON geometry
boundary_clearance How much of a boundary's inside surrounds this, and whether the way in stays inside it
buffer_geometry A line widened into the ribbon CalTopo's Buffer draws, so much each side; single_ring cuts a loop's hole open so CalTopo keeps it
prefetch_map Download a map's ground now, before losing connectivity
cache_status What the tile cache holds, by tier
evict_cache Trim the cache to a ceiling, oldest maps first
save_export Copy a file a tool wrote (an export GeoJSON, a chip) to ~/Documents/sar_geo/<chat folder> and show it in Finder or Explorer
key_status Which optional keys are set (never their values), what each unlocks and where to get it
check_for_update The version running against the newest on PyPI, and how to update
prepare_terrain Stage one assignment's ground; returns the handle everything below names
terrain_metrics Everything measured for a staged assignment — the debrief bundle
identify_features Just the feature kinds you name — steep bands, drainages, clearings, cliff bands, cliff_pitch (ranked by the drop you would rig on), routes, ingress
list_feature_kinds Which feature kinds identify_features can look for, with their assumptions
slope_stats Slope statistics inside one named shape — "quantify that sidewall"
slope_shading CalTopo's slope bands beside this package's own, and the patches where the DEM reads shallower
shaded_relief Terrain to look at, and benches OpenStreetMap has not got - clean and OSM-overlaid, plus measured lineaments
unmarked_paths Roads and trails OpenStreetMap has not got, from Forest Service, BLM and USGS inventories, DEM benches and NAIP imagery at once - each ranked by how many independent sources saw it, closed Forest Service roads included, junction gaps bridged along flat ground, and written to a GeoJSON file CalTopo imports as coloured lines
elevation_profile Elevation along a drainage centreline — how steep is the channel
coverage_for Coverage and gaps for a staged assignment, from named GPS tracks
prepare_area Stage the ground around a place last seen (point + radius, in m, km, ft, yd or mi) or a polygon; returns an aoi- handle that never goes stale, and the area's outline to draw
assignment_norms What real assignments look like, from a corpus of past searches, with provenance; per-resource target sizes
site_facts Can a team occupy and work this ground - drop, span, the bench above, the landing below, and cover on all three
describe_boundary What an assignment's or drawn shape's edges follow, how it was drawn, what it holds, against corpus norms
hasty_candidates Day-1 hasty candidates around a staged area: trails and roads as lines by default, mapped waterways as corridors when include names them (no drainages or ridges), measured and ordered by distance
parking_candidates Where a search can park near a staged area: public lots and public hardstand, nearest first, each with a point guaranteed to sit inside it and, since OSM rarely names a car park, the nearest named trail or road within 150 m
lz_candidates Where a helicopter can put down near a staged area: open, flat patches graded preferred, minimal or marginal per the CalTopo safety course, with a touchdown point, the nearest power line or "unknown", the road it touches or sits beside, the lot it is in, and an imagery chip to look at
egress_routes The way out on the ground from a location: the quickest exit a 2WD vehicle can reach and the quickest a 4x4 can, on foot or by litter, each with its route, minutes, distance, climb and descent, and the road, lot and gates it ends on
travel_time_rings Rings of equal walking time round a place last seen - the travel-time counterpart of a radius circle - stretched along trails, pinched by cliffs and unbridged rivers, slowed by creek crossings and brush
nearest_medical_facilities The closest medical center, trauma center and pediatric trauma center to a point, ranked by road time, as a table: trauma level, helipad Y/N, road distance and time, air time where there is a helipad, phone and address - plus markers to draw. Stateless
populated_areas Urban and suburban search blocks: the built-up lots along each street, both sides and the street between them, outlined as one block per street from CalTopo's parcel and structures layers; apartment complexes, schools and shopping centres as blocks of their own
urban_assignments Those blocks merged into assignments of about one size (the corpus median for the resource, or a target you give), never across an arterial
caltopo_export Any candidate set as a GeoJSON file CalTopo imports as DRAFT assignments, with the search area and house markers - a file, never a write to CalTopo
get_candidate One candidate in full, geometry included, by id
plan_medevac A patient at a point, in one call: the landing zones nearest them, the 2WD and 4x4 exits by litter and on foot, and the nearest hospitals and trauma centers - compact sections, each with its own status and the exact call for the full answer, plus one GeoJSON file CalTopo imports. Facts, no verdict
plan_initial_response The first operational period from a place last seen, in one call: the hasty lines a team can run (trails and roads by default; waterways through overrides), the nearest parking, walking-time rings, the landing zones nearest the place and the nearest hospitals - compact sections, each with its own status and the exact call for the full answer, plus the hasty lines as DRAFT CalTopo assignments and a second GeoJSON file of everything else. Facts, no verdict
plan_urban_search An urban or suburban search round a place last seen, in one call: the populated blocks grouped into assignments of about one size, the nearest parking and the nearest hospitals - compact sections, each with its own status and the exact call for the full answer, plus the assignments as DRAFT CalTopo assignments and a second GeoJSON file of parking and hospitals. Needs the CalTopo WMS token for the blocks. Facts, no verdict
debrief_assignment A team back from a CalTopo assignment, in one call: what the ground was (slope, landform, drainages, vegetation, sweep width, ways in), how much of it the team's GPS tracks covered and where the gaps are - each gap's size, the terrain it leaves unsearched and a point inside it - and the terrain features worth asking about - compact sections, each with its own status and the exact call for the full answer, and the boundary check said once. Facts, no verdict

parse_coordinate handles decimal degrees, degrees-decimal-minutes, DMS, UTM, and MGRS/USNG, and it refuses to guess: a transposed pair or a dropped western minus is resolved only against a reference point you supply, and a grid reference that decodes far from that point comes back unparsed rather than plausible. A wrong coordinate is worse than no coordinate.

Documentation

Each tool describes itself to Claude, so asking Claude how to use one is the quickest guide. AGENTS.md has the architecture and how to change, test and release the code.

Data

Elevation (USGS 3DEP), vegetation type (LANDFIRE), roads and trails (OpenStreetMap, Forest Service, BLM, USGS), hospitals (HIFLD), road routing (OSRM), state boundaries (Census) and NAIP imagery are public. CalTopo's map layers need the WMS token above.

Origin

Extracted from a private SAR debrief-automation project, which is now its first consumer.

License

MIT - see LICENSE. It comes with no warranty: SAR Geo measures ground and reports facts, and every decision in a search stays with the people running it.

SIMILAR PLUGINS