Splits deliveries across vehicles and orders each route: time windows, capacities, road times. Free.
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.
Say in plain words what the user wants (e.g. 'two depots, 40 pickups and deliveries, 3 vans'). Returns whether this server can do it and, if not, the closest thing it can do. Fast, no solve. Call it first when unsure the tool fits.
The user's routing problem in a sentence or two.
Tool list last changed Oct 25, 2026.
Say in plain words what the user wants (e.g. 'two depots, 40 pickups and deliveries, 3 vans'). Returns whether this server can do it and, if not, the closest thing it can do. Fast, no solve. Call it first when unsure the tool fits.
| Argument | Type | Description |
|---|---|---|
| description* | string | The user's routing problem in a sentence or two. |
{
"type": "object",
"required": [
"description"
],
"properties": {
"description": {
"type": "string",
"maxLength": 2000,
"description": "The user's routing problem in a sentence or two."
}
},
"additionalProperties": false
}Return the full input of one example, in exactly the shape optimize_routes accepts. Edit it (depot, stops, vehicles, windows) to match the user's situation.
| Argument | Type | Description |
|---|---|---|
| lang | string | es = Spanish labels. |
| name* | string |
{
"type": "object",
"required": [
"name"
],
"properties": {
"lang": {
"enum": [
"en",
"es"
],
"type": "string",
"description": "es = Spanish labels."
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}Fetch the result of an optimize_routes job that returned status 'running'. Waits up to wait_seconds; call again while status is 'running'. Jobs expire 15 minutes after they finish.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | |
| wait_seconds | integer |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string"
},
"wait_seconds": {
"type": "integer",
"maximum": 45,
"minimum": 0
}
},
"additionalProperties": false
}List the built-in example routing problems. Use one to see a realistic input, or solve it as-is to show what the tool does.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Plan routes for one or more vehicles from one depot and return, per vehicle, the stop order with arrival times and load so far, plus stops that could not be served, totals, Google Maps links and warnings. Uses real road driving times. Solves take 10-60 s (more when many addresses must be looked up). Pass either `example` or the fields below. If the result has status 'running', call get_route_result with its job_id. Minimal example: {"depot": {"address": "1600 Pennsylvania Ave NW, Washington, DC 20500"}, "stops": [{"id": "Ana", "address": "..."}, {"id": "Bob", "lat": 38.9, "lon": -77.03, "window_open": "09:00", "window_close": "12:00", "service_minutes": 10}], "vehicles": 2}. Omitted: capacity = unlimited, no time windows, 1 vehicle, depot = the first stop, stops are dropped only when they cannot be served at all; every default applied is listed in the result's 'assumptions'. Call get_route_example for complete, realistic inputs.
| Argument | Type | Description |
|---|---|---|
| goal | string | One sentence, in the user's own words, of what they are trying to do (e.g. 'plan tomorrow's deliveries for 3 vans'). Optional; helps improve the tool. |
| depot | object | Where every vehicle starts and ends. Needs an address or lat+lon. If omitted, the first stop is used as the depot (reported in 'assumptions'). |
| stops | array | The places to visit (not the depot). Each needs an address or lat+lon. |
| country | string | Which geocoder reads the addresses: US (US Census, then OpenStreetMap) or OTHER (OpenStreetMap). Default US. |
| example |
| string |
| Solve this built-in example instead of passing the fields below. |
| vehicles | any | Either a number of identical vehicles (unlimited capacity), or one object per vehicle. |
| parameters | object | Optional engine settings: SearchParametersTimeLimit (seconds, default 30, max 60), NoImprovementSeconds (20), RouteTimeLimit (minutes, default 1440), DroppedOrderCost (100000 = serve every stop that can be served), MinuteCost (1), LatePenaltyPerMinute (0 = windows are hard), MaxWaitMinutes (1440), MinimumDriveTime (5). |
| wait_seconds | integer | How long to wait for the solve inside this call (default 25). |
| previous_routes | array | Re-optimize from existing routes: one list of stop ids (or 1-based stop numbers) per vehicle, in visiting order. The solver starts from these and improves them; new stops are fitted in. |
{
"type": "object",
"properties": {
"goal": {
"type": "string",
"maxLength": 300,
"description": "One sentence, in the user's own words, of what they are trying to do (e.g. 'plan tomorrow's deliveries for 3 vans'). Optional; helps improve the tool."
},
"depot": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"lat": {
"type": "number",
"description": "Latitude, decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude, decimal degrees."
},
"open": {
"type": [
"string",
"number"
],
"description": "Earliest departure. Clock time 'HH:MM' (24 h), '8:30 AM', or minutes after midnight (480 = 08:00). Default 00:00."
},
"close": {
"type": [
"string",
"number"
],
"description": "Latest return. Clock time 'HH:MM' (24 h), '8:30 AM', or minutes after midnight (480 = 08:00). Default 24:00."
},
"address": {
"type": "string",
"description": "Street address to geocode. Include city and ZIP/postcode. Not needed when lat and lon are given (lat/lon is faster and never fails)."
}
},
"description": "Where every vehicle starts and ends. Needs an address or lat+lon. If omitted, the first stop is used as the depot (reported in 'assumptions')."
},
"stops": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Your label for the stop (customer name, order no.). Used in results and in previous_routes. Default 'stop N' (1-based)."
},
"lat": {
"type": "number",
"description": "Latitude, decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude, decimal degrees."
},
"demand": {
"type": "number",
"description": "Quantity delivered here (boxes, kg...). Counts against vehicle capacity. Default 0."
},
"address": {
"type": "string",
"description": "Street address to geocode. Include city and ZIP/postcode. Not needed when lat and lon are given (lat/lon is faster and never fails)."
},
"demand2": {
"type": "number",
"description": "Second quantity (e.g. weight), against capacity2."
},
"demand3": {
"type": "number",
"description": "Third quantity (e.g. pallets), against capacity3."
},
"closed_to": {
"type": [
"string",
"number"
],
"description": "End of that period."
},
"closed_from": {
"type": [
"string",
"number"
],
"description": "Start of a period inside the window when the stop cannot be visited (e.g. lunch). Clock time 'HH:MM' (24 h), '8:30 AM', or minutes after midnight (480 = 08:00)."
},
"window_open": {
"type": [
"string",
"number"
],
"description": "Earliest arrival. Clock time 'HH:MM' (24 h), '8:30 AM', or minutes after midnight (480 = 08:00). Default 00:00."
},
"window_close": {
"type": [
"string",
"number"
],
"description": "Latest arrival. Clock time 'HH:MM' (24 h), '8:30 AM', or minutes after midnight (480 = 08:00). Default 24:00. Hard unless parameters.LatePenaltyPerMinute > 0."
},
"service_minutes": {
"type": "number",
"description": "Minutes spent at the stop. Default 0."
}
}
},
"maxItems": 100,
"minItems": 1,
"description": "The places to visit (not the depot). Each needs an address or lat+lon."
},
"country": {
"enum": [
"US",
"OTHER"
],
"type": "string",
"description": "Which geocoder reads the addresses: US (US Census, then OpenStreetMap) or OTHER (OpenStreetMap). Default US."
},
"example": {
"type": "string",
"description": "Solve this built-in example instead of passing the fields below."
},
"vehicles": {
"oneOf": [
{
"type": "integer",
"maximum": 25,
"minimum": 1
},
{
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Name, e.g. 'Van 1'."
},
"capacity": {
"type": "number",
"description": "Max total demand. Omitted = unlimited."
},
"capacity2": {
"type": "number"
},
"capacity3": {
"type": "number"
},
"fixed_cost": {
"type": "number",
"description": "Cost of using this vehicle at all, in driving minutes. Raise it to use fewer vehicles. Default 0."
},
"speed_factor": {
"type": "number",
"description": "Driving time multiplier: 1.2 = 20% slower. Default 1."
},
"service_factor": {
"type": "number",
"description": "Service time multiplier. Default 1."
},
"max_route_minutes": {
"type": "number",
"description": "Longest route, depot to depot, waiting included."
}
}
},
"maxItems": 25,
"minItems": 1
}
],
"description": "Either a number of identical vehicles (unlimited capacity), or one object per vehicle."
},
"parameters": {
"type": "object",
"description": "Optional engine settings: SearchParametersTimeLimit (seconds, default 30, max 60), NoImprovementSeconds (20), RouteTimeLimit (minutes, default 1440), DroppedOrderCost (100000 = serve every stop that can be served), MinuteCost (1), LatePenaltyPerMinute (0 = windows are hard), MaxWaitMinutes (1440), MinimumDriveTime (5)."
},
"wait_seconds": {
"type": "integer",
"maximum": 45,
"minimum": 0,
"description": "How long to wait for the solve inside this call (default 25)."
},
"previous_routes": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": [
"string",
"integer"
]
}
},
"description": "Re-optimize from existing routes: one list of stop ids (or 1-based stop numbers) per vehicle, in visiting order. The solver starts from these and improves them; new stops are fitted in."
}
}
}