OpenStreetMap について
OpenStreetMapは、旅行計画や場所の調査向けの読み取り専用MCPサーバーです。公開OSMサービスを通じてジオコーディング、移動手段別のルート、最適化、等時間圏、POI検索を提供し、通常APIキーは不要です。
主な機能
- 01ジオコーディングと逆ジオコーディング
- 02徒歩、車、自転車のルート
- 03ルート行列と経由地の最適化
- 04到達可能範囲の等時間圏
- 05周辺POIの検索と詳細
- 06ツールの絞り込みと構造化結果
活用シーン
- 01座標や周辺スポットの検索
- 02移動手段ごとの所要時間の比較
- 03複数地点を巡る旅行の計画
- 04所定時間内に到達できる範囲の確認
MCP 対応
MCPクライアントに11個の読み取り専用ツールを公開し、設定により厳選した6個に絞れます。結果には構造化コンテンツとスキーマが含まれます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y osm-mcpOSM_USER_AGENTIdentifying User-Agent sent to all OSM services (Nominatim requires one)ORS_API_KEYシークレットOptional OpenRouteService key; switches routing/matrix/isochrones to ORSOSM_ALLOW_TOOLSComma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)OSM_DENY_TOOLSComma-separated tool names or list_* prefixes to remove from whatever OSM_ALLOW_TOOLS leftローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
11掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 結果の最大数。デフォルトは 3 |
| query | string | はい | 地名または住所 |
| language | string | いいえ | 地名に使用する言語("en" や "de" などの IETF コード)。デフォルトは "en" |
| provider | enum | いいえ | 使用するジオコーダー。デフォルトは nominatimnominatim | photon |
| countrycodes | string | いいえ | 対象国を制限します。ISO 3166-1 alpha-2 コードをコンマ区切りで指定します(例:"de,lu"、Nominatim のみ) |
詳細
osm-mcp
旅行計画向けに開発された、OpenStreetMap用のModel Context Protocol(MCP)サーバーです。
Claude Code、Claude Desktop、CodexなどのMCPクライアントが、場所に関する質問に答えられるようにします。ジオコーディング、徒歩・自動車・自転車での距離と所要時間、複数地点を経由するルートの最適化、等時間圏、POI検索に対応する、読み取り専用の11個のツールを備えています。
ツールは11個まで使う必要はありません。OSM_ALLOW_TOOLS=essentialを設定すると、厳選された6個だけが登録されます。モデルは11個よりも6個の中から、適切なツールをはるかに確実に選べます。詳しくは読み込むツールの選択をご覧ください。
すべてのバックエンドは無料のOpenStreetMap公開サービスなので、APIキーは不要です。必要に応じてOpenRouteServiceのキーを指定し、ルーティングエンジンを切り替えることもできます。
特長
- 正確な徒歩・自転車ルート。 OSRMの公開デモサーバーは、OSRM URLパス内のプロファイル部分を無視し、FOSSGISの
routed-foot/routed-bike/routed-carというパスプレフィックスを使わない限り、常に自動車ルートを返します。既存のOSM MCPサーバーの多くはこれを誤り、徒歩の問い合わせに対して気づかれないまま自動車での所要時間を返します。このサーバーはこれらのプレフィックスを使い、稼働中のスモークテストでは、徒歩ルートの所要時間が自動車ルートより大幅に長いことを検証します。 - 設計上、ポリシーに準拠。 サービスごとのレート制限(NominatimとOSRMは1秒あたり1リクエスト)、すべてのリクエストに識別可能なUser-Agentを付与(Nominatimの利用ポリシーで必須)、レスポンスのキャッシュ、Overpassの同時実行数を2スロットに制限。不正なクエリ以外のあらゆるエラー時には、呼び出しごとに50秒の予算内で次のOverpassエンドポイントへ自動的にフェイルオーバーします。
- Photonに対応。 komootのPhotonを使った、誤字に強い任意のジオコーディング機能です。インタラクティブな利用を想定して設計されており、Nominatimに大量のリクエストを送るよりも、LLM主導の検索に適しています。
要件
- Node.js ≥ 22
- OpenStreetMapの公開サービスへのインターネット接続(下の表を参照)
設定
すべての変数は省略可能です。サーバーはすぐに使えます。
| 変数 | デフォルト | 説明 |
|---|---|---|
OSM_USER_AGENT | osm-mcp/<version> (+https://github.com/ni-c/osm-mcp) | すべてのサービスに送信される User-Agent です。Nominatim では、実際の識別可能な User-Agent が必要です。 |
NOMINATIM_BASE_URL | https://nominatim.openstreetmap.org | ジオコーディング/逆ジオコーディング |
PHOTON_BASE_URL | https://photon.komoot.io | 誤入力に対応したジオコーディング |
OSRM_BASE_URL | https://routing.openstreetmap.de | ルーティング、行列、旅行の最適化に使用します。routed-{car,bike,foot} のパスプレフィックス(FOSSGIS のレイアウト)を提供している必要があります。 |
OVERPASS_BASE_URL | https://z.overpass-api.de/api/interpreter,https://lz4.overpass-api.de/api/interpreter | カンマ区切りの Overpass エンドポイントです。応答があるものが見つかるまで順番に試します(クエリに構文エラーがある場合は、次のエンドポイントへの切り替えを停止します)。 |
VALHALLA_BASE_URL | https://valhalla1.openstreetmap.de | 等時間圏 |
ORS_API_KEY | – | オプションの OpenRouteService キー(シークレット)です。設定すると、ルート、行列、等時間圏に OSRM/Valhalla ではなく ORS を使用します。無料枠は 1 日あたり 2000 件のルート案内、1 分あたり 40 件です。 |
ORS_BASE_URL | https://api.openrouteservice.org | OpenRouteService エンドポイント |
OSM_CACHE_TTL | 3600 | 同一の上流応答をインメモリーキャッシュから提供する秒数です(0 にするとキャッシュが無効になります)。 |
OSM_ALLOW_TOOLS | no | カンマ区切りのツール名、list_* プレフィックス、または厳選されたプリセットを指定する essential を指定します。 |
OSM_DENY_TOOLS | no | 同じ構文を使用します。OSM_ALLOW_TOOLS によって残ったものから除外されます。 |
読み込むツールの選択
OSM_ALLOW_TOOLS と OSM_DENY_TOOLS には、カンマ区切りでツール名を指定します。
末尾の * は、ファミリー全体に一致します。essential は、次の 6 つのツールをまとめたプリセットです。
geocode、reverse_geocode、find_nearby_pois、poi_details、route、map_link。
OSM_ALLOW_TOOLS=essential
OSM_ALLOW_TOOLS=geocode,route,find_nearby_pois
OSM_DENY_TOOLS=isochrone,optimize_route
一致するツールがないエントリがあると、名前を示して起動が中断されます。そのため、タイプミスによってツールが気付かれないまま非表示になることはありません。環境変数にまでさかのぼって原因を調べる人などいないからです。フィルターされたツールは登録されないため、tools/list にも表示されず、tools/call からも認識されません。
これらのサーバーを同時に複数実行する場合は、mcp-hub も選択肢です。/hub エンドポイントを使うと、各サーバーのツールが 6 つのメタツールに置き換わります。
インストール
Claude Code
claude mcp add osm -- npx -y osm-mcp
Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"osm": {
"command": "npx",
"args": ["-y", "osm-mcp"]
}
}
}
Codex
~/.codex/config.toml:
[mcp_servers.osm]
command = "npx"
args = ["-y", "osm-mcp"]
Docker
SBOM とビルドの来歴情報を含むマルチアーキテクチャ対応です。
docker run -i --rm ghcr.io/ni-c/osm-mcp
-i は必須です。プロトコルは標準入力と標準出力を介して動作します。公開するポートはありません。その他のクライアント設定例は
クライアントガイドをご覧ください。
mcp-hub 経由
ローカルプロセスを起動できないクライアント、たとえば ChatGPT コネクター、Claude on the web、Cursor、LibreChat は、mcp-hub 経由で osm-mcp に接続できます。1 つのコンテナーで複数の stdio MCP サーバーを Streamable HTTP 経由で提供し、単一のパスワードで保護された OAuth 2.1 ログインと、OAuth を利用できないクライアント向けの長期間有効なトークンを使用できます。/hub エンドポイントでは、すべてのサーバーを 6 つのメタツールの背後に配置するため、モデルのコンテキストに N×個のツールスキーマを含めずに、1 つのコネクターからすべてのサーバーにアクセスできます。また、2 種類のプロトコルリビジョンのどちらにも対応しています。このサーバーからの質問は、mcp-hub を経由して相手側のユーザーに届きます。
/config/mcp.json では Claude Code の形式を使用するため、すでにお持ちの設定をそのまま使えます。
{
"mcpServers": {
"osm": {
"command": "npx",
"args": ["-y", "osm-mcp"],
"env": { "OSM_ALLOW_TOOLS": "essential" },
"denyTools": ["isochrone"]
}
}
}
ここでの allowTools と denyTools は、サーバーごとに適用される mcp-hub独自のフィルターです。env 内の *_ALLOW_TOOLS とは異なります。その違いと、誤解を招きやすい点については、クライアントガイドをご覧ください。
ツール
| ツール | 説明 |
|---|---|
geocode | 地名/住所 → 座標(Nominatim または Photon) |
reverse_geocode | 座標 → 最寄りの住所 |
route | 2 地点以上の経由地間の距離と所要時間。foot/car/bike に対応し、ターンごとの概要も任意で取得可能 |
route_matrix | 1 回の呼び出しで、すべての出発地からすべての目的地までの所要時間/距離を取得 |
optimize_route | 複数の立ち寄り先を訪問する最適な順序(巡回セールスマン問題、OSRM trip) |
isochrone | 所要時間または距離の範囲内で到達可能なエリア(Valhalla、またはキーを指定した ORS) |
find_nearby_pois | カテゴリーまたは OSM の生タグで、場所の周辺にある POI を検索し、距離順に並べて表示(Overpass) |
poi_details | 1 つの要素の OSM レコード全体:営業時間、ウェブサイト、電話番号など |
suggest_meeting_point | 2~8 人にとって公平な待ち合わせ場所(移動時間のバランスを考慮) |
straight_line_distance | 大圏距離。オフラインで計算 |
map_link | openstreetmap.org のマーカー/ルート案内リンク。オフラインで生成 |
場所の入力には、地名/住所(自動的にジオコーディング)または座標そのものを "lat,lon" の形式で指定できます。
構造化出力
すべてのツールは outputSchema を宣言し、テキストブロックとともに
structuredContent で応答するため、クライアントは文章を解析せずに結果を利用できます。
{
"untrusted": true,
"source": "openstreetmap",
"profile": "foot",
"engine": "osrm",
"waypoints": ["Berlin Hauptbahnhof", "Brandenburger Tor"],
"distance": "2.3 km",
"distance_m": 2317,
"duration": "29 min",
"duration_s": 1740,
}
すべてのツールには untrusted: true と source: "openstreetmap" が設定されています。例外リストはありません。OpenStreetMap は世界中の誰でも編集でき、ここにあるツールはそれ以外のものを返さないためです。構造化データだけを読み取るクライアントには、そうでなければ、何の前置きもないマッパーの自由記述が渡されてしまいます。
このサーバーが算出する距離、所要時間、座標、実行されたルーティングエンジンは、正確に記述されています。OSM 由来のデータについても説明されていますが、内容は固定されていません。タグの名前空間にはスキーマがなく、マッパーが payment:bitcoin を追加しても poi_details が使えなくなるようなことがあってはなりません。SDK は結果が出力される前にすべての結果をスキーマに照らして検証するため、形状をより厳しく定義すると、まさにその問題が起きてしまいます。
このサーバーが以前からテキストに適用している制御文字と BiDi の除去処理は、今では構造化データにもキーごとに適用されます。以前はシリアライズ済み JSON に対して処理していたため、その中のすべての文字列に自動的に適用されていました。
利用ポリシーとクレジット表記
このサーバーは共有のコミュニティインフラを利用します。公開されている制限はクライアント側で適用しますが、運用者は全体的な利用を控えめにし、非商用の範囲にとどめるよう求めています。
- データ: © OpenStreetMap 寄稿者。ライセンスは ODbL 1.0 です。
- Nominatim: 最大 1 リクエスト/秒。識別可能な User-Agent が必須です。 結果はキャッシュされます(ポリシー)。
- OSRM / Valhalla (FOSSGIS): 節度ある非商用利用。最大 1 リクエスト/秒(詳細)。
- Overpass: IP あたり約 2 つの同時実行枠、1 日あたり 10,000 クエリ未満 (Wiki)。
- Photon: フェアユース(photon.komoot.io)。
大規模または商用利用の場合は、サービスをセルフホストし、*_BASE_URL 変数を自分のインスタンスに設定してください。
意図的に公開していない機能
編集機能はありません。 11 個のツールはすべて OpenStreetMap に対する読み取り専用です。編集 API は一切接続されていないため、無効にする書き込みモードもありません。
レンダリングとトラッキングはありません。 結果は画像ではなく構造化データとリンクであり、map_link を使うと自分で地図を確認するための URL が返されます。また、呼び出し間で保持される状態もありません。
オフラインモードはありません。 すべての回答は、利用ポリシーが適用される公開 OpenStreetMap サービスから取得されます。
安全性
- すべてのツールは読み取り専用です。サーバーが OpenStreetMap に書き込むことはありません。
- 認証情報は不要です。オプションの
ORS_API_KEYは読み込み後にプロセス環境から削除され、エラーメッセージ内では秘匿されます。 - OSM 由来のコンテンツ(名称、住所、タグ)は、モデルが指示ではなくデータとして扱うよう、ツールの結果内で信頼できないデータとしてマークされます。
- 上流のエラーレスポンス本文は短縮され、HTML のエラーページはモデルコンテキストに届く前に破棄されます。HTTP ステータスは本文を読み込む前に判定されます。
- サービスが返す値はすべて、結果に含める前に整形されます。数値は有限値に、文字列は長さに上限が設けられ、形式が不正な要素はリスト全体ではなくその要素だけが破棄されます。
- リダイレクトは追跡されず、すべてのリクエストにはタイムアウトが設定されています。
ドキュメント
完全なガイド、ツールリファレンス、安全性に関する注意事項は
osm-mcp.ni-c.de にあります(ソースは docs/)。
開発
npm install
npm run lint # oxlint + prettier
npm test # unit tests (all upstream APIs mocked)
npm run test:coverage
npm run build
npm run smoke # opt-in LIVE test against the real public services
リリース
タグ駆動のため、手動での公開手順はありません。
[Unreleased]の項目を新しい## [x.y.z] - YYYY-MM-DDセクションに移し、CHANGELOG.mdを更新してpackage.jsonのバージョンを上げます。npm run lint && npm run build && npm run test:coverageを実行します。- コミットし、署名付き注釈付きタグを作成します:
git tag -s vx.y.z -m "vx.y.z"。 git push origin main vx.y.zを実行します。
その後、release.yml がテストを実行し、Trusted
Publishing による provenance 付きで npm に公開し(トークンシークレットは不要です)、CHANGELOG セクションから GitHub リリースを作成し、
MCP registry に
io.github.ni-c/osm-mcp として公開します。ci.yml は同じタグでマルチアーキテクチャイメージを GHCR にプッシュします。
レジストリのステップが失敗した場合は、main で修正して
Publish to MCP Registry ワークフローを実行してください。古いツリーをチェックアウトしてしまうため、タグのジョブを再実行しないでください。
コントリビューション
Issue、ディスカッション、プルリクエストを歓迎します。CONTRIBUTING.md をご覧ください。脆弱性については、公開 Issue ではなく 非公開での報告をご利用ください。ポリシーは SECURITY.md に記載されています。
ライセンス
MIT © Willi Thiel
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。