关于 JustRouting MCP Server
JustRouting MCP Server 提供地理编码、路线计算、距离与行程时间矩阵及车辆路线优化,重点覆盖东南亚。适用于通过 MCP 兼容助手处理位置查询和车队规划。
主要功能
- 01地点与地址地理编码
- 02驾车及摩托车路线
- 03距离与行程时间矩阵
- 04多车辆路线优化
- 05容量、技能与时间窗约束
适用场景
- 01计算地点之间的路线
- 02比较前往多个目的地的时间
- 03为客户匹配附近司机
- 04规划多车辆配送路线
MCP 相关
该服务通过 stdio 向 MCP 客户端提供 geocode、route、table 和 optimize 工具。客户端可将这些工具组合用于位置查询和车队规划工作流。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
JustRouting MCP
为 AI 助手提供路线规划、地理编码、距离矩阵和车辆路径规划——专注于东南亚。
JustRouting MCP 让 Claude 和 Cursor 等兼容 MCP 的 AI 助手使用 JustRouting 进行道路路线规划、地理编码、距离和行程时间比较,以及多车辆路线优化。
专为东南亚设计。
快速开始
1. 安装
macOS / Linux
curl -fsSL https://raw.githubusercontent.com/justrouting/mcp/main/install.sh | sh
安装程序会下载适用于你平台的最新预编译二进制文件,并安装 justrouting-mcp。
无需安装 Go。
从源码安装
go install github.com/justrouting/mcp/cmd/justrouting-mcp@latest
确保 justrouting-mcp 可通过 PATH 使用。
2. 设置 API 密钥
从 JustRouting 获取 API 密钥,然后设置:
export JUSTROUTING_API_KEY="your-api-key"
3. 连接到 Claude 或 Cursor
添加以下 MCP 服务配置:
{
"mcpServers": {
"justrouting": {
"command": "justrouting-mcp",
"env": {
"JUSTROUTING_API_KEY": "your-api-key"
}
}
}
}
该服务通过 stdio 与 MCP 客户端通信。
工具
| 工具 | 用途 |
|---|---|
geocode | 地点或地址 → 坐标 |
route | 计算一条路线 |
table | 比较多个地点之间的行程时间或距离 |
optimize | 将任务分配给车辆,并安排停靠点顺序 |
这些工具按任务有意分开:
route = 计算 table = 比较 optimize = 决策
geocode
搜索地点或地址,并将其转换为坐标。
当用户提供以下信息时使用:
- 地点名称
- 地标
- 商家
- 街道地址
- 其他位置描述
如果用户已提供坐标,则不要使用。
输入
{
"name": "Marina Bay Sands",
"housenumber": "10",
"street": "Bayfront Avenue",
"postcode": "018956",
"city": "Singapore",
"country": "Singapore"
}
可用字段如下:
name— 地点、地标或商家名称housenumber— 门牌号或楼宇编号street— 街道名称postcode— 邮政编码或 ZIP 码city— 城市或地区country— 国家/地区limit— 结果数量上限,最多为 10filters— 可选的搜索筛选条件
只提供能从用户请求中确定的字段。不要编造缺失的地址组成部分。
国家/地区和城市信息有助于区分常见或缩写的地点名称。
输出
{
"results": [
{
"longitude": 103.859,
"latitude": 1.2834,
"coordinates": "103.859,1.2834",
"formatted": "Marina Bay Sands, 10 Bayfront Avenue, 018956, Singapore",
"place_id": "51667b3e...",
"country_code": "sg",
"result_type": "building"
}
]
}
结果按相关性排序。
默认返回最匹配的结果。请求多个结果时,选择最符合用户预期地点的结果。
coordinates 值采用 longitude,latitude 格式,可直接传给 route、table 或 optimize。
如果地理编码是路线规划工作流的一部分,请先确认所选结果与预期地点一致,再使用其坐标。
route
计算两个地点之间的驾车路线。
当用户需要以下内容时使用:
- 计算驾车距离
- 估算行程时间
- 获取两个地点之间的路线
- 获取路线几何信息
- 了解路线经过哪些道路
- 避开特定道路类型
输入
{
"origin": "103.8198,1.3521",
"destination": "103.9915,1.3644"
}
坐标必须使用:
longitude,latitude
例如:
103.8198,1.3521
可选的摩托车路线规划:
{
"origin": "103.8198,1.3521",
"destination": "103.9915,1.3644",
"profile": "motorcycle"
}
当用户明确要求规划摩托车路线时,使用 profile: "motorcycle"。
否则,省略 profile,以使用默认的驾车配置。
避开道路
当用户明确要求避开某类道路时,使用 exclude。
支持的值:
tollmotorwayferry
示例:
{
"origin": "103.8198,1.3521",
"destination": "103.9915,1.3644",
"exclude": ["toll"]
}
避开道路只是一项偏好,并非保证。存在合理替代路线时,路线规划引擎会避开指定类型的道路。
输出
{
"distance_meters": 18500,
"duration_seconds": 1500,
"profile": "driving",
"origin": {
"input": "103.8198,1.3521",
"snapped": [103.8197, 1.3520],
"name": "Example Road",
"distance": 4.2
},
"destination": {
"input": "103.9915,1.3644",
"snapped": [103.9915, 1.3644],
"name": "Airport Boulevard",
"distance": 8.1
},
"geometry": "ka|`@_ceeEnAqB...",
"summary": {
"roads": ["East Coast Parkway"],
"tolls": false,
"ferry": false
}
}
distance_meters 是以米为单位的路线距离。
duration_seconds 是以秒为单位的预计行程时长。
geometry 是经过简化的编码折线,可用于在地图上绘制路线。
summary.roads 列出路线经过的主要道路。
summary.tolls 表示路线是否经过收费道路。
summary.ferry 表示路线是否包含渡轮航段。
如果用户提供的是地点名称或地址,而不是坐标,请先调用 geocode。
table
计算多个地点之间的距离和/或行程时间矩阵。
用户需要以下操作时使用:
- 找出最近的司机、车辆、商店或设施
- 比较多个目的地
- 比较多个起点与终点组合
- 构建距离或行程时间矩阵
不要将其用于规划两个地点之间的单条路线。请改用 route。
输入
{
"coordinates": [
"103.8391,1.2771",
"103.8590,1.2834",
"103.7986,1.2885"
],
"annotations": ["distance"]
}
每个坐标都会根据其在 coordinates 列表中的位置,获得一个稳定的从零开始的索引。
矩阵的行对应起点。
矩阵的列对应目的地。
位于以下位置的矩阵值:
[row][column]
表示从该起点到该目的地的路线。
例如:
durations[0][2]
表示从起点索引 0 到目的地索引 2 的行程时间。
工具返回的 sources 和 destinations 包含原始坐标索引,因此可以将矩阵映射回用户提供的地点。
最近司机示例
对于以下问题:
哪位司机离这位客户最近?
请将客户放在首位:
coordinates[0] = customer
coordinates[1] = driver A
coordinates[2] = driver B
coordinates[3] = driver C
然后将客户作为起点、司机作为目的地。
读取对应的矩阵行,并选择非空距离或时长中最小的值。
选择起点和目的地
source 和 destinations 可以将矩阵限制为指定的坐标索引。
例如:
{
"coordinates": [
"103.8391,1.2771",
"103.8590,1.2834",
"103.7986,1.2885"
],
"sources": [0],
"destinations": [1, 2]
}
这会计算从坐标 0 到坐标 1 和 2 的路线。
注释
使用:
"annotations": ["duration"]
获取行程时间。
使用:
"annotations": ["distance"]
获取距离。
使用:
"annotations": ["duration", "distance"]
同时获取两者。
如果省略,则会返回两者。
输出
{
"code": "Ok",
"durations": [
[0, 1860, null],
[1850, 0, 2100],
[null, 2110, 0]
],
"distances": [
[0, 14200, null],
[14100, 0, 18400],
[null, 18200, 0]
],
"sources": [
{
"index": 0,
"name": "Duxton Road",
"location": [103.8391, 1.2771],
"distance": 12.3
}
],
"destinations": [
{
"index": 1,
"name": "Bayfront Avenue",
"location": [103.8590, 1.2834],
"distance": 8.4
}
]
}
durations 的单位是秒。
distances 的单位是米。
矩阵值为 null 表示对应的起点与目的地之间无法到达。切勿将 null 解释为零。
optimize
将任务和货运分配给车辆,并确定每辆车访问各停靠点的顺序。
用户需要以下操作时使用:
- 将多项配送或取货任务分配给车辆
- 根据货量、载客量、技能或时间窗,为车队规划路线
- 将取货与配送配对,并要求同一辆车按顺序完成
- 确定多个停靠点的访问顺序
- 优化多车辆路线方案
不要将其用于单条路线。请改用 route。
不要仅用它来比较地点之间的距离。请改用 table。
输入
{
"vehicles": [
{
"id": 1,
"start": "103.7923,1.3246",
"end": "103.7923,1.3246"
},
{
"id": 2,
"start": "103.8232,1.3241",
"end": "103.8232,1.3241"
}
],
"jobs": [
{
"id": 1,
"location": "103.7975,1.3104"
},
{
"id": 2,
"location": "103.7843,1.3149"
},
{
"id": 3,
"location": "103.7976,1.3198"
}
]
}
每辆车必须至少设置 start 或 end。
对于往返路线,将两者设为同一地点:
{
"id": 1,
"start": "103.7923,1.3246",
"end": "103.7923,1.3246"
}
如果省略 start 或 end,车辆可以从任意地点出发或结束行程。
每辆车和每项任务都必须有唯一的 id。货运的取货 id 在所有取货任务中必须唯一,配送 id 在所有配送任务中必须唯一。休息时间的 id 在其所属车辆内必须唯一。
地点必须使用:
longitude,latitude
一个包含载客量、时间窗和优先级的更完整示例:
{
"vehicles": [
{
"id": 1,
"start": "103.7923,1.3246",
"end": "103.7923,1.3246",
"capacity": [1000, 4],
"time_window": [0, 28800]
}
],
"jobs": [
{
"id": 1,
"location": "103.7975,1.3104",
"delivery": [100, 1],
"service": 300,
"time_windows": [[0, 14400]],
"priority": 80
}
],
"shipments": [
{
"pickup": {"id": 2, "location": "103.7843,1.3149", "service": 150},
"delivery": {"id": 3, "location": "103.7976,1.3198", "service": 150},
"amount": [50]
}
],
"options": {"g": true}
}
车辆配置
每辆车都可以使用自己的路线配置。
例如:
{
"id": 1,
"profile": "motorcycle",
"start": "103.7923,1.3246",
"end": "103.7923,1.3246"
}
当用户明确要求摩托车路线时,使用 "motorcycle"。
否则,省略 profile,以使用默认的驾车配置。
数量和容量
车辆的 capacity 以及任务的 delivery、pickup 和 amount 都是多维的:每个维度对应一个值。
{"capacity": [1000, 4]}
表示 1000 千克和 4 个托盘。单个请求中的所有此类向量长度必须相同。
只有当车辆的载荷始终不超过其容量时,它才能执行一组任务。容量不足不属于错误:相应任务会被移至 unassigned。
技能
skills 是整数能力标签。只有具备任务所需全部技能的车辆才能执行该任务。没有技能要求的任务可以由任何车辆执行。
时间窗
时间窗是以秒为单位的闭区间 [start, end]。整个请求使用同一种计时方式:相对时间(例如 [0, 14400] 表示在规划开始后的 4 小时内)或绝对 UNIX 时间戳。提前到达时,车辆会等待时间窗开启。无法及时抵达的任务会被移至 unassigned。
优先级
priority 的取值范围为 0-100。当无法安排所有任务时,保留优先级较高的任务,并舍弃优先级较低的任务。
配送任务
配送任务由同一辆车按顺序执行取货和送达,amount 在取货时装载,在送达时卸载。
休息
车辆的 breaks 是休息时段,每个休息时段都有一个在该车辆内唯一的 id、可选的 time_windows,以及以秒为单位的 service 时长。
自定义矩阵
matrices 用于按配置("car" 或 "motorcycle")提供自定义行程时间(durations)、距离和成本矩阵。仅当用户提供自己的行程时间时才使用它;此时,location_index、start_index 和 end_index 引用矩阵的行和列,而不是坐标。
路线几何信息
设置 "options": {"g": true} 可获取每条路线的编码折线和距离。当用户想要在地图上绘制路线时使用此选项。
输出
简化的结果如下:
{
"summary": {
"cost": 2733,
"routes": 2,
"unassigned": 0,
"duration": 2733,
"delivery": [100, 1]
},
"routes": [
{
"vehicle": 1,
"cost": 1144,
"duration": 1144,
"geometry": "encoded_polyline",
"steps": [
{
"type": "start",
"location": [103.7923, 1.3246],
"arrival": 0
},
{
"type": "job",
"id": 2,
"job": 2,
"location": [103.7843, 1.3149],
"arrival": 269,
"duration": 269,
"load": [50]
},
{
"type": "end",
"location": [103.7923, 1.3246],
"arrival": 1144,
"duration": 1144
}
]
}
],
"unassigned": []
}
按顺序读取每条路线的 steps,以确定:
- 哪辆车执行每项任务
- 任务的访问顺序
- 每项任务的抵达时间
路线的 start 和 end 步骤之间可能出现 pickup、delivery 和 break 步骤。violations 字段是为保证 API 完整性而提供的,在托管 API 中始终为空。只有在使用 options.g 时才会出现 geometry。
务必检查 unassigned。
不要假设每项任务都能分配给某辆车。
如果用户提供的是地点名称或地址,而非坐标,请先对每个地点调用 geocode,并在优化请求中使用选定的坐标。
Agent 工作流
JustRouting MCP 的设计目的,是让 AI 助手能够组合多个工具,构建更大的工作流。
计算两地之间的路线
例如:
从 Marina Bay Sands 开车到樟宜机场需要多久?
工作流如下:
geocode → geocode → route
- 对起点进行地理编码。
- 对终点进行地理编码。
- 将生成的坐标传递给
route。
如果用户已经提供坐标,则跳过地理编码。
查找最近的司机
例如:
哪位司机离客户最近?
工作流如下:
geocode × N → table
- 对客户所在位置进行地理编码。
- 对每位司机的位置进行地理编码。
- 按固定顺序保留各地点。
- 将客户所在位置设为来源地。
- 将司机所在位置设为目的地。
- 比较返回的距离或行程时间。
规划多辆车的路线
例如:
我有两辆货车和六位客户。请将客户分配给货车并确定停靠顺序。
工作流如下:
geocode × N → optimize
- 对每辆车的起点/终点位置进行地理编码。
- 对每项任务的位置进行地理编码。
- 为每辆车创建一个车辆条目。
- 为每位客户创建一个任务条目。
- 调用
optimize。 - 读取
routes[].steps,确定每辆车的行程安排。 - 检查
unassigned,查看哪些任务无法执行。
坐标格式
所有路径规划工具均使用:
longitude,latitude
例如:
103.8198,1.3521
这是:
longitude = 103.8198
latitude = 1.3521
请勿颠倒顺序。
Claude
将 JustRouting MCP 添加到 Claude MCP 配置中:
{
"mcpServers": {
"justrouting": {
"command": "justrouting-mcp",
"env": {
"JUSTROUTING_API_KEY": "your-api-key"
}
}
}
}
连接后,Claude 即可直接使用 JustRouting 工具。
Cursor
将 JustRouting MCP 添加到 Cursor MCP 配置中:
{
"mcpServers": {
"justrouting": {
"command": "justrouting-mcp",
"env": {
"JUSTROUTING_API_KEY": "your-api-key"
}
}
}
}
连接后,Cursor 即可直接使用 JustRouting 工具。
要求
使用预构建二进制文件:
- JustRouting API 密钥
从源代码安装:
- Go 1.25+
MCP 服务目前使用 stdio 传输方式。
开发
克隆代码仓库:
git clone https://github.com/justrouting/mcp.git
cd mcp
安装依赖项:
go mod download
运行测试:
go test ./...
构建:
go build -o justrouting-mcp ./cmd/justrouting-mcp
运行:
JUSTROUTING_API_KEY="YOUR-API-KEY" ./justrouting-mcp
架构
┌─────────────────────────────┐
│ MCP Client │
│ Claude / Cursor / AI │
└──────────────┬──────────────┘
│
│ MCP / stdio
▼
┌─────────────────────────────┐
│ justrouting-mcp │
│ │
│ geocode route │
│ table optimize │
└──────────────┬──────────────┘
│
│ Official Go Client
▼
┌─────────────────────────────┐
│ api.justrouting.tech │
└─────────────────────────────┘
MCP 服务刻意保持轻量。
它通过 MCP 提供 JustRouting 功能,并使用官方的 JustRouting Go 客户端进行 API 通信。
发布版本
预构建二进制文件通过 GitHub Releases 发布。
创建发布版本:
git tag v0.1.0
git push origin v0.1.0
GitHub Actions 会构建二进制文件并发布该版本。
单行安装程序始终安装最新版本。
路线图
核心路径规划功能已可用:
- 路径规划计算
- 地理编码
- 距离和行程时间矩阵
- 车辆路径优化
未来的改进可能包括:
- 备选路线
- 路径点
- 可流式传输的 HTTP 传输方式
- 远程 MCP 部署
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。