Skip to main content
Glama
dinesh7wd

mcp-server-geo-optimizer

by dinesh7wd

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 build

Cursor MCP config

Build first: Run npm run build so the dist/ folder exists before pointing Cursor at dist/index.js.

Update the path: Replace /path/to/mcp-server-geo-optimizer below with the absolute path on your machine (e.g. d:/MCP/mcp-server-geo-optimizer on Windows or /home/you/mcp-server-geo-optimizer on 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_URL is 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 least PUBLIC_API_MIN_INTERVAL_MS apart (default 1 s), honours Retry-After, and sends GEO_USER_AGENT. Set GEO_USER_AGENT to something that identifies you and includes contact details. For real workloads run your own OSRM (e.g. http://localhost:5000) and raise OSRM_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.js

The 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-optimizer

Environment

Copy .env.example to .env to start from documented defaults.

Variable

Required

Description

GEOCODING_PROVIDER

No

nominatim (default), google, or mapbox

GEOCODING_API_KEY

For google and mapbox

Provider API key. Redacted from all logs and error messages

GEO_USER_AGENT

Recommended

User-Agent sent on every outbound request. Include contact details for Nominatim

OSRM_URL

No

http(s) OSRM endpoint (default: public demo server)

OSRM_MAX_TABLE_SIZE

No

Max coordinates per OSRM table request, checked before any call (default: 100, the demo server limit)

HAVERSINE_SPEED_KMH

No

Speed used to convert straight-line km to minutes when OSRM is not used (default: 40)

ROUTE_SEARCH_TIME_BUDGET_MS

No

Wall-clock limit for route local search per request, shared across vehicles (default: 1500, range 50-30000). The best route found so far is returned when it runs out

PUBLIC_API_MIN_INTERVAL_MS

No

Minimum spacing between requests to the public Nominatim and OSRM hosts, >= 1000 (default: 1000)

HTTP_TIMEOUT_MS

No

Outbound HTTP timeout per attempt (default: 10000)

HTTP_RETRIES

No

Retries for 5xx, 429, and network errors, 0-5 (default: 2)

CACHE_TTL_SECONDS

No

In-memory LRU TTL for geocoding and OSRM responses (default: 300)

LOG_LEVEL

No

debug, info, warn, error (default: info)

NODE_ENV

No

Default production hides unexpected error details from clients; set development locally to see them

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

optimize_route

TSP / VRP over 2-200 waypoints (up to OSRM_MAX_TABLE_SIZE with useOsrm: true). Supports vehicles, capacity, service times, and time windows in minutes. Local search (2-opt, Or-opt, relocate) stops at ROUTE_SEARCH_TIME_BUDGET_MS, so large time-window problems can vary slightly between runs.

geocode

Forward (address, max 500 chars) or reverse (lat + lng together) geocoding, limit 1-10.

distance_matrix

Pairwise km and minutes, mode haversine or osrm. At most 100 origins, 100 destinations, and 2,500 cells per request.

cluster_points

Deterministic kmeans (seeded, k-means++) or dbscan, up to 500 points. A k larger than the number of distinct points is reduced to that number. Centroids are spherical means, so clusters across the antimeridian work.

boundary_check

point_in_polygon, convex_hull, bounding_box, up to 5,000 points. All handle the antimeridian.

geojson_utils

validate (recursive, RFC 7946), simplify (keeps altitude, recurses into features and collections), to_feature_collection. GeoJSON input max 2 MB.

Routing semantics

  • Time is measured in minutes from departure at the depot. Each waypoint may set readyTimeMin, dueTimeMin, and serviceTimeMin. Arriving before readyTimeMin waits; readyTimeMin > dueTimeMin is 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 violations list, stops carry lateMin, and the top-level feasible flag is false. A dueTimeMin on 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 respecting capacity. Stops whose demand cannot fit any vehicle are listed in unassigned.

  • With useOsrm: true, both leg distances and leg durations come from the OSRM table, and distanceSource is osrm. Otherwise distances are great-circle and durations use averageSpeedKmh.

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:

  1. Schema validation by the MCP SDK. Types, ranges, and required fields are checked before the tool runs. These come back as isError: true with plain text, not JSON, for example MCP error -32602: Input validation error: ....

  2. Tool-level checks. Cross-field rules (such as the distance-matrix cell cap, startIndex range, or time-window order) and all runtime failures return isError: true with a JSON body {"code": "...", "message": "..."}.

Code

Meaning

InvalidParams

Input failed validation or a request limit

ROUTE_FAIL

Routing or distance-matrix operation failed, including OSRM finding no road route

GeocodingFailed

Geocoding provider returned no results or an error

CLUSTER_FAIL

Clustering algorithm failed

GEOMETRY_FAIL

Boundary or GeoJSON operation failed

PROVIDER_CONFIG

Missing or invalid environment configuration

TIMEOUT

Outbound HTTP request timed out

UPSTREAM_ERROR

Upstream response was unusable (for example larger than the 5 MB response cap)

InternalError

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 build

Architecture

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 tools
boundary_checkBoundary checkA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pointNoPoint to test for point_in_polygon
pointsNoPoints for convex_hull or bounding_box (1-5000)
polygonNoPolygon vertices in order as {lat,lng} objects (3-5000). Closing vertex optional; no holes
operationYespoint_in_polygon needs point + polygon; convex_hull and bounding_box need points

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 pointsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoNumber of clusters (required for kmeans). Reduced to the number of distinct points if larger
seedNoRandom seed that makes kmeans deterministic
epsKmNoNeighborhood radius in km (required for dbscan)
minPtsNoMinimum neighbors including the point itself for a dbscan core point. Default 2
pointsYesPoints to cluster (1-500)
algorithmYeskmeans = k clusters; dbscan = density clusters within epsKm, isolated points returned as noise

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 matrixA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNohaversine = straight-line km with minutes at averageSpeedKmh; osrm = road km/minutes from the OSRM serverhaversine
originsYesOrigin locations (1-100). origins x destinations must not exceed 2500 cells
destinationsNoDestination locations (1-100). Omit for an origins x origins matrix
averageSpeedKmhNoSpeed in km/h for haversine durations. Defaults to HAVERSINE_SPEED_KMH (40)

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

geocodeGeocodeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in decimal degrees for reverse geocoding (use with lng)
lngNoLongitude in decimal degrees for reverse geocoding (use with lat)
limitNoMaximum number of forward-geocoding results (1-10). Ignored for reverse
addressNoAddress or place name for forward geocoding. Omit when passing lat/lng

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 utilitiesA
Read-onlyIdempotent

Validate GeoJSON (structure, coordinate ranges, closed rings), simplify lines and polygon rings (altitude preserved), or convert {lat,lng} points to a FeatureCollection.

ParametersJSON Schema
NameRequiredDescriptionDefault
pointsNoPoints for to_feature_collection (1-1000)
geojsonNoGeoJSON object with [lng, lat] coordinates, for validate and simplify (at most 2000000 characters as JSON)
operationYesvalidate = RFC 7946 structure and coordinate ranges; simplify = Douglas-Peucker on lines and rings; to_feature_collection = points to Point features
toleranceKmNoSimplification tolerance in km (default 0.05 = 50 m)

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 routeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
closedNotrue = every vehicle returns to the depot; false = routes end at their last stop
useOsrmNoUse OSRM road distances and durations instead of straight-line estimates (network call)
capacityNoPer-vehicle capacity in the same unit as waypoint demand. Omit for unlimited
waypointsYesStops including the depot at startIndex (2-200). With useOsrm the limit is OSRM_MAX_TABLE_SIZE (default 100)
startIndexNoIndex in waypoints of the depot where every route starts; must be less than waypoints.length
vehicleCountNoNumber of vehicles. Stops are split into balanced angular sectors around the depot
averageSpeedKmhNoAverage speed in km/h used for travel times when useOsrm is false

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv1.0.0
    • First observedboundary_check
    • First observedcluster_points
    • First observeddistance_matrix
    • First observedgeocode
    • First observedgeojson_utils
    • First observedoptimize_route

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    A 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.
    4
    MIT
  • 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
    385 npm
    5
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables 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.
    8
    13 npm
    7
    Apache 2.0