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 | 1 つのルートを計算 |
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— 最大結果数。上限は 10 件filters— 任意の検索フィルター
ユーザーの依頼から特定できるフィールドのみ指定してください。不足している住所情報を作り出さないでください。
一般的な地名や省略された地名の候補を絞り込むには、国と市が役立つ場合があります。
出力
{
"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
2 つの場所の間の車両ルートを計算します。
次の情報が必要な場合に使用します。
- 車両での移動距離を計算する
- 移動時間を推定する
- 2 つの場所の間のルートを取得する
- ルートのジオメトリを取得する
- ルートが通る道路を確認する
- 特定の道路種別を避ける
入力
{
"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
複数の地点間の距離および/または移動時間の行列を計算します。
次のような場合に使用してください。
- 最寄りのドライバー、車両、店舗、施設を見つける
- 複数の目的地を比較する
- 複数の出発地と目的地の組み合わせを比較する
- 距離または移動時間の行列を作成する
2地点間の単一ルートには使用しないでください。その場合は route を使用してください。
入力
{
"coordinates": [
"103.8391,1.2771",
"103.8590,1.2834",
"103.7986,1.2885"
],
"annotations": ["distance"]
}
各座標には、coordinates リスト内の位置に基づいて、0から始まる固定インデックスが割り当てられます。
行列の行は出発地に対応します。
行列の列は目的地に対応します。
次の位置にある行列の値:
[row][column]
は、その出発地からその目的地までのルートを表します。
例:
durations[0][2]
は、出発地インデックス 0 から目的地インデックス 2 までの移動時間です。
ツールが返す sources と destinations には元の座標インデックスが含まれているため、行列をユーザーの各地点に対応付けることができます。
最寄りのドライバーの例
次のような質問の場合:
この顧客に最も近いドライバーは誰ですか?
顧客を最初に指定してください。
coordinates[0] = customer
coordinates[1] = driver A
coordinates[2] = driver B
coordinates[3] = driver C
次に、顧客を出発地、ドライバーを目的地として指定します。
対応する行列の行を確認し、null 以外で最小の距離または移動時間を選択してください。
出発地と目的地の選択
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
ジョブと配送を車両に割り当て、各車両が停車地を訪問する順序を決定します。
次のような場合に使用してください。
- 複数の配送または集荷を車両に割り当てる
- 数量、容量、スキル、時間枠を考慮してフリートのルートを計画する
- 1台の車両が順番に担当する集荷と配送を組み合わせる
- 複数の停車地を訪問する順序を決定する
- 複数車両のルーティングを最適化する
単一ルートには使用しないでください。その場合は 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は多次元です。各次元につき値を1つ指定します。
{"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では常に空です。geometryはoptions.gを指定した場合にのみ表示されます。
必ずunassignedを確認してください。
すべてのタスクを車両に割り当てられるとは限りません。
ユーザーが座標の代わりに場所名や住所を指定した場合は、まずすべての場所についてgeocodeを呼び出し、選択した座標を最適化リクエストで使用してください。
エージェントのワークフロー
JustRouting MCPは、AIアシスタントがツールを組み合わせて、より大きなワークフローを構築できるように設計されています。
2地点間のルートを検索する
たとえば、次のようなリクエストの場合:
Marina Bay SandsからChangi Airportまで、車でどのくらいかかりますか?
ワークフローは次のとおりです。
geocode → geocode → route
- 出発地をジオコーディングします。
- 目的地をジオコーディングします。
- 得られた座標を
routeに渡します。
ユーザーがすでに座標を指定している場合は、ジオコーディングを省略します。
最寄りのドライバーを見つける
たとえば、次のようなリクエストの場合:
顧客に最も近いドライバーは誰ですか?
ワークフローは次のとおりです。
geocode × N → table
- 顧客の場所をジオコーディングします。
- 各ドライバーの場所をジオコーディングします。
- 場所を固定順で並べます。
- 顧客を出発地として使用します。
- ドライバーを目的地として使用します。
- 返された距離または所要時間を比較します。
複数車両の計画を立てる
たとえば、次のようなリクエストの場合:
バンが2台、顧客が6人います。顧客をバンに割り当て、訪問順を決めてください。
ワークフローは次のとおりです。
geocode × N → optimize
- 各車両の出発地/終着地をジオコーディングします。
- すべてのジョブの場所をジオコーディングします。
- 車両ごとに1つの車両エントリーを作成します。
- 顧客ごとに1つのジョブエントリーを作成します。
optimizeを呼び出します。routes[].stepsを読み取り、各車両の行程を確認します。- 担当できなかったジョブがないか、
unassignedを確認します。
座標形式
すべてのルーティングツールで、次の形式を使用します。
longitude,latitude
例:
103.8198,1.3521
形式は次のとおりです。
longitude = 103.8198
latitude = 1.3521
順序を逆にしないでください。
Claude
Claude の MCP 設定に JustRouting MCP を追加します。
{
"mcpServers": {
"justrouting": {
"command": "justrouting-mcp",
"env": {
"JUSTROUTING_API_KEY": "your-api-key"
}
}
}
}
接続すると、Claude は JustRouting のツールを直接使用できます。
Cursor
Cursor の MCP 設定に JustRouting 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 の機能を公開し、API 通信には公式の JustRouting Go クライアントを使用します。
リリース
ビルド済みバイナリは GitHub Releases で公開されています。
リリースを作成するには:
git tag v0.1.0
git push origin v0.1.0
GitHub Actions がバイナリをビルドし、リリースを公開します。
1 行のインストーラーは、常に最新のリリースをインストールします。
ロードマップ
基本的なルーティング機能はすでに利用できます。
- ルート計算
- ジオコーディング
- 距離および所要時間の行列
- 車両ルーティングの最適化
今後、次のような改善を予定しています。
- 代替ルート
- 経由地
- ストリーミング可能な HTTP トランスポート
- リモート MCP のデプロイ
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。