geo-mcp
The geo-mcp server provides OSM-backed multimodal (walk + transit) navigation and geospatial tools for LLM applications without proprietary map APIs.
Geocoding & Reverse Geocoding: Convert place names/addresses to coordinates (
geocode) and coordinates to human-readable locations (reverse_geocode).Multimodal Route Planning: Plan walk + transit routes with adaptive strategies (A* for short trips, hierarchical transit-skeleton for longer journeys) and optional deferred processing (
plan_route).Area Loading & Caching: Load and cache OSM walk and transit graph data for a place or bounding box, enabling offline/local processing and faster queries (
load_area).Points of Interest Discovery: Find nearby OSM POIs such as cafes, pharmacies, and parks by category and radius (
find_nearby).Transit Options Lookup: List nearby transit stops and the lines serving them (
list_transit_options).Area Description: Get a structured summary of an area's major roads, neighborhoods, and landmarks for geographic context (
describe_area).Network Snapping: Snap coordinates to the nearest graph node (intersection or transit stop) for precise routing (
snap_to_network).Asynchronous Job Management: Submit, check, cancel, and list background jobs for long routing tasks (
submit_route,get_job,cancel_job,list_jobs).Offline Operation & Resilient Data Handling: Operate offline after initial OSM ingestion; uses retries, circuit breakers, and deadlines for online operations.
Provides tools for geocoding, routing, and exploring points of interest using OpenStreetMap data, enabling multimodal (walking and transit) navigation.
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., "@geo-mcpPlan a walking route from Central Park to Times Square"
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.
geo-mcp
OSM-backed multimodal (walk + transit) navigation MCP server. Gives LLM apps structured routing and geo tools for any distance — neighborhood walks to cross-city transit — without proprietary map APIs.
Features
Offline / local PBF: download a Geofabrik extract once (
geo-mcp ingest), then route without OverpassDistance-adaptive routing: local multimodal A* for short trips; hierarchical transit-skeleton + walk access/egress for long ones
Tiled parallel loads: walk/transit graphs from local clips or Overpass tiles
Deferred jobs + progress: long routes can return
job_id; poll withget_jobResilient OSM I/O: retries, circuit breakers, deadlines (online mode)
Transports: stdio (default) and optional Streamable HTTP
Related MCP server: Geo MCP Worker
Tools
Tool | Purpose |
| Place ↔ coordinates |
| Adaptive multimodal route (optional |
| Always-background route job |
| Job lifecycle |
| Prefetch tiles for explore/ |
| Nearby OSM POIs |
| Nearby stops and lines |
| Major roads, neighborhoods, landmarks |
| Nearest graph node (auto-loads a local tile if needed) |
Requirements
Python 3.14+
For offline clipping: osmium-tool (
brew install osmium-tool)
Install
cd /path/to/geo-mcp
uv sync
brew install osmium-tool # once, for offline bbox extractsOffline mode (recommended)
Download once, then never hit Overpass for routing:
# ~300–400 MB for Île-de-france
uv run geo-mcp ingest --region ile-de-france
uv run geo-mcp status
# Serve MCP offline
GEO_MCP_OFFLINE=true uv run geo-mcpCursor env example: set GEO_MCP_OFFLINE=true and GEO_MCP_PBF_REGION=ile-de-france. Other regions: berlin, greater-london, france. Or pass --url for any .osm.pbf.
Run
# Cursor / Claude Desktop (stdio)
uv run geo-mcp
# Optional Streamable HTTP
uv run geo-mcp --transport streamable-http --host 127.0.0.1 --port 8000
# Verbose logs
uv run geo-mcp --log-level INFOCursor config
{
"mcpServers": {
"geo-mcp": {
"command": "uv",
"args": [
"--directory",
"/path/to/geo-mcp",
"run",
"geo-mcp"
],
"env": {
"PYTHONWARNINGS": "ignore"
}
}
}
}Suggested agent flow
geocodeorigin and destinationplan_routewith coordinates (no priorload_arearequired)If the response has
job_id, pollget_jobuntilstatusiscompleted(orfailed)Optionally
describe_area/find_nearbyafter a localload_area
Tests
uv run pytestLive OSM smoke (needs network):
uv run python scripts/smoke_route.pyConfiguration
Environment variables use the GEO_MCP_ prefix. Important knobs:
Variable | Default | Meaning |
|
| Never call Overpass; require local PBF/cache |
|
| Geofabrik region for ingest |
| — | Explicit path to |
|
| Use local PBF when present |
|
| Below this → local A*; above → hierarchical |
|
| Access/egress stop search radius |
|
| Walk tile grid size (~1 km) |
|
| Parallel tile workers |
|
| Soft sync budget (long trips auto-defer) |
|
| Hard deadline per route/load |
|
| Retries per Overpass endpoint |
|
| Disk graph cache |
Architecture
src/geo_mcp/
domain/ # geo, network, pathfinding, hierarchical router
application/ # use cases, job service, DTOs
infrastructure/
resilience/ # retry, circuit breaker, deadline
graph/ # disk cache + tile store
osm/ # Nominatim, Overpass, OSMnx repository
interfaces/mcp/ # FastMCP tools (+ progress)Limits
Transit uses OSM topology and heuristic speeds (not GTFS realtime schedules)
Hierarchical routing stitches transit with walk tiles / geodesic walk fallbacks at the ends
First fetch for uncached tiles still depends on Overpass/OSMnx latency
Attribution & policy
Map data © OpenStreetMap contributors
Respect Nominatim usage policy and Overpass etiquette
Available Tools
8 toolsdescribe_areaA
Describe the loaded area's structure: axes, neighborhoods, landmarks.
Useful for giving LLMs city-design context before narrating directions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It implies a read-only operation ('Describe') but does not explicitly state that it has no side effects, nor does it mention behavior when no area is loaded (e.g., error or empty response). This is a significant gap for a tool that depends on prior state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the main purpose, and each sentence adds value. The second sentence provides a practical use case without redundancy. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 params, existing output schema), the description covers the core purpose and a typical use case. It does not explicitly state the prerequisite of a prior load_area call, but 'loaded area' implies this. Overall, it is sufficiently complete for straightforward usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is fully covered and the baseline is 4. The description adds no parameter information, as none is needed, and the empty schema provides complete coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Describe') and resource ('the loaded area's structure'), enumerating key aspects (axes, neighborhoods, landmarks). This distinguishes it from sibling tools like geocode or plan_route, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence provides a clear use case: giving LLMs city-design context before narrating directions. This indicates when to use the tool, though it does not explicitly mention alternatives or exclusions. Still, the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_nearbyB
Find nearby points of interest (cafes, pharmacies, parks, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| limit | No | ||
| category | No | ||
| radius_m | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the core action and gives examples, but does not disclose sorting, search radius behavior, limit handling, or potential side effects. The description adds minimal context beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that is front-loaded with the verb and resource. It is appropriately concise with no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description is too brief to fully support usage. It doesn't explain key parameters (radius in meters, limit, categories), lacks usage context, and provides no behavioral details. A more complete description would mention the default radius, sorting, or that lat/lon are required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema property descriptions are completely absent (0% coverage). The description compensates only partially: examples like 'cafes, pharmacies, parks' hint at the 'category' parameter, but lat, lon, limit, and radius_m are left unexplained. No units, defaults, or behavior are described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Find nearby points of interest' with concrete examples (cafes, pharmacies, parks). This distinguishes it from sibling tools like geocode or describe_area, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs. alternatives. It doesn't mention prerequisites, exclusions, or specific use cases beyond the generic 'nearby points of interest'. There is no reference to sibling tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geocodeB
Resolve a place name or address to latitude/longitude and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the basic transformation and mentions 'metadata' without explaining what metadata is included, how ambiguous results are handled, or whether any rate limits or errors apply. No safety or side-effect information is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no wasted words or repetition. It is front-loaded with the core action and resource. However, it may be too terse for a tool that could benefit from additional context, but conciseness itself is strong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple schema with two parameters, but no annotations and no visible output schema. The description does not explain what 'metadata' means, what the return format is, or how the limit parameter affects results. Given that a geocoding tool typically returns candidates with scores, a brief note on result ordering or ambiguity handling would be expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention either parameter (query or limit) by name or explain their semantics. It does imply that 'query' is a place name or address, but 'limit' remains entirely undocumented, so the description adds minimal meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Resolve') and clearly identifies the resource ('place name or address') and the output ('latitude/longitude and metadata'). This clearly distinguishes it from sibling tools like reverse_geocode, which would do the opposite operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for forward geocoding (place/address to coordinates), which gives a clear usage context. However, it does not explicitly mention when to prefer this over alternatives such as reverse_geocode or snap_to_network, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transit_optionsB
List nearby transit stops and the lines that serve them.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| limit | No | ||
| radius_m | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. The verb 'List' implies read-only, but it doesn't explicitly state safety, limitations, or required inputs. It only adds the minor behavioral detail that lines are included in the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, but it is under-sized for a tool with four parameters and no schema descriptions. It leaves out essential usage context, making it not appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description is incomplete for a tool with four unannotated parameters and no schema descriptions. It fails to explain how to set location, adjust radius/limit, or handle edge cases, hindering correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and descriptions are absent from parameters. The description only hints at location via 'nearby', but fails to explain lat/lon, limit, or radius_m semantics, defaults, or relationships.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('List') and resource ('nearby transit stops and the lines that serve them'). It effectively distinguishes from sibling tools like plan_route and find_nearby by specifying the transit context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for transit queries via 'nearby', but it does not provide explicit when-to-use guidance, exclusions, or mention of alternative tools. It lacks clear context differentiation from related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_areaA
Load and cache OSM walk+transit graph for a place name or bounding box.
Prefer a place query (e.g. "Le Marais, Paris") or an explicit bbox. Must be called before plan_route, describe_area, or snap_to_network.
| Name | Required | Description | Default |
|---|---|---|---|
| east | No | ||
| west | No | ||
| north | No | ||
| place | No | ||
| south | No | ||
| force_refresh | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does disclose caching behavior and an ordering dependency. However, it does not explain the force_refresh parameter or the behavior when both place and bbox are provided, leaving important behavior undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the core action in the first and usage guidance in the second. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential purpose and prerequisite relationship, and the output schema exists to describe returns. Yet with 6 optional parameters and no annotations, it leaves out force_refresh semantics and conflict resolution, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description maps 'place' to a place name and indicates the four coordinate parameters form a bounding box, supplementing the bare schema. It does not, however, describe force_refresh or the exact coordinate format/inclusion rules, and schema coverage is 0%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it loads and caches an OSM walk+transit graph, using a specific verb ('load') and resource. It distinguishes itself from sibling tools by noting it is a prerequisite for plan_route, describe_area, and snap_to_network.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises preferring a place query over a bbox, and states it must be called before three sibling tools. This gives an agent clear conditions for when to invoke it, though it does not discuss when not to use it or alternatives beyond the prerequisite list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_routeA
Plan a multimodal route on the loaded area graph.
modes defaults to walk+transit. Use ["walk"] for pedestrian-only. Requires a prior successful load_area call.
| Name | Required | Description | Default |
|---|---|---|---|
| modes | No | ||
| origin_lat | Yes | ||
| origin_lon | Yes | ||
| destination_lat | Yes | ||
| destination_lon | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the default modes behavior and the prerequisite dependency on a loaded area graph. It does not discuss side effects, errors, or data mutability, but for a routing tool this is moderately transparent. No contradiction with annotations since none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences: purpose, parameter behavior, and prerequisite. Every sentence adds value without unnecessary detail or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the existence of an output schema, the description covers the essential aspects: what it does, how to adjust modes, and the required prior call. It does not detail coordinate constraints or error handling, but these are less critical for basic usage. Overall, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description adds meaningful semantics for the 'modes' parameter: it specifies the default (walk+transit) and the way to request pedestrian-only. The latitude/longitude parameters are self-explanatory from their names. This compensates well for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Plan') and resource ('multimodal route on the loaded area graph'). It distinguishes itself from sibling tools like load_area or list_transit_options by focusing on route planning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a key usage precondition: 'Requires a prior successful load_area call.' It also gives parameter usage advice (default modes and how to request pedestrian-only). However, it does not explicitly mention when to use this over alternatives or when not to use it, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reverse_geocodeB
Resolve coordinates to a human-readable place.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It only states the basic function and does not mention output format, error cases (e.g., invalid coordinates), or any side effects. This leaves significant ambiguity about what 'human-readable place' actually returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately concise for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively simple with only two parameters and an output schema exists, which lowers the burden. However, the description leaves ambiguity relative to sibling 'describe_area' and lacks guidance on output meaning, making it adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not compensate. It mentions 'coordinates' but does not clarify units, ranges, or that lat and lon are required. The parameter names themselves carry all meaning, and the description adds no value beyond them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Resolve coordinates to a human-readable place' uses a specific verb ('Resolve') and resource ('coordinates'), and the tool name clearly distinguishes it from sibling 'geocode'. It conveys the core action unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for converting coordinates to place names, but it does not explicitly state when to use it versus alternatives like 'geocode' or 'describe_area'. No exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snap_to_networkB
Snap a coordinate to the nearest loaded graph node (intersection or stop).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| kind | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose that it snaps to the nearest graph node and defines nodes as intersections or stops, but it omits critical behavioral details such as what happens if no graph is loaded, whether there is a search radius, or how coordinates are validated. This lack of error/prerequisite context makes it insufficient for an agent to anticipate failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no fluff. Every word contributes to the core meaning, and it is appropriately sized for the tool's apparent simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered elsewhere. However, the description lacks important context such as the prerequisite of loading a graph and the semantics of the 'kind' parameter. For a simple snapping operation it is adequate, but it could be more complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only mentions 'a coordinate', which loosely maps to lat/lon but provides no explanation of the optional 'kind' parameter or its default behavior. It adds minimal meaning beyond the schema's raw property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Snap' and clearly identifies the resource: 'a coordinate to the nearest loaded graph node (intersection or stop)'. This distinguishes it from sibling tools like geocode and reverse_geocode, which convert addresses/coordinates, and find_nearby, which likely searches for points of interest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'loaded graph node' implies that a graph must be loaded first (e.g., via load_area), but it does not explicitly state when to use this tool versus alternatives like geocode or reverse_geocode. There is no mention of exclusions or explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
describe_area - First observed
find_nearby - First observed
geocode - First observed
list_transit_options - First observed
load_area - First observed
plan_route - First observed
reverse_geocode - First observed
snap_to_network
TDQS
Scored across 8 tools
Each tool targets a distinct action: geocoding, routing, POI discovery, transit info, area description, and graph snapping. Even similarly named tools like load_area and describe_area are clearly differentiated by their roles (loading data vs. analyzing it).
Tool names follow a consistent lowercase underscore-separated verb_noun pattern (e.g., plan_route, list_transit_options). The exceptions geocode and reverse_geocode are single-word verbs that are standard and clearly related, maintaining consistency in style.
With 8 tools, the set is well-scoped for a geo/routing server. Each tool covers a necessary function without redundancy, and the count is comfortably within the ideal 3-15 range.
The tool surface covers the core geospatial workflow: geocoding, reverse geocoding, graph loading, route planning, POI lookup, transit listing, area description, and coordinate snapping. No obvious gaps exist for the server's stated purpose; the dependency on load_area is clearly documented.
Maintenance
Related MCP Connectors
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
- geoOAuthco.thinair
Geocoding, routing, isochrones, traffic, weather, and place search for AI agents. 19 MCP tools.
MCP server for Japan geodata: cadastral lot numbers (chiban) and reverse geocoding, for AI agents.
MCP server giving AI agents one-connection access to supply-chain & logistics data: AIS vessel track
Related MCP Servers
- AlicenseBqualityDmaintenanceA comprehensive MCP server providing 30 tools for geocoding, routing, and OpenStreetMap data analysis. It enables AI assistants to search for locations, calculate travel routes, and perform quality assurance checks on map data.3098 npm5MIT
- AlicenseNot gradedqualityCmaintenanceFree geospatial MCP server for AI agents, providing geocoding, reverse geocoding, POI search, and route planning using OpenStreetMap data via Nominatim, Overpass, and OSRM.1GPL 3.0
- AlicenseAqualityCmaintenanceAn OpenStreetMap MCP server that provides location-based services including geocoding, route directions, points of interest search, and neighborhood analysis to enhance LLMs with geospatial capabilities.121MIT
- AlicenseAqualityBmaintenanceAn OpenStreetMap MCP server providing geocoding, routing, points of interest, map tiles, public transport, and energy infrastructure tools to enhance LLM location-based capabilities.16MIT