mcp-server-geo-optimizer
Enables forward and reverse geocoding through Google's geocoding provider when configured with GEOCODING_PROVIDER=google and a GEOCODING_API_KEY.
Enables forward and reverse geocoding through Mapbox's geocoding provider when configured with GEOCODING_PROVIDER=mapbox and a GEOCODING_API_KEY.
Enables forward and reverse geocoding through Nominatim, OpenStreetMap's public geocoder, by default.
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., "@mcp-server-geo-optimizerFind the optimal route through these addresses: 123 Main St, 456 Oak Ave, 789 Pine Rd"
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.
mcp-server-geo-optimizer
Model Context Protocol server for geographic and route optimization. It exposes tools for TSP/VRP routing, geocoding, distance matrices, clustering, boundary checks, and GeoJSON utilities.
Requirements
Node.js 22+
Optional: a local OSRM instance for road-network distances
Geocoding provider: Nominatim (default), Google, or Mapbox
Related MCP server: OpenStreetMap MCP Server
Install
cd mcp-server-geo-optimizer
npm install
npm run buildCursor MCP config
Build first: Run
npm run buildso thedist/folder exists before pointing Cursor atdist/index.js.
Update the path: Replace
/path/to/mcp-server-geo-optimizerbelow with the absolute path on your machine (e.g.d:/MCP/mcp-server-geo-optimizeron Windows or/home/you/mcp-server-geo-optimizeron Linux/macOS).
{
"mcpServers": {
"geo-optimizer": {
"command": "node",
"args": ["/path/to/mcp-server-geo-optimizer/dist/index.js"],
"env": {
"GEOCODING_PROVIDER": "nominatim",
"GEO_USER_AGENT": "my-team-geo/1.0 (contact: you@example.com)",
"OSRM_URL": "https://router.project-osrm.org"
}
}
}
}After publishing to npm you can switch command to npx with args: ["-y", "mcp-server-geo-optimizer"].
Public APIs: The default
OSRM_URLis the public demo server and Nominatim is the public OpenStreetMap geocoder. Both have strict usage policies and no SLA. The server spaces requests to these two hosts at leastPUBLIC_API_MIN_INTERVAL_MSapart (default 1 s), honoursRetry-After, and sendsGEO_USER_AGENT. SetGEO_USER_AGENTto something that identifies you and includes contact details. For real workloads run your own OSRM (e.g.http://localhost:5000) and raiseOSRM_MAX_TABLE_SIZE.
Quick test
Once added to Cursor's MCP settings, you can ask:
"Find the optimal route through these addresses: 123 Main St, 456 Oak Ave, 789 Pine Rd"
Or verify the server starts manually (it listens on stdio; no HTTP port):
npm run build
node --env-file=.env dist/index.jsThe server does not load .env files itself; use node --env-file=.env (Node 22+) or pass variables through your MCP client's env block. The process should stay running with no output on stdout. Logs appear as JSON on stderr.
Docker
The server speaks MCP over stdio, so keep stdin open with -i:
docker build -t mcp-server-geo-optimizer .
docker run -i --rm -e GEOCODING_PROVIDER=nominatim -e GEO_USER_AGENT="my-team-geo/1.0 (contact: you@example.com)" mcp-server-geo-optimizerEnvironment
Copy .env.example to .env to start from documented defaults.
Variable | Required | Description |
| No |
|
| For | Provider API key. Redacted from all logs and error messages |
| Recommended |
|
| No | http(s) OSRM endpoint (default: public demo server) |
| No | Max coordinates per OSRM table request, checked before any call (default: |
| No | Speed used to convert straight-line km to minutes when OSRM is not used (default: |
| No | Wall-clock limit for route local search per request, shared across vehicles (default: |
| No | Minimum spacing between requests to the public Nominatim and OSRM hosts, |
| No | Outbound HTTP timeout per attempt (default: |
| No | Retries for 5xx, 429, and network errors, |
| No | In-memory LRU TTL for geocoding and OSRM responses (default: |
| No |
|
| No | Default |
Logs are written as JSON to stderr. stdout is reserved for MCP stdio.
Tools
All tools are read-only and idempotent. optimize_route, geocode, and distance_matrix may call external services (openWorldHint: true); the others are purely local. Results are compact JSON with distances rounded to metres (3 decimals, km), durations to 2 decimals (minutes), and coordinates to 6 decimals.
Tool | Purpose |
| TSP / VRP over 2-200 waypoints (up to |
| Forward ( |
| Pairwise km and minutes, |
| Deterministic |
|
|
|
|
Routing semantics
Time is measured in minutes from departure at the depot. Each waypoint may set
readyTimeMin,dueTimeMin, andserviceTimeMin. Arriving beforereadyTimeMinwaits;readyTimeMin > dueTimeMinis rejected.Time windows are soft. When no order meets every window, the solver minimises total lateness first, then distance, and reports it instead of failing: each route has a
violationslist, stops carrylateMin, and the top-levelfeasibleflag isfalse. AdueTimeMinon the depot applies to the return leg of closed routes.Up to 8 stops per route are solved exactly; larger routes use nearest neighbour with 2-opt and Or-opt improvement.
With
vehicleCount > 1, stops are assigned by a sweep around the depot, balanced across vehicles and respectingcapacity. Stops whose demand cannot fit any vehicle are listed inunassigned.With
useOsrm: true, both leg distances and leg durations come from the OSRM table, anddistanceSourceisosrm. Otherwise distances are great-circle and durations useaverageSpeedKmh.
Bounding boxes
bounding_box follows RFC 7946: when points straddle the antimeridian, minLng is greater than maxLng and crossesAntimeridian is true (e.g. minLng: 179.8, maxLng: -179.8).
Errors
Invalid arguments are rejected in two stages:
Schema validation by the MCP SDK. Types, ranges, and required fields are checked before the tool runs. These come back as
isError: truewith plain text, not JSON, for exampleMCP error -32602: Input validation error: ....Tool-level checks. Cross-field rules (such as the distance-matrix cell cap,
startIndexrange, or time-window order) and all runtime failures returnisError: truewith a JSON body{"code": "...", "message": "..."}.
Code | Meaning |
| Input failed validation or a request limit |
| Routing or distance-matrix operation failed, including OSRM finding no road route |
| Geocoding provider returned no results or an error |
| Clustering algorithm failed |
| Boundary or GeoJSON operation failed |
| Missing or invalid environment configuration |
| Outbound HTTP request timed out |
| Upstream response was unusable (for example larger than the 5 MB response cap) |
| Unexpected server error |
API keys and tokens are redacted from every error message and log line. With NODE_ENV=production, unexpected errors are reported to clients as Internal error, and details stay on stderr.
Development
This project includes a .cursorrules file. Cursor agents automatically follow the coding standards, file structure, and testing rules defined there (layered architecture, strict TypeScript, mocked HTTP in tests, Conventional Commits).
npm run dev # run with tsx (stdio)
npm test # unit + integration tests
npm run test:coverage # 80% thresholds across src/
npm run typecheck
npm run lint
npm run format:check
npm run buildArchitecture
Layered design: transport → MCP tools → services → pure domain geo algorithms → HTTP adapters. Services never import the MCP SDK. Domain functions are side-effect free and fully unit tested.
License
MIT
Available Tools
6 toolsboundary_checkBoundary checkARead-onlyIdempotent
Point-in-polygon, convex hull and bounding box for {lat,lng} points; handles the antimeridian. A bounding box that crosses the antimeridian has minLng > maxLng (RFC 7946).
| Name | Required | Description | Default |
|---|---|---|---|
| point | No | Point to test for point_in_polygon | |
| points | No | Points for convex_hull or bounding_box (1-5000) | |
| polygon | No | Polygon vertices in order as {lat,lng} objects (3-5000). Closing vertex optional; no holes | |
| operation | Yes | point_in_polygon needs point + polygon; convex_hull and bounding_box need points |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable context beyond annotations: it discloses antimeridian handling and explains the RFC 7946 convention that minLng > maxLng when a bounding box crosses the antimeridian. With readOnlyHint and idempotentHint already covering safety and repeatability, this extra geometric nuance is the key behavioral disclosure needed.
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?
Two concise sentences that front-load the supported operations and then immediately address the trickiest edge case. No filler; every sentence earns its place.
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 no output schema, a brief note on return values could help, but the description covers the operations, input expectations (lat/lng points), and a critical geometric edge case. It is complete enough for an agent to call the tool correctly without needing more.
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 100%, so the schema already documents all parameters thoroughly. The description restates the coordinate format and adds antimeridian semantics, but does not add significant parameter-level detail beyond what the schema provides. Baseline 3 is appropriate.
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 names three specific geometric operations (point-in-polygon, convex hull, bounding box) on lat/lng points. It distinguishes itself from siblings like distance_matrix or cluster_points by focusing on boundary/geometry operations rather than routing or clustering.
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?
Usage is implied through the operation names and the schema, but the description does not explicitly state when to choose one operation over another or provide guidance beyond what's in the enum description. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_pointsCluster pointsARead-onlyIdempotent
Group geographic points with deterministic k-means (seeded) or DBSCAN (epsKm radius). Returns clusters with size, centroid (date-line safe) and member points; DBSCAN noise is returned as a cluster with noise=true.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of clusters (required for kmeans). Reduced to the number of distinct points if larger | |
| seed | No | Random seed that makes kmeans deterministic | |
| epsKm | No | Neighborhood radius in km (required for dbscan) | |
| minPts | No | Minimum neighbors including the point itself for a dbscan core point. Default 2 | |
| points | Yes | Points to cluster (1-500) | |
| algorithm | Yes | kmeans = k clusters; dbscan = density clusters within epsKm, isolated points returned as noise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, idempotent, non-destructive, and the description adds useful behavioral detail: determinism via seeding, date-line safety for centroids, and that DBSCAN noise is returned as a cluster with noise=true. Missing details on output format or pagination, but with annotations covering safety, this is good.
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?
Single sentence front-loaded with the core action and algorithm options, followed by return value details. 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?
Covers algorithm options, determinism, date-line safety, and noise handling. With annotations covering safety and no output schema, the description could be more explicit about input requirements (e.g., points count) but is largely complete for a clustering tool.
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 100%, so all parameters are documented in the schema, and the description only mentions a subset (seeded k-means, epsKm radius). Baseline 3 is appropriate when schema does the heavy lifting.
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?
States a specific verb (Group) and resource (geographic points) with both algorithm variants named. Clearly distinguishable from siblings like geocode, distance_matrix, or optimize_route.
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 mentions both algorithms and their key parameters (seeded k-means, epsKm for DBSCAN), implying when one might be chosen, but doesn't give explicit guidance on when to prefer k-means vs DBSCAN or when this tool is appropriate versus alternatives. The schema enum description does more of this work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
distance_matrixDistance matrixARead-onlyIdempotent
Compute distances (km) and travel times (minutes) from each origin (rows) to each destination (columns). At most 2500 cells per request. haversine is local; osrm calls the configured OSRM server.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | haversine = straight-line km with minutes at averageSpeedKmh; osrm = road km/minutes from the OSRM server | haversine |
| origins | Yes | Origin locations (1-100). origins x destinations must not exceed 2500 cells | |
| destinations | No | Destination locations (1-100). Omit for an origins x origins matrix | |
| averageSpeedKmh | No | Speed in km/h for haversine durations. Defaults to HAVERSINE_SPEED_KMH (40) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the bar is lower. The description usefully adds the cell cap and the key behavioral distinction that haversine is computed locally while osrm depends on a configured external server, which explains the openWorldHint and implies latency/availability differences.
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?
Two sentences, zero padding. The output shape (rows/columns, units) is front-loaded, followed by the constraint and the mode distinction.
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?
With no output schema, the description carries the return-value burden and does so by naming units (km, minutes) and matrix orientation. It stops short of describing the response structure/ordering or error behavior for oversized requests, but is otherwise sufficient.
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 100%, so mode, origins, destinations, and averageSpeedKmh are all fully documented in the schema itself. The description only restates the mode semantics and cell cap, adding no syntax or format detail beyond the structured fields, so baseline 3 applies.
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?
States a specific verb and resource ('compute distances and travel times') plus the exact matrix orientation (origins = rows, destinations = columns). This clearly distinguishes it from siblings like geocode, optimize_route, and cluster_points.
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?
Mentions the 2500-cell cap and contrasts haversine (local) with osrm (network call), which hints at when each mode applies. However, it never states when to choose this tool over optimize_route or when to omit destinations, leaving usage largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geocodeGeocodeARead-onlyIdempotent
Forward-geocode an address or reverse-geocode lat/lng using the configured provider (Nominatim by default, rate-limited to 1 request per second). Returns lat, lng and a display name.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees for reverse geocoding (use with lng) | |
| lng | No | Longitude in decimal degrees for reverse geocoding (use with lat) | |
| limit | No | Maximum number of forward-geocoding results (1-10). Ignored for reverse | |
| address | No | Address or place name for forward geocoding. Omit when passing lat/lng |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/openWorld/idempotent/destructive, so the bar is lower; the description adds genuinely new context — the default provider (Nominatim) and a 1 request/second rate limit — which an agent needs to avoid throttling.
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?
Two tightly written sentences with no filler; the mode and provider are front-loaded and the rate limit is appended where it belongs.
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?
For a read-only geocoding tool with full schema coverage, the definition covers modes, provider, rate limit, and even the return shape (lat, lng, display name) despite no output schema. Only minor gaps, such as error behavior on ambiguous addresses, remain.
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 100%, so the schema already documents each parameter's format, bounds, and forward/reverse applicability. The description adds nothing beyond what the schema states, so the baseline 3 applies.
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?
States specific verbs (forward-geocode / reverse-geocode) and the resource (address or lat/lng), and names the provider. Sibling tools (distance_matrix, optimize_route, cluster_points) are clearly different tasks, so no confusion arises.
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 plus schema makes the mode-selection rule explicit: pass address for forward, lat/lng for reverse. It notes the rate limit, which is operationally relevant, but gives no explicit when-not-to-use or alternative-tool guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geojson_utilsGeoJSON utilitiesARead-onlyIdempotent
Validate GeoJSON (structure, coordinate ranges, closed rings), simplify lines and polygon rings (altitude preserved), or convert {lat,lng} points to a FeatureCollection.
| Name | Required | Description | Default |
|---|---|---|---|
| points | No | Points for to_feature_collection (1-1000) | |
| geojson | No | GeoJSON object with [lng, lat] coordinates, for validate and simplify (at most 2000000 characters as JSON) | |
| operation | Yes | validate = RFC 7946 structure and coordinate ranges; simplify = Douglas-Peucker on lines and rings; to_feature_collection = points to Point features | |
| toleranceKm | No | Simplification tolerance in km (default 0.05 = 50 m) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds some real behavior detail — validation checks structure/coordinate ranges/closed rings, and simplification preserves altitude — but says nothing about output shape, error reporting, or vertex-count effects. Modest added value over the annotations.
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?
A single dense sentence with three parallel clauses and no filler; it is front-loaded with the verbs. It is appropriately sized for the tool, though the heavy compression means the parentheticals carry a lot of implicit meaning.
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?
For a four-parameter, multi-operation utility with no output schema and full schema coverage, the description covers all three modes adequately. It omits the return/error format of validate, but that is a minor gap against a read-only, closed-world utility whose safety is already declared.
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 100%, so parameters like toleranceKm, points, and geojson are already fully documented in the schema, including units and defaults. The description adds no syntax or format meaning beyond that, so the baseline 3 applies.
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 names three concrete operations (validate, simplify, convert) with specific detail on each — coordinate ranges, closed rings, altitude preservation, and points-to-FeatureCollection. This maps directly onto the operation enum, so an agent can immediately tell what the tool does without opening the schema.
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 three operations are enumerated, which implies which one to pick for a given task, but the description never states conditions, prerequisites, or exclusions (e.g. when to prefer simplify over external processing). Usage is inferable rather than stated, and no alternatives are named among the geo siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_routeOptimize routeARead-onlyIdempotent
Order stops for one or more vehicles (TSP/VRP) starting at waypoints[startIndex], with optional capacity and time windows in minutes after route start. Returns per-vehicle stop order (waypoint indices) with arrival/wait/departure minutes, distance in km, time-window violations and unassigned stops. Uses straight-line distances unless useOsrm is true.
| Name | Required | Description | Default |
|---|---|---|---|
| closed | No | true = every vehicle returns to the depot; false = routes end at their last stop | |
| useOsrm | No | Use OSRM road distances and durations instead of straight-line estimates (network call) | |
| capacity | No | Per-vehicle capacity in the same unit as waypoint demand. Omit for unlimited | |
| waypoints | Yes | Stops including the depot at startIndex (2-200). With useOsrm the limit is OSRM_MAX_TABLE_SIZE (default 100) | |
| startIndex | No | Index in waypoints of the depot where every route starts; must be less than waypoints.length | |
| vehicleCount | No | Number of vehicles. Stops are split into balanced angular sectors around the depot | |
| averageSpeedKmh | No | Average speed in km/h used for travel times when useOsrm is false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint false, so the safety profile is covered. The description adds behavioral context beyond annotations: it names the algorithm class (TSP/VRP), explains the distance model ('straight-line distances unless useOsrm is true'), and describes return contents including violations and unassigned stops.
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?
Three sentences are tightly packed with useful information and front-loaded with the core operation. Each sentence earns its place: the first states purpose and constraints, the second enumerates return values, and the third clarifies the distance model.
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 there is no output schema, the description explicitly enumerates the return fields: per-vehicle stop order, arrival/wait/departure minutes, distance in km, time-window violations, and unassigned stops. Combined with a fully described input schema and annotations covering safety, the definition gives an agent enough to call the tool correctly.
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 100%, so the baseline is 3. The description synthesizes some parameter relationships, such as starting at waypoints[startIndex] and time windows being in minutes after route start, but it does not add significant syntax or format detail beyond what the schema already provides for each parameter.
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 states a specific verb and resource: 'Order stops for one or more vehicles (TSP/VRP) starting at waypoints[startIndex]', which clearly identifies route optimization rather than geocoding, distance calculation, clustering, or other sibling functions. It also specifies the algorithm domain and starting constraint.
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 when the tool is useful by mentioning optional capacity and time windows, but it does not explicitly state when to choose this over alternatives such as distance_matrix or cluster_points, nor does it provide when-not-to-use guidance. Usage is therefore inferred rather than directed.
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.
6 tool updates
v1.0.0- First observed
boundary_check - First observed
cluster_points - First observed
distance_matrix - First observed
geocode - First observed
geojson_utils - First observed
optimize_route
TDQS
Scored across 6 tools
Each tool targets a distinct geographic operation: geocoding, distance computation, route optimization, clustering, spatial boundary checks, and GeoJSON utilities. Boundaries are clear despite distance_matrix and optimize_route both involving distances, because their purposes and outputs differ substantially.
All names use snake_case, but the conventions are mixed: geocode is a bare verb, distance_matrix and geojson_utils are noun phrases, boundary_check reverses verb/noun order, and optimize_route and cluster_points use verb_noun. This is readable but not a predictable pattern.
Six tools is well-scoped for a geo-optimization server, covering the main operations without bloat. Each tool earns its place by handling a distinct stage of geographic analysis or routing.
The surface covers geocoding, distance matrices, route optimization, clustering, boundary checks, and GeoJSON processing, which is strong for the stated purpose. Minor gaps like isochrone generation or elevation lookup are not essential for core geo-optimizer workflows.
Maintenance
Related MCP Connectors
- geoOAuthco.thinair
Geocoding, routing, isochrones, traffic, weather, and place search for AI agents. 19 MCP tools.
Routing, geocoding, places, matrix and map tools for location-aware AI workflows.
Location tools for Claude and other MCP clients, strongest in the US and Great Britain. Geocode whole lists with a confidence score per row, filter by distance, get road distances and drive-time areas, and plan multi-driver routes with Google Maps links. Check flood zones, crime and live warnings, find nearby places and UK registers (NHS, CQC, food hygiene), and keep shareable maps. Reads and writes Google Sheets. Free: sign in with Google.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA geospatial MCP server that provides tools for geocoding, routing, elevation profiles, and spatial analysis. It enables AI agents to process GIS file formats like GeoJSON and Shapefiles while performing complex coordinate transformations and distance calculations.4MIT
- 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.30385 npm5MIT

Magic Lane MCP Serverofficial
AlicenseBqualityCmaintenanceEnables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.813 npm7Apache 2.0- AlicenseNot gradedqualityBmaintenanceProvides routing, distance/duration matrix, isochrones, snap to road, elevation, and geocoding tools from Openrouteservice for AI agents via MCP.10 npmMIT