Plan and optimize a multi-stop delivery route, then share it with your driver.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Records the addresses and settings submitted by the Optimize button.
Start location returned by search_places.
Unordered delivery locations returned by search_places. Array position does not constrain visit order; the optimizer reorders these stops.
Departure date/time with UTC offset; null when unspecified. Does not change traffic estimates.
Omit to return to the start location.
Unsupported input fields excluded from optimization, listed in the result.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http delivery-planner https://deliveryplanner.com/api/free-route-planner/mcp
Records the addresses and settings submitted by the Optimize button.
| Argument | Type | Description |
|---|---|---|
| startTime | any | Departure date/time with UTC offset; null when unspecified. Does not change traffic estimates. |
| endPlaceId | string | Omit to return to the start location. |
| distanceUnit | string | |
| startPlaceId* | string | Start location returned by search_places. |
| stopPlaceIds* | array | Unordered delivery locations returned by search_places. Array position does not constrain visit order; the optimizer reorders these stops. |
| ignoredFields | array | Unsupported input fields excluded from optimization, listed in the result. |
| timeAtStopMinutes | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"startPlaceId",
"stopPlaceIds"
],
"properties": {
"startTime": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"default": null,
"description": "Departure date/time with UTC offset; null when unspecified. Does not change traffic estimates."
},
"endPlaceId": {
"type": "string",
"maxLength": 512,
"minLength": 1,
"description": "Omit to return to the start location."
},
"distanceUnit": {
"enum": [
"miles",
"km"
],
"type": "string",
"default": "km"
},
"startPlaceId": {
"type": "string",
"maxLength": 512,
"minLength": 1,
"description": "Start location returned by search_places."
},
"stopPlaceIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"maxItems": 20,
"minItems": 1,
"description": "Unordered delivery locations returned by search_places. Array position does not constrain visit order; the optimizer reorders these stops."
},
"ignoredFields": {
"type": "array",
"items": {
"enum": [
"time_windows",
"driver_assignments",
"vehicle_constraints",
"fixed_order",
"other"
],
"type": "string"
},
"default": [],
"maxItems": 5,
"description": "Unsupported input fields excluded from optimization, listed in the result."
},
"timeAtStopMinutes": {
"type": "integer",
"default": 2,
"maximum": 1440,
"minimum": 0
}
},
"additionalProperties": false
}Optimizes and saves one driving route for one driver with 1–20 delivery stops, from the addresses and settings the user confirmed in the address panel. Use this when a user asks what order to visit delivery addresses, wants an efficient driving route between multiple stops, or wants a route they can open and share. Takes the single-use token the panel issues when the user clicks Optimize route. Returns the stops in optimized order, estimated duration and distance, the route geometry, and route links. Every call creates a new route, and anyone with the returned link can view its addresses. Does not enforce delivery time windows, and not for package tracking, public transit, multiple drivers, or live-traffic estimates.
| Argument | Type | Description |
|---|---|---|
| confirmationToken | string | Single-use token returned when the user clicks Optimize in the address panel. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"confirmationToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Single-use token returned when the user clicks Optimize in the address panel."
}
}
}Returns the nearest address for coordinates from the Use current location button in the panel, to fill the start.
| Argument | Type | Description |
|---|---|---|
| latitude* | number | |
| longitude* | number |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
}Finds Google address suggestions, with place IDs, for one address or place name. Use this when a user wants to plan deliveries, order driving stops, or optimize a multi-stop driving route and provides addresses or place names, including pasted spreadsheets, tables, CSV, or numbered lists. Suggestions come from autocomplete and are not validated addresses. Not for general place recommendations, package tracking, or public-transit directions.
| Argument | Type | Description |
|---|---|---|
| query* | string | |
| locationBias | object | Optional search-area coordinates from the user or a verified location source. Biases suggestions toward this area without restricting them to it. Radius is in metres and defaults to 5000. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 300,
"minLength": 3
},
"locationBias": {
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"radius": {
"type": "number",
"maximum": 50000,
"exclusiveMinimum": 0
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"description": "Optional search-area coordinates from the user or a verified location source. Biases suggestions toward this area without restricting them to it. Radius is in metres and defaults to 5000.",
"additionalProperties": false
}
},
"additionalProperties": false
}Shows a panel where the user picks a match for each address and sets the start, finish, time at each stop and distance unit. Takes each original address with its suggested matches; addresses without suggestions let the user search again in the panel. Missing start and finish appear as empty fields, and fields in routeSettings.ignoredFields are listed as not applied. Read-only: when the user clicks Optimize, the panel issues a single-use confirmation token for route creation.
| Argument | Type | Description |
|---|---|---|
| addresses* | array | |
| routeSettings | object | Initial route settings. The form collects start, end (or a return to the start), time at stop and distance unit, and adds empty start and finish fields when they are missing. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"addresses"
],
"properties": {
"addresses": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"role",
"originalAddress",
"candidates"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"role": {
"enum": [
"start",
"stop",
"finish"
],
"type": "string"
},
"notice": {
"type": "string",
"maxLength": 500,
"description": "Town, country, street, or postcode differences between the candidates and the original address."
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [
"placeId",
"address"
],
"properties": {
"type": {
"enum": [
"precise_location",
"lodging",
"restaurant_cafe",
"store",
"airport",
"train_station",
"school",
"locality_political"
],
"type": "string"
},
"address": {
"type": "string",
"maxLength": 1000,
"minLength": 1
},
"placeId": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 5
},
"originalAddress": {
"type": "string",
"maxLength": 300,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 22
},
"routeSettings": {
"type": "object",
"default": {},
"properties": {
"roundTrip": {
"type": "boolean",
"default": true,
"description": "Whether the route ends back at the start. The user can choose an end location in the form instead."
},
"distanceUnit": {
"enum": [
"km",
"miles"
],
"type": "string",
"default": "km"
},
"ignoredFields": {
"type": "array",
"items": {
"enum": [
"time_windows",
"driver_assignments",
"vehicle_constraints",
"fixed_order",
"other"
],
"type": "string"
},
"default": [],
"maxItems": 5
},
"timeAtStopMinutes": {
"type": "integer",
"default": 2,
"maximum": 1440,
"minimum": 0
}
},
"description": "Initial route settings. The form collects start, end (or a return to the start), time at stop and distance unit, and adds empty start and finish fields when they are missing.",
"additionalProperties": false
}
},
"additionalProperties": false
}Shows a link to Spoke Dispatch, our route planner for teams, for needs this free planner does not cover: multiple drivers, enforced delivery time windows, or more than 20 delivery stops. Use this only when the user explicitly asks for one of those. It only displays the link; it does not transfer addresses or create a Dispatch account.
| Argument | Type | Description |
|---|---|---|
| reason* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reason"
],
"properties": {
"reason": {
"enum": [
"multiple_drivers",
"time_windows",
"stop_limit"
],
"type": "string"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 4, 2026.