🚀 マレーシアオープンデータMCP

マレーシアのオープンデータAPI用のMCP(Model Context Protocol)サーバーで、政府のデータセットやコレクションへの簡単なアクセスを提供します。
これはマレーシア政府やマレーシアのオープンデータ・Jabatan Digital Negara・デジタル省のチームによる公式のMCPサーバーでは ありません。
✨ 主な機能
- 拡張された統一検索:柔軟なトークン化と同義語拡張機能を備えています。
- 用語の正規化によるインテリジェントなクエリ処理
- 複数形や一般的な接頭辞(例:「epayment」の「e」)のサポート
- 異なるデータタイプに対するスマートな優先順位付け
- Pure JavaScriptによるParquetファイルサポート
- ブラウザまたはNode.jsで直接Parquetファイルを解析
- BROTLI圧縮のサポート
- 解析に失敗した場合のメタデータ推定へのフォールバック
- 可視化のための自動ダッシュボードURLマッピング
- ハイブリッドデータアクセスアーキテクチャ
- 効率的な検索のための事前生成静的インデックス
- 詳細なメタデータのための動的API呼び出し
- 複数プロバイダーのジオコーディング
- Google Maps、GrabMaps、Nominatim(OpenStreetMap)のサポート
- 位置と利用可能なAPIキーに基づくインテリジェントなサービス選択
- マレーシアの場所に対するGrabMapsの最適化
- プロバイダー間の自動フォールバック
- 包括的なデータソース
- 豊富なメタデータを持つマレーシアのデータカタログ
- データ可視化のためのインタラクティブなダッシュボード
- マレーシア統計局(DOSM)のデータ
- 天気予報と警報
- 公共交通とGTFSデータ
- 複数プロバイダーのマレーシアジオコーディング
- マレーシアの住所と場所に最適化
- 3段階のジオコーディングシステム:GrabMaps、Google Maps、Nominatim
- マレーシアのカバレッジ向上のためにGrabMapsによるローカル知識を優先
- APIキーが提供されない場合のNominatimへの自動フォールバック
🔧 技術詳細
このMCPサーバーは、効率的なデータアクセスのためにハイブリッドアプローチを実装しています。
- 事前生成静的インデックス:データセットとダッシュボードのリスト表示と検索用
- 動的API呼び出し:特定のデータセットまたはダッシュボードの詳細が要求された場合のみ
このアプローチにはいくつかの利点があります。
- 高速な検索とリスト表示操作
- 外部サービスへのAPI呼び出しの削減
- 一貫したデータアクセスパターン
- 必要なときに最新の詳細情報を提供
📚 ドキュメント
- TOOLS.md - 利用可能なツールとベストプラクティスの詳細情報
- PROMPT.md - AI統合ガイドラインと使用パターン
🤖 AI統合
このMCPサーバーをAIモデルと統合する場合:
- まず統一検索ツールを使用する - すべてのデータクエリには
search_all から始める
- 正しいURLパターンに従う -
https://data.gov.my/... と https://open.dosm.gov.my/... を使用
- Parquetファイルツールを活用する -
parse_parquet_file を使用して直接データにアクセスするか、get_parquet_info を使用してメタデータを取得
- ハイブリッドアプローチを使用する - リスト表示/検索には静的インデックス、詳細にはAPI呼び出し
- ダッシュボード可視化を検討する - 複雑なデータの場合は、
find_dashboard_for_parquet で提供されるダッシュボードリンクを使用
- 複数プロバイダーのマレーシアジオコーディングを活用する - マレーシアの場所クエリの場合、システムは自動的に最適なプロバイダー(GrabMaps、Google Maps、またはNominatim)を選択し、APIキーが設定されていない場合はNominatimに自動フォールバック
詳細なAI統合ガイドラインについては、PROMPT.md を参照してください。
📦 インストール
npm install
💻 開発
開発モードでMCPサーバーを実行するには:
npx @smithery/cli dev
🏗️ ビルド
デプロイ用にMCPサーバーをビルドするには:
npx @smithery/cli build
🚀 デプロイ
このMCPはSmitheryにデプロイするように設計されています。デプロイするには、以下の手順に従ってください。
- Smithery CLIがインストールされていることを確認します。
npm install -g @smithery/cli
- プロジェクトをビルドします。
npx @smithery/cli build
- Smitheryにデプロイします。
npx @smithery/cli deploy
🛠️ 利用可能なツール
データカタログ
list_datasets:データカタログで利用可能なデータセットをリスト表示
get_dataset:データカタログの特定のデータセットからデータを取得
search_datasets:データカタログでデータセットを検索
マレーシア統計局(DOSM)
list_dosm_datasets:DOSMから利用可能なデータセットをリスト表示
get_dosm_dataset:特定のDOSMデータセットからデータを取得
Parquetファイル処理
parse_parquet_file:ParquetファイルURLからデータを解析して表示
get_parquet_info:Parquetファイルのメタデータと構造情報を取得
find_dashboard_for_parquet:Parquetファイルに対応するダッシュボードURLを検索
天気
get_weather_forecast:マレーシアの天気予報を取得
get_weather_warnings:マレーシアの現在の天気警報を取得
get_earthquake_warnings:マレーシアの地震警報を取得
交通
list_transport_agencies:GTFSデータを持つ利用可能な交通機関をリスト表示
get_transport_data:特定の交通機関のGTFSデータを取得
GTFS解析
parse_gtfs_static:特定の交通事業者のGTFS Staticデータ(CSVデータを含むZIPファイル)を解析
parse_gtfs_realtime:車両の位置情報に関するGTFS Realtimeデータ(Protocol Buffer形式)を解析
get_transit_routes:GTFSデータから路線情報を抽出
get_transit_stops:GTFSデータから停留所情報を抽出し、必要に応じて路線でフィルタリング
テスト
hello:MCPサーバーが正常に動作していることを確認するための簡単なテストツール
💻 使用例
天気予報の取得
const result = await tools.get_weather_forecast({
location: "Kuala Lumpur",
days: 3
});
データセットの検索
const result = await tools.search_datasets({
query: "population",
limit: 5
});
GTFSデータの解析
const staticData = await tools.parse_gtfs_static({
provider: "ktmb"
});
const realtimeData = await tools.parse_gtfs_realtime({
provider: "prasarana",
category: "rapid-rail-kl"
});
const routes = await tools.get_transit_routes({
provider: "mybas-johor"
});
const stops = await tools.get_transit_stops({
provider: "prasarana",
category: "rapid-rail-kl",
route_id: "LRT-KJ"
});
⚠️ APIレート制限
基盤となるAPIのレート制限に注意してください。過度のリクエストは制限される場合があります。
📁 プロジェクト構造
src/index.ts:主要なMCPサーバーの実装とツールの登録
src/datacatalogue.tools.ts:データカタログAPIツール
src/dashboards.tools.ts:ダッシュボードアクセスと検索ツール
src/dosm.tools.ts:マレーシア統計局のツール
src/unified-search.tools.ts:トークン化と同義語拡張を備えた拡張統一検索
src/parquet.tools.ts:Parquetファイル解析とメタデータツール
src/weather.tools.ts:天気予報と警報ツール
src/transport.tools.ts:交通とGTFSデータツール
src/gtfs.tools.ts:GTFS解析と分析ツール
src/flood.tools.ts:洪水警報と監視ツール
Dockerfile:Smithery用のDocker設定
smithery.yaml:Smithery設定
package.json:プロジェクトの依存関係とスクリプト
tsconfig.json:TypeScript設定
🏠 ローカルテスト
Smitheryにデプロイする前にローカルでテストするには:
npm run dev
npm run build
npm start
curl -X POST http://localhost:8182/invoke/hello -H "Content-Type: application/json" -d "{}"
Smithery CLIを使用してローカル開発を行うこともできます。
npx @smithery/cli dev
npx @smithery/cli build
🐞 トラブルシューティング
デプロイ問題
デプロイ問題が発生した場合:
- GitHubリポジトリが公開されているか、またはSmitheryに適切に接続されていることを確認します。
Dockerfile と smithery.yaml がリポジトリのルートにあることを確認します。
index.js ファイルが有効なMCPサーバー関数をエクスポートしていることを確認します。
⚙️ 設定
環境変数
このプロジェクトは、以下の構成オプションをサポートしています。
ジオコーディング資格情報(オプション。GTFS交通機能の使用時のみ):
以下の資格情報は、ジオコーディングサービスを必要とする GTFS交通ツールを使用する場合にのみ必要 です。データカタログアクセス、天気予報、DOSMデータなどの他の機能では、これらの資格情報は必要ありません。
- googleMapsApiKey:オプション。提供された場合、システムはGoogle Maps APIを使用して場所名を座標に変換します。
- grabMapsApiKey:オプション。マレーシアの場所に最適化されたGrabMapsジオコーディングに必要。
- awsAccessKeyId:GrabMaps統合に必要。GrabMaps API認証用のAWSアクセスキー。
- awsSecretAccessKey:GrabMaps統合に必要。GrabMaps API認証用のAWSシークレットキー。
- awsRegion:GrabMaps統合に必要。GrabMaps APIのAWSリージョン(例:マレーシアリージョンの場合は 'ap-southeast-5'、シンガポールリージョンの場合はap-southeast-1)。
Google MapsまたはGrabMapsのAPIキーが提供されない場合、GTFS交通ツールは自動的にNominatim(OpenStreetMap)APIを使用してジオコーディングを行います。これは無料で、資格情報を必要としません。
これらの構成オプションは、2つの方法で設定できます。
- Smitheryの構成インターフェイスを通じて:MCPサーバーに接続するとき
- 環境変数として:ローカル開発用(GOOGLE_MAPS_API_KEY、GRAB_MAPS_API_KEY)
環境変数の設定
ローカル開発用:
このプロジェクトは、開発中に .env ファイルから環境変数を読み込むために dotenv を使用しています。
- ルートディレクトリに
.env ファイルを作成し、以下の内容を記述します。
GOOGLE_MAPS_API_KEY=your_google_api_key_here
GRAB_MAPS_API_KEY=your_grab_api_key_here
AWS_ACCESS_KEY_ID=your_aws_access_key_for_grabmaps
AWS_SECRET_ACCESS_KEY=your_aws_secret_key_for_grabmaps
AWS_REGION=ap-southeast-5 # Malaysia region or ap-southeast-1 # Singapore region
npm run dev を使用してサーバーをローカルで実行すると、変数は自動的に読み込まれます。
Smitheryデプロイ用:
Smitheryを通じてMCPサーバーに接続するとき:
- 「Connect Malaysia Open Data MCP Server」をクリックします。
- 次の構成オプションが表示されます。
googleMapsApiKey - Google Maps APIキー
grabMapsApiKey - GrabMaps APIキー
awsAccessKeyId - GrabMaps用のAWSアクセスキー
awsSecretAccessKey - GrabMaps用のAWSシークレットキー
awsRegion - GrabMapsのAWSリージョン(例:マレーシアリージョンの場合はap-southeast-5、シンガポールリージョンの場合はap-southeast-1)
- これらのフィールドにAPIキーとAWS資格情報を入力します。
- 「Get Link」をクリックして接続URLを生成します。
接続時にAPIキーはサーバーに安全に渡されます。
注意:マレーシアの場所については、GrabMapsが最も正確なジオコーディング結果を提供し、次いでGoogle Mapsです。どちらもAPIキーが必要です。APIキーを提供しない場合、システムは自動的にNominatim APIを使用します。これは無料ですが、マレーシアの一部の場所では結果が正確でない場合があります。
重要:これらのジオコーディング資格情報は、以下のGTFS交通ツールでのみ必要です。
get_transit_routes - 場所名を座標に変換する場合
get_transit_stops - 場所名を座標に変換する場合
parse_gtfs_static - 停留所の場所のジオコーディングが必要な場合
GTFS Realtimeツールについての注意:parse_gtfs_realtime ツールは現在開発中で、利用可能な範囲が限られています。このMCPを通じたリアルタイムデータアクセスは実験的なもので、すべての事業者や路線で利用可能とは限りません。最新の列車やバスの時刻表、バスの位置、リアルタイムの到着情報については、Google Maps、MyRapid PULSE、Moovit、またはLugoなどの公式の交通アプリを使用してください。
データカタログアクセス、ダッシュボード検索、天気予報、DOSMデータなどの他のすべてのツールでは、ジオコーディング資格情報は必要ありません。
📄 ライセンス
MIT - 詳細については LICENSE ファイルを参照してください。
🙏 謝辞