MCP Appsとは?ui://・sandbox iframe・postMessageの安全設計
MCP AppsのUI resource、ui://、sandbox iframe、postMessage、CSP、permissions、host consent、client supportを、通常のMCP toolやWebアプリとの違いから整理します。
公開 2026.08.09 / 更新 2026.08.09
この記事のポイント
- MCP Appsは、tool descriptionのUI metadataとui:// resourceを使い、hostがconversation内へinteractive UIを表示するextension
- UIはsandboxed iframeで動き、親ページのDOM・cookie・local storageへ直接触れず、hostとの通信はpostMessage経由になる
- CSP、permissions、tool call、open link、model context更新は別々のcapabilityとしてhostのconsent・監査と組み合わせる
- client supportは一律ではないため、公式support matrixと接続先の実装状況を確認し、未対応時のtext fallbackを用意する
結論:MCP Appsはtoolの結果を、会話内のinteractive UIへ広げるextension
MCP Appsは、MCP serverのtoolがtextやstructured dataだけでなく、dashboard、form、chart、media viewer、multi-step workflowのようなUIをhostへ渡せるようにするextensionです。tool descriptionにUI resourceへの参照を置き、hostがそのHTMLをconversation内でsandboxed iframeへ表示します。ユーザーは別のWebページへ移らず、UIを操作し、その結果をhostやmodelへ返せます。
ただし、MCP Appsは通常のWebアプリを置き換えるものではありません。会話の文脈、hostの既存tool、ユーザーconsent、sandbox、監査が必要な体験に向きます。公開ページ、複雑な認証、独立したSEO、長い設定画面が中心なら、通常のWebアプリと役割を分けた方が保守しやすい場合があります。
| 観点 | 通常のMCP tool | MCP Apps | 通常のWebアプリ |
|---|---|---|---|
| 表示 | text、image、structured data | 会話内のinteractive HTML UI | 独立ページやアプリ画面 |
| 状態 | 次のpromptやtool callで渡す | UIとhostの双方向通信で扱う | アプリ側のstate管理で扱う |
| 権限 | MCP clientのtool consentに依存 | UI action、tool call、capabilityごとにhostが制御 | アプリの認証・API・browser権限を個別に設計 |
| 安全境界 | clientとserverのprotocol境界 | sandbox iframe、postMessage、CSP、permissionsを追加 | browser、server、外部サービスの境界 |
| 向く例 | 検索、取得、短い更新 | 可視化、入力フォーム、承認、rich media | 公開サイト、複雑な業務画面、独立したユーザー管理 |
MCP Appsの基本フロー:tool・resource・host・UI
- tool descriptionが、interactive UIへ対応するUI metadataとui:// resourceの参照を宣言する
- hostはtoolが呼ばれる前にUI resourceをpreloadできる。入力をUIへ先に流す設計もある
- modelがtoolを呼ぶと、serverが通常のdataとUIで必要な情報を返す
- hostはresourceのHTMLを取得し、sandboxed iframeへ隔離して表示する
- UIとhostはpostMessageを使うJSON-RPCベースの通信で、tool call、結果、context更新などをやり取りする
- hostはCSP、permissions、tool allowlist、user consent、open linkなどを環境のポリシーで制御する
{
"name": "visualize_data",
"description": "Interactive data visualization",
"_meta": {
"ui": {
"resourceUri": "ui://charts/interactive"
}
}
}ここでのui://は、ユーザーのbrowserが自由に開く通常の公開URLではありません。MCP hostがserverからresourceを取得し、MCP AppsのUIプロトコルと自分の安全ポリシーに従って表示します。resourceUriがあるから自動的に安全、または全hostで同じように表示される、という意味ではありません。
sandbox iframeの安全境界:できることと、できないことを分ける
公式overviewでは、MCP AppsのUIはsandboxed iframeで動き、親ページのDOM、cookie、local storage、親ページのnavigation、親contextのscriptへ直接触れない設計として説明されています。UIとhostの間はpostMessageの通信路になり、hostが利用可能なcapabilityを制御します。
| 境界 | 期待する制約 | 確認すること |
|---|---|---|
| 親ページ | UIからhostのDOMやcookieへ直接アクセスしない | iframeのsandbox設定とhost実装を確認する |
| 通信 | UIからhostへの要求はpostMessage経由 | messageのschema、origin、source、許可methodを検証する |
| tool call | UIが直接すべてのtoolを自由に呼ぶわけではない | hostのtool allowlist、consent、認可scopeを確認する |
| 外部resource | CSPで許可したoriginだけを読み込む | script、image、font、connect先を最小限にする |
| browser capability | microphoneやcameraなどはpermission要求が必要になり得る | 利用理由、hostの承認、拒否時のfallbackを用意する |
| リンク | UIから外部ページへ移る操作をhostが仲介する | open linkの確認と、誘導先の信頼性を確認する |
postMessageとUI dialect:文字列を投げるだけではない
MCP AppsのUIとhostは、core MCPのstdioやHTTPをそのまま共有するのではなく、postMessageを使ったJSON-RPCベースのUI向け通信を持ちます。tool callのproxy、ui/initialize、tool result、model context更新など、共通する概念とUI専用のmethodが混在します。通信できることだけを確認せず、どの方向のmessageが何を起こすかを表にします。
| 操作 | 起点 | 承認・監査の観点 |
|---|---|---|
| tool call | UIまたはmodel | 対象tool、引数、scope、外部side effectを確認する |
| tool result | host | 表示内容と信頼できる事実を分け、HTMLへ無条件に挿入しない |
| model context update | UI | modelへ渡す内容、個人情報、指示文の混入を監査する |
| open link | UI | リンク先とユーザー意図を確認し、誘導だけで承認しない |
| permission request | UI/host | microphone、cameraなど必要な権限だけを要求する |
CSP・permissions・consentを別々に設計する
MCP Appsでは、UIをiframeへ入れた後も、外部scriptやresourceをどこから読むか、browser capabilityを何に使うか、UIからtoolを呼べるかを別々に制御します。CSPは読み込み先を制限する仕組み、permissionsはbrowserやhost capabilityへの要求、consentはユーザーが意味を理解して許可する境界です。一つを設定しただけで他の二つが自動的に安全になるわけではありません。
| 設計項目 | 最小にする値 | 失敗時の方針 |
|---|---|---|
| resource domains | UIに必要なoriginだけ | 読み込めない場合はtext表示へ戻す |
| connect先 | APIやMCP hostの必要な宛先だけ | 未知の宛先へ送らずエラー表示で止める |
| permissions | ユーザー体験に不可欠なものだけ | 拒否時もtoolの読み取りや説明を継続できるようにする |
| tool allowlist | UIの用途に必要なread-only toolから開始 | write、delete、deployは追加承認とreviewを要求する |
| context update | 必要な選択結果だけ | 秘密、token、未検証HTML、外部指示をmodelへ渡さない |
MCP Appsが向く4つのUI体験
- 複雑なdata exploration:filter、drill down、sort、chartを会話の横で操作する
- 設定wizard:多くの選択肢と依存関係を一つのformで確認してからtoolを呼ぶ
- rich media:PDF、画像、3D、音声などをtext要約だけでなくviewerで確認する
- multi-step workflow:review、approval、triageを一覧とactionで進め、選択をmodelへ返す
リアルタイム監視や長いjobの表示では、MCP AppsのUIとMCP Tasksを組み合わせる設計も考えられます。ただし、UI表示とtaskの状態更新は別の機能です。TasksのtaskId、認可、取消、TTLをUIの見た目へ隠さず、再読み込み・切断・host未対応時の状態も説明できるようにします。
client support:公式extensionでも対応は一律ではない
MCP Appsはofficial extensionですが、hostがどのUI method、sandbox、resource、tool proxy、permissionを実装しているかはclientごとに変わります。公式のExtension Support Matrixは対応確認の入口ですが、community-maintainedの表でもあるため、更新日、hostのversion、接続先の実装差を自分の環境で確認します。MCP Appsが使えない場合に、同じtoolがtextやstructured dataで読めるfallbackを残しておくと、対応差でworkflow全体が止まりません。
| 確認層 | 質問 | 記録するもの |
|---|---|---|
| host | MCP Apps自体を表示できるか | host名、version、extension support |
| resource | ui:// resourceを取得・preloadできるか | resource、cache、更新タイミング |
| sandbox | iframeとpostMessageを実装しているか | sandbox、CSP、permissionの制約 |
| tool | UIから必要なtoolをproxyできるか | allowlist、consent、scope、audit |
| fallback | 未対応時に何が表示されるか | text、structured data、manual linkの代替導線 |
MCP Appsの脅威モデル:UIの見た目に権限を与えない
| リスク | 起こり得ること | 先に置く境界 |
|---|---|---|
| 偽の承認画面 | UIが安全そうに見せ、write toolや外部送信を促す | 操作対象、引数、変更内容をhostの確認画面で再表示する |
| 外部script・resource | CSPで想定しないoriginを読み、内容が変わる | 必要なorigin、hash、更新レビュー、外部依存を最小にする |
| message confusion | 別のmessageや古いstateを新しい操作として処理する | message schema、source、origin、request id、stateを検証する |
| context injection | UIがmodelへ未検証の指示や秘密を返す | context updateのallowlistと監査を設ける |
| tool overreach | UI用途以上のtoolやscopeへアクセスできる | read-only、tool allowlist、最小scope、段階的な承認 |
| host差分 | あるclientでは動くが別hostで壊れる | support matrix、version、text fallback、実機確認 |
SDKやframeworkは手段で、security boundaryではない
公式のMCP Apps documentationには、UI側のApp classやhost向けApp Bridge、ReactやVueなどの例があります。SDKは通信や表示の実装を楽にしますが、どのtoolを呼べるか、どのoriginを読むか、どの情報をmodelへ返すかを自動で正しく決めるものではありません。frameworkの選択、CSP、permissions、consent、監査は別レイヤーでレビューします。
導入前の最小チェックリスト
- MCP Appsでなければ解けないUI上の課題を一文で説明できる
- tool metadata、ui:// resource、host fetch、sandbox iframe、postMessageの流れを図にできる
- CSPのscript・style・image・connect先を必要なoriginだけに絞った
- permissions、tool call、open link、model context updateを別々のcapabilityとして確認した
- UI未対応hostでもtextやstructured dataで結果を読めるfallbackを作った
- UIからwrite、delete、deployを呼ぶ場合、対象・差分・scope・承認者を再表示する
- messageのschema、origin、source、request id、古いstateを検証する
- serverの出所、更新、外部送信、tool権限をUI表示とは別にレビューした
- cookie、token、秘密、個人情報をUIやmodel contextへ不要に渡さない
MCP AppsのFAQ
MCP Appsは通常のMCP toolと何が違いますか?
通常のtoolがtextやstructured dataを返すのに対し、MCP Appsはtool descriptionからui:// resourceを参照し、hostがconversation内のinteractive UIとして表示します。tool callや権限の設計は別に必要です。
ui://をbrowserで開けばMCP Appsを確認できますか?
ui://はMCP hostがresourceを取得して表示するための参照です。通常の公開URLと同じように開くものではなく、hostのresource取得、sandbox、UI protocolの対応が必要です。
sandbox iframeなら安全ですか?
親ページのDOMやcookieへ直接触れない重要な隔離になりますが、server、tool、UIの誘導、外部resource、hostのpermission設定まで安全になるわけではありません。出所、tool allowlist、CSP、consent、監査を別に確認します。
MCP Appsが使えるclientは決まっていますか?
一律ではありません。official extensionでもhostごとの対応差があり、公式support matrixと自分のhost・version・接続先で確認します。未対応時のtextやstructured dataのfallbackを残してください。
UIからMCP toolを自由に呼べますか?
自由に呼べるとは限りません。hostがproxyするtool、consent、認可scope、server側のallowlistを確認し、read-onlyから開始します。UIのボタンを押したことだけを強い権限の承認とみなさないでください。
MCP Appsと通常のWebアプリはどちらを使うべきですか?
会話の文脈、hostの既存capability、MCP toolとの双方向操作が中心ならMCP Appsが候補です。公開ページ、独立した認証、SEO、複雑な業務画面が中心なら通常のWebアプリの方が合う場合があります。
まとめ:MCP AppsはUIの追加ではなく、hostとの信頼境界の追加
MCP Appsは、toolとui:// resourceをhostのsandbox iframeへつなぎ、postMessageでUIと会話を双方向にするofficial extensionです。導入では、resourceの取得、sandbox、CSP、permissions、tool allowlist、consent、context update、client support、text fallbackを分けて確認します。見た目がリッチになるほど、UIの誘導を権限と混同せず、read-only・最小scope・監査可能な操作から段階的に広げてください。
関連記事
- MCPとは?AIエージェントに外部ツールをつなぐ仕組みと注意点
MCPはAIに外部ツールをつなぐ共通プロトコルです。仕様とCodexの設定・認証・tool権限を分けて、安全な導入判断を整理します。