plateau-creative-mcp について
plateau-creative-mcp は PLATEAU の 3D 都市データを、クリエイティブ向け LLM エージェントが使えるシーン編集・glTF 出力ツールに変換する MCP サーバーです。公式 PLATEAU MCP がデータ参照を担うのに対し、シーン作成と DCC への書き出しを担当します。
主な機能
- 01都市エリアを scene_id 付きのシーンとして読み込み
- 02高さ、建築年、用途などによる建物の絞り込み
- 03建物の削除と高さの倍率変更
- 04単一 GLB または scene_manifest の書き出し
- 05PLATEAU のクレジットとライセンスファイルの付与
- 06公式 PLATEAU MCP および Blender MCP との任意の連携
活用シーン
- 01地区から高層ビルを除いた GLB の書き出し
- 02三次元都市モデルの Blender・Unity・Unreal への受け渡し
- 03ツール呼び出しによる都市レイアウトの代替案作成
MCP 対応
本プロジェクトは MCP サーバーであり、シーンの読み込み・編集・書き出しツールを MCP クライアントに公開します。上流機能を有効にすると、公式 PLATEAU MCP のツールも中継します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
@yodolabs/plateau-creative-mcp
Project PLATEAU の 3D 都市データを、クリエイティブな LLM エージェント向けのシーン編集および glTF エクスポートツールに変換する MCP サーバーです。
英語 · 日本語
PLATEAU から読み込み、編集し、export_glb ツールで 1 つの .glb としてエクスポートした、実際の渋谷の街区です。ここでは three.js でレンダリングしています。LLM が Blender / Unity / Unreal に渡すものと同じジオメトリです。データ © Project PLATEAU / MLIT(CC BY 4.0)。
このサーバーはツールを提供します。オーケストレーションは LLM の役割です。このサーバーと Blender MCP / Unity MCP / Unreal MCP をあわせて Claude / Cursor / 任意の MCP クライアントに接続し、ワークフローを組み立てさせてください。
PLATEAU には、データアクセス(カタログ、仕様、CityGML、属性)向けの公式 MCP サーバーがあります。このサーバーは、欠けている作成、シーン編集、DCC エクスポートのレイヤーを補います。東京の近隣地域を読み込み、すべての高層ビルを削除したり、街区の高さを 3 倍に拡大したりして、Blender / Unity / Unreal ですぐに使える .glb を出力できます。すべてツール呼び出しで操作します。
flowchart LR
CLIENT["Claude / Cursor<br/>(any MCP client)"] -->|tool calls| MCP["plateau-creative-mcp"]
MCP -->|download_area| DATA["plateau-bridge<br/>artifact index + bundles"]
MCP -->|"load → filter → edit"| SCENE["scene_id<br/>(in-memory)"]
MCP -->|export_glb| OUT[".glb + LICENSE.txt"]
OUT --> DCC["Blender / Unity / Unreal"]
ステータス
v0.1.0 — 初の一般公開リリースです。 10 個の MCP ツール(オンデマンドのアーティファクトダウンロードを含むため、データのクローンは不要)、メッシュ結合に対応したポリゴンフットプリントの押し出し、1 km² 以下の単一 GLB エクスポート(gltf-transform による約 40%の圧縮)と、より広い範囲向けの scene_manifest 3D Tiles フォールバック、3 つのデータアクセスモード(TS+duckdb アーティファクト / Python サブプロセス / JSON-RPC 経由の上流 MCP)、Overpass POI リンク、BlenderMCP との任意のクロス MCP ブリッジを備えています。MCP 上でベンダーに依存せず、Claude、Cursor、あらゆるクライアントで利用できます。
ツール
| ツール | 目的 |
|---|---|
download_area | plateau-bridge アーティファクトインデックスからビルド済みの都市バンドルを取得してキャッシュします(スラッグを解決し、.tar.zst をダウンロードして sha256 を検証し、buildings.parquet と manifest.json を展開します)。これにより、データパイプラインをクローンせずに load_area を使用できます。 |
load_area | 都市、bbox、LOD を新しい scene_id に読み込みます。 |
filter_buildings | シーン内の building_uid[] を高さ、建築年、用途、用途地域、浸水深で検索します。 |
delete_buildings | 反実仮想編集を行い、建物を削除済みとしてマークします。 |
extrude_buildings | 高さに係数を掛けて拡大します。 |
compose_scene | レンダリングのヒント(時刻、天候、カメラ)を設定します。 |
export_glb | .glb(single_glb。parquet から実際のジオメトリを使用)または 3D Tiles を参照する scene_manifest を出力します。scene_manifest のタイル情報の拡充には、ローカルでビルドした 3D Tiles が必要です。ダウンロードした都市では、タイルを含まないマニフェスト(編集内容、bbox、帰属情報)と tileset_note が出力されます。 |
link_buildings_to_pois | 建物を近隣の OSM POI に関連付けます(Overpass)。 |
get_attribution | シーンのデータセット、ライセンス、URL に関するメタデータをすべて取得します。 |
render_via_blender | シーンを GLB としてエクスポートし、(任意で)JSON-RPC を介して BlenderMCP 互換の HTTP MCP サーバーに橋渡しします。ドライランでは、代わりに推奨される MCP 間の呼び出し手順を返します。 |
PLATEAU_UPSTREAM_ENABLED=true の場合、サーバーは公式 Project PLATEAU MCP サーバーからプロキシされた 13 個のツールも公開します:plateau_spec_outline、plateau_spec_read、plateau_get_metadata、plateau_search_areas、plateau_get_area、plateau_search_datasets、plateau_get_dataset、plateau_list_dataset_types、plateau_citygml_get_attributes、plateau_citygml_get_features、plateau_citygml_get_geoid_height、plateau_get_citygml_files、plateau_explain_spatial_id。LLM クライアントには、2 つの MCP サーバーを別々に接続する必要なく、単一のカタログ内に 23 個のツールが表示されます。
各ツールは { result, attribution_metadata } を返します。export_glb は GLB の asset.extras.attribution と、その隣にある LICENSE.txt に帰属情報を書き込みます。派生した動画、画像、アセットにも、この帰属情報を必ず保持してください。
クイックスタート
npm install
npm run build
都市データを用意する方法は 2 つあります。
オプション A — セットアップ不要(推奨)
データパイプラインをクローンする必要はありません。サーバーは初期設定のまま、公開されている plateau-bridge アーティファクトインデックスを読み込むため、設定なしで download_area を使用できます。都市のビルド済みバンドルを取得し、sha256 を検証して、ローカルにキャッシュします。
export PLATEAU_AUTO_DOWNLOAD=true # load_area auto-fetches a missing city (optional)
export PLATEAU_OUTPUT_DIR=./out
npx @yodolabs/plateau-creative-mcp # stdio MCP server
download_area(city="shibuya") を 1 回呼び出してください(または PLATEAU_AUTO_DOWNLOAD=true を設定して load_area を呼び出すと、不足している都市が最初に取得されます)。展開されるのは buildings.parquet と manifest.json のみです。バンドルは PLATEAU_ARTIFACT_DIR(デフォルトは ~/.cache/plateau-creative-mcp/artifacts)にキャッシュされるため、各都市のダウンロードは 1 回だけです。独自のミラーを使用するには、PLATEAU_ARTIFACT_INDEX_URL に別のインデックスを指定してください。
ダウンロードしたバンドルには 3D Tiles は含まれません(都市ごとに数 GB になるためです)。parquet を使って、load_area、すべての編集、export_glb の single_glb(実際のジオメトリ、≤ 1 km² / ≤ 5000 棟)を利用できます。ダウンロードした都市でタイル参照が失われるのは scene_manifest エクスポートのみです(編集リスト、bbox、帰属情報は引き続き出力され、tileset_note に範囲を single_glb に絞るか、ローカルでビルドするよう記載されます)。より広い範囲を完全なジオメトリでエクスポートするには、ローカルビルドを使うオプション B を利用してください。
Claude Desktop の場合は、claude_desktop_config.json に追加してください。
{
"mcpServers": {
"plateau-creative": {
"command": "npx",
"args": ["-y", "@yodolabs/plateau-creative-mcp"],
"env": {
"PLATEAU_AUTO_DOWNLOAD": "true",
"PLATEAU_OUTPUT_DIR": "/Users/you/plateau-out"
}
}
}
}
オプション B — 独自のアーティファクトを使用
plateau-bridge の out_<city>/ 出力をすでにお持ちの場合は、その場所を直接指定してください。
export PLATEAU_ARTIFACT_DIR=/path/to/plateau-bridge
export PLATEAU_OUTPUT_DIR=./out
npx @yodolabs/plateau-creative-mcp # stdio MCP server
{
"mcpServers": {
"plateau-creative": {
"command": "npx",
"args": ["-y", "@yodolabs/plateau-creative-mcp"],
"env": {
"PLATEAU_ARTIFACT_DIR": "/path/to/plateau-bridge",
"PLATEAU_OUTPUT_DIR": "/Users/you/plateau-out"
}
}
}
}
MCP クライアントを使わずにスモークテストを実行します。
npx tsx scripts/smoke-load-area.ts
ワークフロー例
1. サイバーパンクな渋谷のフライスルー(MCP 間連携)
load_area(city="shibuya", bbox=[139.6975,35.6555,139.7045,35.6605], lod=2)
-> compose_scene(time="19:30", weather="rain")
-> export_glb() # to ./out/<scene>_v3.glb
=> BlenderMCP: import_glb + cyberpunk shader + render
flowchart LR
LLM(("LLM")) --> A["plateau-creative-mcp<br/>load · edit · export_glb"]
LLM --> B["Blender MCP<br/>import · shade · render"]
A -->|".glb + sidecar"| B
2. 超高層ビルのない東京
load_area(...)
-> filter_buildings({height_min: 100})
-> delete_buildings(filter={height_min: 100})
-> export_glb()
3. オフィスタワーのドラフト(成果物にゾーニングフィールドが必要です)
load_area(...)
-> filter_buildings({zoning_use: ["commercial"], far_max_min: 400})
=> SketchUp MCP: design a new building inside those parcels
アーキテクチャ
src/
server/ MCP protocol entry, tool registry, unified envelope
tools/ 10 MCP tool handlers
schemas/ Zod schemas + JSON Schema export
scene/ scene_id LRU + lock + optional disk persistence
data/ Artifact (duckdb) access layer + on-demand bundle downloader
export/ three.js scene builder + GLTFExporter + manifest fallback
attribution/ Envelope wrapping, attribution merge
rateLimit/ Token bucket per (client, tool)
errors/ Stable error codes + AppError
config/ Env-driven config
utils/ ids, bbox, paths, logger
scene_idは唯一共有される状態です。すべての変更/エクスポートツールでこれを参照する必要があります。ID はサーバーが ULID を生成します。building_uidは唯一の正規参照です。gml_idやバッチインデックスによる代替参照はありません。export_glbの厳格な上限:single_glbでは bbox が 1 km² 以下、かつ建物数が 5000 以下です。これを超えるシーンではEXPORT_LIMIT_EXCEEDEDが返され、scene_manifestへの切り替えが提案されます。- アトリビューションはエグゼキューターのレベルで付与されるため、アトリビューションなしで結果を返すハンドラーはありません。
設定
| Env | デフォルト | 意味 |
|---|---|---|
PLATEAU_ARTIFACT_DIR | ~/.cache/plateau-creative-mcp/artifacts | out_<city>/buildings.parquet を含むディレクトリです。デフォルトではキャッシュディレクトリ(download_area の書き込み先)を使用します。既存の plateau-bridge チェックアウトを指定するには、この値を設定してください。 |
PLATEAU_ARTIFACT_INDEX_URL | plateau-bridge distribution/index.json | 各都市のバンドル URL と sha256 を記載したキャッシュインデックス(JSON)です。デフォルトでは公開ミラーを使用します。独自のインデックスを使う場合は上書きしてください。 |
PLATEAU_ARTIFACT_DOWNLOAD_TIMEOUT_MS | 300000 | ダウンロードごとのタイムアウト(ミリ秒、5 秒~30 分)です。 |
PLATEAU_AUTO_DOWNLOAD | false | true にすると、読み込み前に load_area がインデックスから不足している都市を自動取得します。 |
PLATEAU_OUTPUT_DIR | ./out | .glb/LICENSE.txt/マニフェストの書き込み先です。 |
PLATEAU_DATA_MODE | artifact | artifact(TS + duckdb)または subprocess(Python ヘルパー)です。 |
PLATEAU_PYTHON_BIN | python3 | subprocess モードで使用する Python インタープリターです(duckdb がインストールされている必要があります)。 |
PLATEAU_SUBPROCESS_SCRIPT | バンドルされた python/plateau_query.py | JSON-stdio ヘルパーのパスを上書きします。 |
PLATEAU_SCENE_DIR | ./.scene-store | シーンの永続化が有効な場合に使用するディスク上のディレクトリです。 |
PLATEAU_PERSIST_SCENES | false | true にすると、呼び出し間でシーンをディスクにシリアライズします。 |
PLATEAU_MAX_SCENES | 64 | メモリ内シーンの LRU 上限です。 |
PLATEAU_SCENE_TTL_MS | 3600000 | シーンの TTL(ミリ秒)です。 |
OSM_OVERPASS_URL | 未設定 | link_buildings_to_pois を有効にするには設定してください(例:https://overpass-api.de/api/interpreter)。 |
OSM_OVERPASS_TIMEOUT_MS | 25000 | Overpass リクエストのタイムアウトです。 |
PLATEAU_UPSTREAM_ENABLED | false | true にすると、ホストされた PLATEAU MCP にプロキシする公式の plateau_* ツールを 13 個登録します。 |
OFFICIAL_PLATEAU_MCP_URL | ホスト版のデフォルト | 公式 PLATEAU MCP エンドポイントを上書きします(まれなケース)。 |
コピーして使えるテンプレートは .env.example を参照してください。
フットプリント形状とボックスによるフォールバック
DuckDB の spatial 拡張機能を使ったポリゴンの押し出しはデフォルトで有効です。初回実行時に拡張機能が自動インストールされます。インストールまたは読み込みに失敗した場合(オフラインの CI、制限された環境など)、エクスポーターは各建物を重心に配置した 12 m × 12 m のボックスに適切にフォールバックします。高精度な経路が有効な場合、load_area のレスポンス内の available_attributes に footprint_polygon が含まれます。
メッシュのマージとサイドカーインデックス
single_glb エクスポートでは、すべての建物を 1 つの BufferGeometry にマージします。これにより、描画コールが 1 回になり、GLB の JSON オーバーヘッドが大幅に削減されます。後続の編集ツールで建物ごとの識別情報を保持できるよう、各エクスポートでは GLB の隣にサイドカー <basename>.buildings.json が書き込まれます。
{
"scene_id": "scene_01...",
"version": 4,
"merged": true,
"total_triangles": 73482,
"ranges": {
"<building_uid>": [{"triangle_start": 0, "triangle_count": 18}]
}
}
scene_manifest モード
エクスポートが single-GLB の上限(1 km²/5000 棟)を超える場合は、mode: "scene_manifest" をリクエストできます。マニフェストには対応する 3D Tiles の tileset.json へのリンクが含まれ、シーンの bbox と交差する境界領域を持つリーフタイルのコンテンツ URI が列挙されます。後続のコンシューマーは必要なタイルだけを遅延読み込みできます。
{
"scene_id": "scene_01...",
"mode": "scene_manifest",
"bbox": [139.69, 35.65, 139.72, 35.67],
"tileset": "/abs/path/out_shibuya/3dtiles/tileset.json",
"tileset_available": true,
"tiles": [
{
"url": "/abs/path/out_shibuya/3dtiles/15/29096/4943_bldg_Building.glb",
"relative_uri": "15/29096/4943_bldg_Building.glb",
"bbox": [139.6984, 35.6577, 139.7060, 35.6644],
"min_height_m": 39.3,
"max_height_m": 332.3
}
],
"edits": { "deleted_building_uids": [], "extrusions": [] },
"attribution": { "license": "CC BY 4.0" }
}
3D Tiles はローカルビルドで生成され、オンデマンドダウンロードバンドルには含まれません。ダウンロードした都市の場合、scene_manifest はタイルを含まないマニフェスト(編集内容 + bbox + アトリビューション)を tileset_note とともに返します。
POI のリンク付け
link_buildings_to_pois には OSM_OVERPASS_URL が必要です。これを設定すると、ツールはシーンの bbox 内にある amenity/shop/office/tourism/leisure のノードを対象とする Overpass QL クエリを POST し、名前のある各 POI を max_distance_m 以内にある最も近い建物の重心と照合します。ODbL の帰属表示は、返されるエンベロープに自動的に統合されます。
対象外(意図的)
export_3dgs— Gaussian スプラットのラウンドトリップは今後の対応予定です。export_usd— 別の Isaac Sim プロジェクトです。simulate_earthquake/simulate_flood— 別のリスク分析の取り組みです。- 汎用的な OSM クエリ — OSM-MCP の領域です。
- MCP 間の自動オーケストレーション — これは LLM が行います。
帰属表示とライセンス
- ソフトウェア: MIT(このリポジトリ)。
- データ: PLATEAU は CC BY 4.0(© Project PLATEAU / MLIT)です。OSM POI は ODbL 1.0 です。
- すべてのツールの応答に
attribution_metadataが含まれます。export_glbはこれをasset.extras.attributionに挿入し、GLB と同じ場所にLICENSE.txtを書き出します。このファイルは GLB と一緒に保管し、派生動画やスクリーンショットでは PLATEAU のクレジットを表示してください。
GLB の圧縮
export_glb で options.compress: true を設定すると、gltf-transform のパイプライン(重複排除 → 頂点の溶接 → 不要データの削除 → 量子化)が適用されます。渋谷の 0.4 km² の実データ(建物 507 棟、三角形 138k 個)での数値は、**9.94 MB → 6.05 MB(約 40% 削減)**で、知覚できる劣化はありません。出力では標準の KHR_mesh_quantization 拡張機能を使用しており、Blender、Unity、Unreal、three.js はすべてネイティブでデコードできます。
上流 MCP サーバーとの通信
JsonRpcMcpClient は、上流との連携用の構成要素として公開される最小限の MCP over HTTP クライアント(tools/list + tools/call)です。
OfficialPlateauMcpClient は、公式 PLATEAU MCP サーバー(ホスト先は https://api.plateauview.mlit.go.jp/mcp)を操作するための型付きラッパーです。上流の 13 個のツールすべてに対応しています。
- 仕様:
specOutline、specRead - カタログ:
getMetadata、searchAreas、getArea、searchDatasets、getDataset、listDatasetTypes - CityGML:
citygmlGetAttributes、citygmlGetFeatures、citygmlGetGeoidHeight、getCityGmlFiles - ヘルパー:
explainSpatialId
import { OfficialPlateauMcpClient } from "@yodolabs/plateau-creative-mcp";
const upstream = new OfficialPlateauMcpClient();
const meta = await upstream.getMetadata();
const datasets = await upstream.searchDatasets({ area_codes: ["13113"], year: 2023 });
上流の仕様は現在も変更されているため、応答の形状には [k: string]: unknown のインデックスシグネチャを使用しています。厳密な型が必要な場合は、呼び出し箇所で検証してください。
使用例
再現可能なワークフローのレシピは examples/ にあります。Claude Desktop のプロンプト(examples/claude-prompts.md)、Cursor の .cursorrules(examples/cursor-rules.md)、統合済み GLB とサイドカーの受け渡しを示す Blender Python スニペット(examples/blender-mcp-handoff.py)、そしてサイバーパンクな渋谷の完全な解説(examples/cyberpunk-shibuya.md)を参照してください。
コントリビューション
Issue と PR を歓迎します。CONTRIBUTING.md をご覧ください。PR を作成する前に npm run lint && npm run typecheck && npm test を実行してください。
含まれるもの
独自の MCP ツール 10 個と公式 PLATEAU MCP からのプロキシツール 13 個(PLATEAU_UPSTREAM_ENABLED=true の場合、合計 23 個のツールカタログ)、オンデマンドのアーティファクトダウンロード(download_area +オプションの load_area による自動取得)でデータのクローンが不要、ポリゴンフットプリントの押し出し(DuckDB spatial)とボックスフォールバック、メッシュの統合とサイドカーの識別子インデックス、GLB 圧縮(約 40% 縮小)、3D Tiles タイル情報を追加する scene_manifest モード、Overpass による POI のリンク付け、3 つのデータアクセスモード(TS+duckdb アーティファクト/Python サブプロセス/上流 MCP over HTTP)、および許可リストで制御される BlenderMCP 互換サーバー向けの MCP 間ブリッジ。
Yodo Labs が開発 — PixelX Inc. / ピクセルエックス株式会社
plateau-bridge を基盤として構築 · データ © Project PLATEAU / MLIT(CC BY 4.0)
お問い合わせ:[email protected]
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。