Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
MCP Appsでつくるチャット駆動な地図アプリ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Shinsuke Nakamori
September 09, 2026
Programming
82
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MCP Appsでつくるチャット駆動な地図アプリ
Shinsuke Nakamori
September 09, 2026
More Decks by Shinsuke Nakamori
See All by Shinsuke Nakamori
Serverless Watershed Extraction: Benchmarking Zarr vs COG for Large-Scale Flow Direction Data
nakamori1024
0
56
Other Decks in Programming
See All in Programming
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.3k
SREの越境 / SRE Collaboration
y0hgi
0
180
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
280
Building an Out-of-Order CPU
latte72
1
780
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
570
新卒PdEのリアル
ryu1013
1
500
What We Talk About When We Talk About XP
m_seki
2
630
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
150
Are APIs Still Relevant in the AI Era?
soyuka
0
220
Intent as Code
shoppingjaws
6
1k
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
240
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
270
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
Done Done
chrislema
186
16k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
RailsConf 2023
tenderlove
30
1.5k
GitHub's CSS Performance
jonrohan
1033
470k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
Transcript
MIERUNE JCT MCP Apps でつくる チャット駆動な地図アプリ 中森 紳介 / 株式会社MIERUNE
01 自己紹介 中森 紳介 所属・担当 株式会社 MIERUNE / エンジニアリングマネージャー 最近の関心
お芋関連の期間限定商品が出始めたので、いっぱい食べたい。 でも月見バーガーも食べたい。 好きなJCT 生麦JCT 羽田から横浜方面に向かう際、以下の2択から選べる素敵なJCT → みなとみらいの「THE・横浜」な景色を見ながら走るルート → 車好きの聖地・大黒PAに寄りつつ、ベイブリッジを渡るルート ↑ 文字で読んでも、どこなのかよく分かりませんね 本名じゃない時
では、Claudeに 見せてもらいましょう 生麦JCTあたりの地図を見せて と、Claude Desktop に話しかけるだけ
チャットの中に地図が出て、そのまま動かせる
02 モチベーション 地図 × AI で、まず思いつくかたち 地図アプリ 地図 主役 チャット
付け足し 既存ユーザー(既にGISを使っている人)は便利になる!...が 「地図アプリを導入していること」が入口になっているので、 新規ユーザー獲得には繋がりにくい
02 モチベーション チャットから地図を呼び出す チャット 主役 生麦JCTあたりの地図を見せて 地図 LLM が必要に応じて呼び出す 〈このまま会話が続く〉
入口は、すでに普及しているチャットアプリ 地図アプリの導入は要らない※ 地図で見せるかどうかは、人間が思いつかなく ても LLM 側で判断できる GISを使っていない人が、地図での可視化を体験するきっかけを作れるのでは ※ とはいえ MCPサーバーを繋ぐ手間は残るので、導入の手間がゼロでは無いのが現状
03 チャットに埋め込むアプリ MCP Apps AIチャットの会話内に、操作可能な地図やグラフ、フォームなどの インタラクティブなUIを直接埋め込むことができる仕組み 送信 地図 グラフ フォーム
03 チャットに埋め込むアプリ 好きなテンプレートで作れる 基本テンプレート 以下のフレームワークが用意されている vanillajs preact solid react vue
svelte 実例のカタログ(20件ほど) pdf PDF.js のビューア。arxiv などの URL も開ける sheet-music ABC記法を楽譜として描画し、その場で再生できる system-monitor CPU・メモリを2秒ごとに取得してグラフ表示 map-serverというCesiumJSを使ったテンプレートも用意されているが、 今回は使い慣れている svelte-maplibre-gl を使いたかったので、Svelte のテンプレートを使用した github.com/modelcontextprotocol/ext-apps
04 仕組み MCP Apps は3つの環境で動いている ① ホスト環境(Claude Desktop) Claude(LLM) ホスト(AppBridge)
MCPプロトコル ② MCPサーバー環境 リソース取得 UIリソース (mcp-app.html) postMessage ツール (show-map) ③ サンドボックス iframe UI (MapLibre が地図を描画) チャット欄に表示される部分
04 仕組み HTML はどうやって iframe に届くのか ① ホスト環境(Claude Desktop) Claude(LLM)
ホスト(AppBridge) MCPプロトコル ② MCPサーバー環境 リソース取得 UIリソース (mcp-app.html) postMessage iframe と外の世界をつなぐ、唯一の橋 ツール (show-map) ③ サンドボックス iframe UI (MapLibre が地図を描画) チャット欄に表示される部分
04 仕組み 補足 UI を出しているのは LLM ではない Claude(LLM) tools/call を発行して
データを受け取るだけ 「UI を表示しよう」とは 判断していない ホスト ツール定義の ui:// の紐づきを見て UI を取得・表示する 決定的なプログラムの処理であって LLM の判断ではない URI がズレると、データは正常に返るのに UI だけが描画されない
04 仕組み 補足 ツール実行から地図表示までの流れ Claude(LLM) — 接続時 — — 実行時
— ホスト(AppBridge) サンドボックス iframe tools/list ツール定義:show-map には ui://map が紐づく tools/call show-map サーバーへ転送 結果 = データのみ(center/zoom の JSON) 結果を Claude へ転送(中身はホストも保持) ホストの定型処理:ツール定義に ui://map が紐づいているかを機械的にチェック → あれば UI 表示フローを起動(LLM の判断・指示ではない) resources/read ui://map(紐づいた URI を読む) HTML 文字列(mcp-app.html) HTML を流し込み iframe 生成 postMessage(保持していた入力+結果データ) ここで初めて MapLibre が地図を描画 MCPサーバー
04 仕組み 地図タイルは外部から取ってくる ① ホスト環境(Claude Desktop) Claude(LLM) ホスト(AppBridge) MCPプロトコル ②
MCPサーバー環境 リソース取得 UIリソース (mcp-app.html) postMessage ツール (show-map) ③ サンドボックス iframe UI (MapLibre が地図を描画) チャット欄に表示される部分 fetch 外部リソース (地図タイル等)
04 仕組み サンドボックス iframe は外と繋がっていない ① ホスト環境(Claude Desktop) Claude(LLM) ホスト(AppBridge)
MCPプロトコル ② MCPサーバー環境 リソース取得 UIリソース (mcp-app.html) postMessage ツール (show-map) ③ サンドボックス iframe UI (MapLibre が地図を描画) チャット欄に表示される部分 宣言していないオリジンへの通信は、デフォルトで全部遮断される fetch 外部リソース (地図タイル等)
04 仕組み 通信したいオリジンは自分で宣言する _meta: { ui: { csp: { connectDomains:
[ "https://<tile-origin>", "blob:", ], resourceDomains: [ "https://<tile-origin>", "blob:", "data:", ], }, }, } 実装は合っているのに、背景地図が出ない 宣言したオリジンだけを許可するホワイトリスト方式 背景地図も外部から取得するので、宣言しないと取得できない
04 仕組み 地図の操作をフィードバックするには ① ホスト環境(Claude Desktop) ② MCPサーバー環境 ツール (show-map)
Claude(LLM) コンテキストに反映 ホスト(AppBridge) リソース取得 updateModelContext UIリソース (mcp-app.html) ③ サンドボックス iframe UI (MapLibre が地図を描画) チャット欄に表示される部分 fetch 外部リソース (地図タイル等) 地図操作をトリガーにコンテキストを更新して、LLMにフィードバックする
05 まとめ まとめ 1 チャットの中に任意の UI を出せる MCP Apps で、会話に埋め込む地図やフォームを構築できる
2 UI が動くのはサンドボックス環境 外の世界からは切り離された環境に置かれている 3 外との出入りは、自分で設定する タイル等の外部通信はホワイトリストで定義、 LLM へのフィードバックはイベントトリガーでコンテキスト更新