Skip to main content
Glama

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 Overpass

  • Distance-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 with get_job

  • Resilient 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

geocode / reverse_geocode

Place ↔ coordinates

plan_route

Adaptive multimodal route (optional defer, force_strategy)

submit_route

Always-background route job

get_job / cancel_job / list_jobs

Job lifecycle

load_area

Prefetch tiles for explore/describe_area (optional for routing)

find_nearby

Nearby OSM POIs

list_transit_options

Nearby stops and lines

describe_area

Major roads, neighborhoods, landmarks

snap_to_network

Nearest graph node (auto-loads a local tile if needed)

Requirements

  • Python 3.14+

  • uv

  • 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 extracts

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-mcp

Cursor 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 INFO

Cursor config

{
  "mcpServers": {
    "geo-mcp": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/geo-mcp",
        "run",
        "geo-mcp"
      ],
      "env": {
        "PYTHONWARNINGS": "ignore"
      }
    }
  }
}

Suggested agent flow

  1. geocode origin and destination

  2. plan_route with coordinates (no prior load_area required)

  3. If the response has job_id, poll get_job until status is completed (or failed)

  4. Optionally describe_area / find_nearby after a local load_area

Tests

uv run pytest

Live OSM smoke (needs network):

uv run python scripts/smoke_route.py

Configuration

Environment variables use the GEO_MCP_ prefix. Important knobs:

Variable

Default

Meaning

GEO_MCP_OFFLINE

false

Never call Overpass; require local PBF/cache

GEO_MCP_PBF_REGION

ile-de-france

Geofabrik region for ingest

GEO_MCP_PBF_PATH

Explicit path to .osm.pbf / .osm

GEO_MCP_PREFER_PBF

true

Use local PBF when present

GEO_MCP_LOCAL_MAX_M

2000

Below this → local A*; above → hierarchical

GEO_MCP_ACCESS_RADIUS_M

800

Access/egress stop search radius

GEO_MCP_TILE_SIZE_DEG

0.01

Walk tile grid size (~1 km)

GEO_MCP_MAX_WORKERS

8

Parallel tile workers

GEO_MCP_SYNC_BUDGET_S

25

Soft sync budget (long trips auto-defer)

GEO_MCP_OPERATION_DEADLINE_S

120

Hard deadline per route/load

GEO_MCP_OVERPASS_RETRIES

2

Retries per Overpass endpoint

GEO_MCP_CACHE_DIR

~/.cache/geo-mcp/graphs

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

Available Tools

8 tools
describe_areaA

Describe the loaded area's structure: axes, neighborhoods, landmarks.

Useful for giving LLMs city-design context before narrating directions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
limitNo
categoryNo
radius_mNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
limitNo
radius_mNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
eastNo
westNo
northNo
placeNo
southNo
force_refreshNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modesNo
origin_latYes
origin_lonYes
destination_latYes
destination_lonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
kindNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 8 tool updatesv0.1.0
    • First observeddescribe_area
    • First observedfind_nearby
    • First observedgeocode
    • First observedlist_transit_options
    • First observedload_area
    • First observedplan_route
    • First observedreverse_geocode
    • First observedsnap_to_network

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation5/5

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).

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A 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.
    30
    98 npm
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Free geospatial MCP server for AI agents, providing geocoding, reverse geocoding, POI search, and route planning using OpenStreetMap data via Nominatim, Overpass, and OSRM.
    1
    GPL 3.0