Skip to content

shimizu/OSM-GeoJSON-MCP-Server

Repository files navigation

OSM GeoJSON MCP Server

OpenStreetMapのデータをOverpass API経由で取得し、GeoJSON形式で保存するMCP (Model Context Protocol)サーバーです。

🌟 主要機能

🗺️ 地理データ取得ツール (8種類)

  • 🏢 建物データ取得 (get_buildings): 住宅、商業、工業、公共建物の取得
  • 🛣️ 道路ネットワーク取得 (get_roads): 高速道路から住宅街道路までの道路データ
  • 🏪 アメニティ取得 (get_amenities): レストラン、病院、学校などのPOIデータ
  • 🌊 水域データ取得 (get_waterways): 川、湖、運河、貯水池などの水域データ
  • 🌳 緑地データ取得 (get_green_spaces): 公園、森林、農地、草地などの緑地
  • 🚃 鉄道データ取得 (get_railways): 鉄道線路、駅、地下鉄、トラムなど

🔧 システム機能(4種類)

  • 📊 API統計 (get_api_stats): 使用統計、キャッシュ状況、エラー率の監視
  • 🔧 接続テスト (test_connection): Overpass APIサーバーへの接続診断
  • 🔄 データ変換 (convert_to_geojson): OSMデータからGeoJSONへの変換
  • 📁 ダウンロード機能: 3種のデータダウンロードツール
  • 📁 ファイル出力: 全ツールでファイルエクスポート機能 (.geojson/.json)

🚀 高度な機能

💾 キャッシュシステム

  • 15分TTL: OSM規約準拠のキャッシュ期間
  • LRUアルゴリズム: メモリ効率的なキャッシュ管理
  • 重複リクエスト防止: 同一クエリの自動キャッシュ利用

📈 ログ・監視機能

  • 詳細ログ: API使用状況、応答時間、エラー率の追跡
  • 統計情報: キャッシュヒット率、サーバー別パフォーマンス
  • リアルタイム監視: 稼働時間、リクエスト頻度の表示

⚡ エラーハンドリング

  • MCP準拠エラー: McpErrorクラスによる標準エラーコード対応
  • マルチサーバー対応: 3サーバーの自動フォールバック
  • 指数バックオフ: レート制限時の適応的待機
  • 5xx系エラー対応: サーバーエラー時の自動リトライ
  • 詳細エラー情報: デバッグに有用な追加情報を提供

📦 インストールと使用方法

1. 依存関係のインストール

npm install

2. サーバーの起動

# 通常の起動
npm start

# 開発モード(MCP Inspectorを使用)
npm run dev

3. テスト実行

# 全テストを実行
npm test

# 重要なテストのみ実行
npm run test:critical

# 高速テスト(重要テスト + 早期終了)
npm run test:fast

# 個別テスト実行
npm run test:simple       # 基本接続テスト
npm run test:diagnostic   # ネットワーク診断
npm run test:features     # 新機能テスト
npm run test:download     # ダウンロード機能テスト
npm run test:direct       # 直接ファイル出力テスト

# MCPプロトコル検証テスト(新機能)
node test/mcp-protocol-verification.js    # プロトコル準拠確認
node test/error-handling-test.js          # エラーハンドリング検証
node test/integration-test.js             # 統合テスト実行

🎯 Claude での使用例

💬 プロンプト例

📍 特定地域の建物データ取得

東京駅周辺(東経139.765-139.768度、北緯35.679-35.682度)の建物データをGeoJSON形式で取得してください。

🏙️ エリア分析用データ収集

新宿駅周辺の以下のデータを取得してファイルに保存してください:
- 建物データ(商業施設のみ)
- 道路ネットワーク(主要道路のみ)
- レストランなどの飲食店
座標は東経139.695-139.705度、北緯35.685-35.695度でお願いします。

🔢 件数制限付きデータ取得

渋谷駅周辺の建物データを最大30件まで取得してください。商業施設に限定してGeoJSONで出力をお願いします。

📊 システム状況確認

OSMサーバーの接続状況とAPI使用統計を確認してください。

🌊 河川・水域調査

皇居周辺(東経139.75-139.77度、北緯35.68-35.69度)の水域データ(川、堀など)を取得してください。

🚀 高速データ取得

品川駅周辺の鉄道データを10件まで取得して、レスポンス時間を短縮してください。

🗺️ 地図データ活用例

1. 都市計画・不動産分析

渋谷駅周辺500m四方の建物、道路、公園データを取得して都市密度を分析したい

→ 建物密度、道路アクセス、緑地率などの分析が可能

2. 観光ルート作成

浅草寺周辺の観光スポット(レストラン、神社、公園)を50件まで取得して歩行者道路のデータも欲しい

→ 観光客向けの歩行ルートや見どころマップを作成

3. 災害時避難計画

学校周辺の避難に使える道路、公園、公共施設のデータを収集したい。重要度の高い施設を20件程度で

→ 避難経路や避難場所の最適化に活用

4. 交通インフラ調査

品川駅周辺の鉄道、道路、バス停のデータで交通アクセスを分析したい。主要な交通機関を15件まで

→ 交通利便性の評価や都市計画に活用

📄 レスポンス形式

GeoJSONレスポンス(標準)

{
  "type": "geojson",
  "data": {
    "type": "FeatureCollection",
    "features": [...]
  },
  "summary": {
    "feature_count": 42,
    "limit_applied": 50,
    "is_truncated": false,
    "bbox": [139.765, 35.679, 139.768, 35.682],
    "building_type": "all"
  }
}

ファイル出力レスポンス

{
  "status": "success",
  "message": "建物データをダウンロードしました",
  "file": "./data/tokyo_buildings.geojson",
  "size": "0.85 MB",
  "feature_count": 245,
  "limit_applied": null,
  "is_truncated": false,
  "building_type": "all",
  "bbox": [139.765, 35.679, 139.768, 35.682],
  "server": "overpass-api.de"
}

API統計レスポンス

{
  "timestamp": "2025-07-07T13:00:00.000Z",
  "api_statistics": {
    "uptime": { "formatted": "2h 30m" },
    "requests": { "total": 150, "perMinute": "1.2" },
    "cache": { "hitRate": "75.3%" },
    "errors": { "errorRate": "0.7%" }
  },
  "cache_statistics": { "size": 45 },
  "compliance_info": {
    "user_agent": "OSM-MCP/1.0",
    "rate_limiting": "enabled",
    "caching": "enabled (15min TTL)",
    "overpass_api_compliance": "full"
  }
}

🛠️ 利用可能なツール詳細(全12ツール)

🏢 get_buildings

建物データを取得します。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • building_type (オプション): 建物タイプ (residential, commercial, industrial, public, all)
  • limit (オプション): 取得件数の上限(1-10000)
  • output_path (オプション): ファイル出力パス(.geojson/.json)

🛣️ get_roads

道路ネットワークを取得します。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • road_types (オプション): 道路タイプの配列 (motorway, trunk, primary, secondary, tertiary, residential, all)
  • limit (オプション): 取得件数の上限(1-10000)
  • output_path (オプション): ファイル出力パス

🏪 get_amenities

アメニティ(施設・設備)を取得します。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • amenity_type (オプション): アメニティタイプ (restaurant, hospital, school, bank, cafe, all)
  • limit (オプション): 取得件数の上限(1-10000)
  • output_path (オプション): ファイル出力パス

🌊 get_waterways

水域・河川データを取得します。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • waterway_type (オプション): 水域タイプ (river, stream, canal, lake, reservoir, pond, all)
  • limit (オプション): 取得件数の上限(1-10000)
  • output_path (オプション): ファイル出力パス

🌳 get_green_spaces

緑地・公園データを取得します。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • green_space_type (オプション): 緑地タイプ (park, forest, garden, farmland, grass, meadow, nature_reserve, all)
  • limit (オプション): 取得件数の上限(1-10000)
  • output_path (オプション): ファイル出力パス

🚃 get_railways

鉄道データを取得します。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • railway_type (オプション): 鉄道タイプ (rail, subway, tram, monorail, station, platform, all)
  • limit (オプション): 取得件数の上限(1-10000)
  • output_path (オプション): ファイル出力パス

📊 get_api_stats

API使用統計とシステム状況を取得します。

パラメータ:

  • reset (オプション): 統計をリセットするかどうか(boolean)

🔧 test_connection

Overpass APIサーバーへの接続をテストします。

パラメータ: なし

🔄 convert_to_geojson

OSMファイルをGeoJSONに変換します。

パラメータ:

  • input_path: 入力OSMファイルパス(必須)
  • output_path: 出力GeoJSONファイルパス(必須)

📁 download_osm_data

生のOSMデータをダウンロードします。

パラメータ:

  • query: Overpass QLクエリ(必須)
  • output_path: 保存先ファイルパス(必須)
  • format (オプション): 出力形式 (json, xml)

🌐 download_area_all

指定エリアの全データをダウンロードします。

パラメータ:

  • minLon, minLat, maxLon, maxLat: 取得範囲の座標(必須)
  • output_path: 保存先ファイルパス(必須)

🔬 技術的な詳細

MCPプロトコル実装

  • JSON-RPC 2.0準拠: 完全なプロトコル実装
  • 標準エラーコード: McpErrorクラスによる適切なエラー処理
  • 初期化ハンドラー: InitializedNotificationSchema対応
  • MCP SDK活用: SDKの機能を最大限利用し独自実装を最小化

OSM/Overpass API規約準拠

  • User-Agent識別: OSM-MCP/1.0による適切な識別
  • レート制限遵守: 指数バックオフとサーバー負荷分散
  • キャッシュ実装: 15分TTLによる重複リクエスト防止
  • メモリ制限: 1GB制限でサーバー負荷軽減
  • タイムアウト最適化: 180秒でOverpass API推奨値準拠

高性能アーキテクチャ

  • マルチサーバーフォールバック: 3サーバーの自動切り替え
  • IP直接接続: DNS問題回避のための直接IPアドレス使用
  • 非同期処理: Node.js標準https/fsモジュールによる高効率通信
  • ストリーミング: 大容量データの直接ファイル書き込み

データ品質保証

  • OSM→GeoJSON変換: カスタム変換ロジックによる高精度変換
  • ジオメトリ処理: Point/LineString/Polygon の適切な形状生成
  • 座標検証: 境界ボックスとWGS84座標系の厳密チェック
  • メタデータ保持: OSMタグの完全保持とGeoJSONプロパティ変換

監視・デバッグ機能

  • リアルタイム統計: リクエスト数、応答時間、エラー率の追跡
  • キャッシュ分析: ヒット率、メモリ使用量、TTL管理
  • サーバー監視: 各Overpass APIサーバーの健全性チェック
  • 包括的テスト: 接続、機能、パフォーマンステストの自動実行

🏆 MCPプロトコル対応状況

✅ 完全準拠(2025年7月更新)

  • 📋 MCP 2024-11-05 仕様: 完全準拠
  • 🔧 エラーハンドリング: McpError クラスによる標準エラーコード対応
  • 🧪 テスト品質: プロトコル・エラー・統合テスト 100%成功率
  • 🚀 Claude Code 統合: 安定動作確認済み

📊 実装詳細

機能カテゴリ 対応状況 詳細
初期化ハンドラー ✅ 完了 initialize, initialized 対応
プロトコル応答 ✅ 完了 JSON-RPC 2.0 準拠
ツール機能 ✅ 完了 12ツール、スキーマ検証済み
エラーハンドリング ✅ 完了 標準エラーコード (-32601, -32602, -32603)
統合テスト ✅ 完了 実用シナリオでの動作確認済み

🧪 品質保証

  • プロトコルテスト: 5/5 成功(ping, initialize, initialized, tools/list, tools/call)
  • エラーハンドリングテスト: 5/5 成功(引数検証、座標検証、不明ツール等)
  • 統合テスト: 9/9 成功(実データ取得、並行処理、全ツール動作確認)
  • パフォーマンステスト: 並行処理対応、キャッシュ機能正常動作

⚠️ 制限事項と推奨事項

境界ボックスサイズ

  • 推奨サイズ: 0.005° × 0.005° 以下(約500m四方)
  • 最大サイズ: 0.001平方度以下(タイムアウト防止)
  • 都市部: より小さな範囲での分割取得を推奨

パフォーマンス考慮事項

  • 建物クエリ: 道路クエリより高コスト
  • リレーション処理: 境界線データは複雑度が高い
  • キャッシュ活用: 同一範囲の再取得は15分間キャッシュされる

利用規約遵守

  • レート制限: 1秒あたり1リクエスト以下を推奨
  • 適切な利用: 教育・研究・非営利目的での使用
  • サーバー負荷軽減: キャッシュ機能を積極的に活用

📈 パフォーマンス指標

実測値(東京駅周辺 0.003° × 0.003°)

  • 建物データ: 20件、4.4秒、22KB
  • 道路データ: 361件、2.1秒、129KB
  • アメニティ: 24件、12.6秒、4.5KB
  • キャッシュヒット: < 1秒(75%高速化)

🔢 件数制限機能

自然言語での制限指定

プロンプトに「最大30件まで」「10件程度」「5つまで」などの表現を含めると、自動的に件数制限が適用されます:

東京駅周辺の建物データを最大50件まで取得してください
↓ 自動的に limit: 50 が適用される

品川駅の鉄道データを10件程度で
↓ 自動的に limit: 10 が適用される

対応する表現パターン

  • 日本語: 最大N件、N件まで、N件以内、上限N件、N個まで、Nつまで
  • 英語: limit N, max N, top N, first N, up to N

制限値の仕様

  • 範囲: 1-10000件
  • 適用: Overpass API レベルで効率的に制限
  • メタデータ: レスポンスに limit_appliedis_truncated を含む
  • パフォーマンス: 制限により高速化とメモリ効率化を実現

🎛️ Claude Code 設定

Claude Code での使用

Claude Code では claude mcp add コマンドでMCPサーバーを登録します:

# プロジェクトに移動
cd /path/to/osm-geojson-mcp-server

# 実行権限を付与(初回のみ必要)
chmod +x src/index.js

# MCPサーバーを登録(ローカルスコープ)
claude mcp add osm-geojson node src/index.js

# または絶対パスで登録
claude mcp add osm-geojson [absolute path to ]/osm-geojson-mcp-server/src/index.js

詳細は Claude Code MCP ドキュメント を参照してください。

使用開始

claudeを起動後/mcpコマンドを実行しMCPが正しく接続できているか確認してください。

✔ connectedが表示されていれば正常に動作しています。

Claude に以下のように話しかけてください:

「東京駅周辺の建物データを取得して」
「新宿の地図データを分析したい」
「OSMサーバーの接続状況を確認して」

Claude が自動的に適切なツールを選択してデータを取得します。

📝 更新履歴

v1.1.0 (2025-07-08) - MCPプロトコル完全準拠

  • MCPプロトコル完全準拠: MCP 2024-11-05 仕様に完全対応
  • エラーハンドリング改善: McpErrorクラスと標準エラーコード実装
  • 包括的テスト追加: プロトコル・エラー・統合テストで100%成功率達成
  • test_connection改善: JSON形式での応答統一
  • Claude Code統合: 安定動作確認とドキュメント更新

v1.0.0 - 初期リリース

  • 🗺️ 8種類の地理データ取得ツール
  • 🔧 4種類のシステム機能ツール
  • 💾 LRUキャッシュシステム実装
  • 📈 詳細ログ・監視機能
  • ⚡ マルチサーバーフォールバック機能

🤝 コントリビューション

  1. このリポジトリをフォーク
  2. 機能ブランチを作成 (git checkout -b feature/AmazingFeature)
  3. 変更をコミット (git commit -m 'Add some AmazingFeature')
  4. ブランチにプッシュ (git push origin feature/AmazingFeature)
  5. プルリクエストを作成

📄 ライセンス

MIT License - 詳細は LICENSE ファイルを参照

🙏 謝辞

About

OpenStreetMap(OSM)のデータをGeoJSON形式で取得するMCP(Model Context Protocol)サーバー。

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors