Search the alley

記事を検索

2文字以上でタイトル・カテゴリ・タグを検索できます。

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 toolMCP 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 callUIが直接すべてのtoolを自由に呼ぶわけではないhostのtool allowlist、consent、認可scopeを確認する
外部resourceCSPで許可したoriginだけを読み込むscript、image、font、connect先を最小限にする
browser capabilitymicrophoneや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 callUIまたはmodel対象tool、引数、scope、外部side effectを確認する
tool resulthost表示内容と信頼できる事実を分け、HTMLへ無条件に挿入しない
model context updateUImodelへ渡す内容、個人情報、指示文の混入を監査する
open linkUIリンク先とユーザー意図を確認し、誘導だけで承認しない
permission requestUI/hostmicrophone、cameraなど必要な権限だけを要求する

CSP・permissions・consentを別々に設計する

MCP Appsでは、UIをiframeへ入れた後も、外部scriptやresourceをどこから読むか、browser capabilityを何に使うか、UIからtoolを呼べるかを別々に制御します。CSPは読み込み先を制限する仕組み、permissionsはbrowserやhost capabilityへの要求、consentはユーザーが意味を理解して許可する境界です。一つを設定しただけで他の二つが自動的に安全になるわけではありません。

設計項目最小にする値失敗時の方針
resource domainsUIに必要なoriginだけ読み込めない場合はtext表示へ戻す
connect先APIやMCP hostの必要な宛先だけ未知の宛先へ送らずエラー表示で止める
permissionsユーザー体験に不可欠なものだけ拒否時もtoolの読み取りや説明を継続できるようにする
tool allowlistUIの用途に必要な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全体が止まりません。

確認層質問記録するもの
hostMCP Apps自体を表示できるかhost名、version、extension support
resourceui:// resourceを取得・preloadできるかresource、cache、更新タイミング
sandboxiframeとpostMessageを実装しているかsandbox、CSP、permissionの制約
toolUIから必要なtoolをproxyできるかallowlist、consent、scope、audit
fallback未対応時に何が表示されるかtext、structured data、manual linkの代替導線

MCP Appsの脅威モデル:UIの見た目に権限を与えない

リスク起こり得ること先に置く境界
偽の承認画面UIが安全そうに見せ、write toolや外部送信を促す操作対象、引数、変更内容をhostの確認画面で再表示する
外部script・resourceCSPで想定しないoriginを読み、内容が変わる必要なorigin、hash、更新レビュー、外部依存を最小にする
message confusion別のmessageや古いstateを新しい操作として処理するmessage schema、source、origin、request id、stateを検証する
context injectionUIがmodelへ未検証の指示や秘密を返すcontext updateのallowlistと監査を設ける
tool overreachUI用途以上の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・監査可能な操作から段階的に広げてください。

関連記事