Claude の MCP Apps:アプリツール、エントリーポイント、埋め込みサイトのうち、ユーザーが実際に使えるのはどれか
Claude の MCP Apps に加わった 3 つの新機能には、それぞれ別の条件があります。テストに使うコネクタは、ユーザーが Community リスティングからインストールしたものより多くの条件を満たします。ドキュメントによれば、機能が使えないときにユーザーにはメッセージが表示されません。
目次
11 月 10 日、Anthropic は Claude が MCP Apps 拡張の機能をより多くサポートするようになったと発表しました。アプリを会話の横や全画面で開けるようになり、アプリの画面の中にあるツールを Claude が呼び出せるようになり、アプリに提供元自身のウェブサイトを埋め込めるようになりました。発表時の例には Adobe、Atlassian、Box が挙がっています。開発者向けには、新機能はパブリックプレビューとされています。拡張の安定版仕様は 2026-01-26 のままです。変わったのは、Claude がそのうちどこまでを実装しているかです。
MCP Apps をまだ知らない方向けに説明すると、MCP サーバーのツールが ui:// リソースを指し、ホストがその HTML をテキストの結果の横に表示します。ウェブ版ではサンドボックス化された iframe の中です。基本は Claude のプラグインディレクトリの解説で書きました。この記事で扱うのは、条件付きの 3 つの新機能と、スタートガイドのページにある見落としやすい一文です。
3 つともリモートサーバーが必要です。エントリーポイントと埋め込みサイトは、コネクタがディレクトリにどう掲載されているかにも左右されます。さらにアプリツールとエントリーポイント(カスタムコネクタの埋め込みサイトも)は、今のところ一部の組織に限られています。URL で追加したテスト用のコネクタは、ユーザーが Community リスティングからインストールしたものより多くの条件を満たします。そして、この差を埋める Verified ラベルの申請手続きはありません。なので、まず Community からのインストールを前提に設計し、新機能はどれもアプリが実行時に検出するアップグレードとして扱うのがよいと考えます。
以下の内容は、11 月 11 日に読んだ Anthropic のドキュメントと、ローカルで実行したコマンドに基づいています。MCP App を Claude で自分で動かしたことはまだありません。
11 月 10 日、Claude の MCP Apps に何が追加されたのか
スタートガイドのページには 6 つの機能が挙がっています。サイドパネルと全画面、Artifacts ページからのエントリーポイント、アプリツール、アプリから Claude へのメッセージ、埋め込みウェブサイト、ダウンロードです。この記事ではそのうち 3 つを扱います。
アプリツールを使うと、ビュー(アプリを 1 回表示したもの)がツールを登録でき、Claude はそれを呼び出して画面の内容を変えられます。ドキュメントの例は買い物リストで、Claude に牛乳を追加するよう頼むと、リストに牛乳が現れます。エントリーポイントを使うと、Claude に頼まなくても Artifacts ページからアプリを開け、サイドバーにピン留めもできます。埋め込みサイトは自分のウェブサイトをビューの中の iframe に読み込むので、製品のエディターやダッシュボードを Claude の中で動かせます。サイドパネルにも組織単位の確認が別にあり、スタートガイドのページではエントリーポイントやアプリツールと並べて書かれています。
発表ではパブリックプレビューとされ、ドキュメントではアプリツールとエントリーポイント、そしてカスタムコネクタの埋め込みサイトは「a limited set of organizations」(一部の組織)で使えるとされています。私はこれを同じことを 2 つの角度から言ったものと読みました。誰でも作れるが、まだすべてのアカウントで見えるわけではない、ということです。
Claude の MCP Apps で、リモートサーバーや Verified リスティングが必要な機能はどれか
3 つともリモートサーバーが必要で、ディレクトリのリスティングが関係するのはエントリーポイントと埋め込みサイトだけです。ドキュメントでは 4 つのページに分かれているので、1 か所にまとめます。
| 機能 | コネクタの種類 | ディレクトリのリスティング | その他の条件 |
|---|---|---|---|
| アプリツール | リモートのみ | リスティングの条件なし | 一部の組織のみ、Unified Claude experience、ウェブでテスト |
| エントリーポイント | リモートのみ | Verified またはカスタムコネクタ。Community からのインストールでは、ピン留めしたアプリも含めて使えない | 一部の組織のみ、Unified Claude experience |
| 埋め込みサイト | リモートのみ | Verified:リスティングが許可したオリジンのみ。Community:ブロック | カスタムコネクタ:ユーザーがオリジンを許可する必要があり、一部の組織のみで、すべての会話で使えるわけではない |
「Unified Claude experience」は、チャットと Cowork を統合した新しい画面です。ヘルプ記事によると、入力欄でまだ Chat と Cowork を選ぶようになっているアカウントにはこれがありません。Team と Enterprise では、オーナーが Organization settings の Capabilities で有効にします。
ローカルサーバー、つまり claude_desktop_config. に書いたサーバーでは 3 つとも使えず、ドキュメントは各機能のページでそう書いています。また、ドキュメントで提供されているサンプルサーバーはローカルで動くものだとも指摘しています。このルールに従えば、デモで確認できるのはインラインのビューだけで、この表の機能は何も確認できません。
Claude でのテストでは動く MCP App が、ディレクトリからインストールしたユーザーでは動かないのはなぜか
テストに使うコネクタとユーザーがインストールするコネクタは、同じサーバーを指していても種類が違うからです。自分のコネクタは URL で追加するので、Claude はカスタムコネクタとして扱います。Community リスティングをインストールしたユーザーにはディレクトリのコネクタが入り、スタートガイドのページはその代償をこう書いています。
People who install your connector from a Community listing don’t get either
one, even if both worked while you tested with a custom connector.「Either one」はエントリーポイントと埋め込みサイトのことです。エントリーポイントのページはまさにこのケースを説明しています。サーバーを URL で追加し、同じサーバーに Community リスティングもある場合、自分にはエントリーポイントが残りますが、リスティングからインストールした人には一切ありません。
何をカスタムとみなすかは機能ごとに決まり、埋め込みサイトのページはエントリーポイントのページより厳格です。
- 埋め込みサイトについては、URL で追加したコネクタがカスタムとみなされるのは、そのアドレスがどのディレクトリのリスティングとも一致しない場合だけです。掲載後にテスト用コネクタを本番の URL に向けると、Claude はそれをディレクトリのコネクタとして扱います。テスト中に読み込めたサイトが、Community リスティングではブロックされます。
- Claude はアドレスをリスティングと照合するときクエリ文字列を無視するので、同じパスに
?build=nextを付けてもリスティングのコネクタのままです。テスト用のビルドは別のアドレスで配信してください。 - 大文字、
%、;、//を含むパスはカスタムとみなされず、Claude はそのコネクタのオリジンをブロックします。何か月も前に追加したコネクタもカスタムとみなされないことがあり、ドキュメントの対処法は削除して追加し直すことです。
どちらの場合も、ユーザーにはメッセージが表示されません。ドキュメントによると、条件を満たさないエントリーポイントはエラーもなく Artifacts ページに表示されないだけで、ブロックされた埋め込みサイトは iframe が空のままになります。「Claude shows no message」とあります。ただしアプリ側では状況を把握でき、後述のフォールバックはそれを利用します。
Claude のコネクタが Verified になるには
申請はできません。コネクタ検証のページによると、提出されたサーバーは自動でスキャンされ、デフォルトで Community として掲載されます。その後、Anthropic が特に有用と判断したリスティングを Verified の審査に回すことがあり、そこでは人が各ツールをテストします。
That escalation is assessed automatically. There’s no separate application
for the Verified label, and you don’t need to take any action.誰も申請できない以上、リスティングは Community のままだと考えて計画してください。埋め込んだエディターがあって初めて役に立つアプリなら、Community リスティングでは役に立たないアプリを出すことになります。インラインのビューだけで機能し、埋め込みサイトがアップグレードという位置づけなら、Community のユーザーが受け取るのは小さな製品であって、壊れた製品ではありません。
Verified になっても、それで決着するわけではありません。リスティングが埋め込みオリジンを 1 つずつ許可する必要があるので、新たに宣言したオリジンは、リスティングがそれも許可するまで読み込めません。
Claude の MCP App で ui.domain を計算するには
サーバー URL の SHA-256 の先頭 16 進 32 文字を取り、.claudemcpcontent.com を付けます。アプリが独自の OAuth フローを実行する場合、サイトが Claude からのフレーム表示を許可する必要がある場合、埋め込みサイトが読み込みをまたいで localStorage を保持する必要がある場合は、この値をビューのリソースの _meta.ui.domain として宣言します。宣言しないと、サンドボックスのホストが会話ごとに変わります。ドキュメントには Node のワンライナーがあります。
node -e 'const yourServerUrl = "https://example.com/mcp"; console.log(require("crypto").createHash("sha256").update(yourServerUrl).digest("hex").slice(0,32) + ".claudemcpcontent.com")'Node 22.23.4 で、ドキュメントの例は再現できました(c3d80a4ed901ee05b21755a88273b4a4.)。このサイトの読み取り専用 MCP サーバーでは、URL の 2 通りの書き方で値が 2 つに分かれます。
https://max.nardit.com/mcp 2e8c4b9cbca6508f73a038113ef1c06b.claudemcpcontent.com
https://max.nardit.com/mcp/ 922f395950b978b8d99c303db3fe7e4f.claudemcpcontent.comトラブルシューティングのページはまさにこの点を警告しています。ハッシュはスキーム、パス、末尾のスラッシュまで含む文字列全体が対象なので、Customize の Connectors に設定した URL をハッシュしてください。一致しないと、アプリの代わりに ui.domain mismatch が表示されます。ローカルの stdio サーバーにはハッシュする URL がないので、ui.domain はそもそも使えません。
csp、domain、permissions はまとめて、resources/read ハンドラーが返すコンテンツ項目の _meta.ui に置きます。そこに _meta.ui があると、Claude は resources/list のエントリー側のコピーを無視します。
Claude の MCP App に自分のウェブサイトを埋め込むには
埋め込みサイトのページによると、手順はビューでオリジンを宣言し、サイトのフレーム表示を Claude に許可し、Claude が読み込まなかった場合のフォールバックを作ることです。Community からのインストールが頼るのはこのフォールバックです。
宣言する。 ビューの ui:// リソースで、各オリジンを _meta. に追加します。
{
"_meta": {
"ui": {
"csp": {
"frameDomains": ["https://editor.example.com"]
}
}
}
}エントリーは https のオリジンで、完全一致、ポート付き、サブドメインのワイルドカードのいずれかです。ワイルドカードはドメインそのものを含みません。パスや末尾のスラッシュが付いたエントリーは未宣言として扱われます。Claude は自身のドメイン、IP アドレス、プライベートネットワークの名前、*.co.uk のような共有サフィックスへのワイルドカードを拒否します。
フレーム表示を許可する。 サイトがフレーム表示を制限している場合、その frame-ancestors には https://claude.ai と、正確なサンドボックスのホストの両方が必要です。ブラウザーはサイトの上にあるすべてのフレームを確認するので、1 つ欠けるだけでブロックされます。
Content-Security-Policy: frame-ancestors https://<your-hash>.claudemcpcontent.com https://claude.aiドキュメントは近道を戒めています。claudemcpcontent.com 全体へのワイルドカードを使うと、ほかのどのコネクタの MCP App でもあなたのサイトをフレーム表示できてしまいます。
フォールバックを用意する。 app.connect() が完了したら、許可されたリストを読み、何を表示するかを決めます。
const allowed = app.getHostCapabilities()?.sandbox?.csp?.frameDomains;リストが空、または自分のオリジンが含まれていなければ、Claude がブロックしたということです。ui/open-link でサイトを新しいタブに開くボタンを表示してください。Community からのインストールがたどるのはこの分岐です。リストそのものがない場合は、Claude がどちらとも伝えていないので、iframe を読み込みつつボタンも表示したままにします。
サインインする。 Claude は埋め込みサイトにセッションを渡さず、別のタブでのログインも効かず、document. は拒否されます。ドキュメントにある方法はこうです。_meta.ui.visibility をアプリのみに設定して Claude から隠したサーバーツールが、有効期限の短い使い捨てトークンを返します。ビューは app.callServerTool() でそれを取得し、正確なオリジンを指定してフレームに送ります。サイトはそれを SameSite=None; Secure; Partitioned を付けたセッション Cookie と交換します。
オリジンを許可すると、代償が 2 つあります。オリジンを持つビューは、カメラ、マイク、位置情報、クリップボードへの書き込みを失い、埋め込んだサイトも同様です。_meta.ui.permissions で要求しても変わりません。コネクタのほかのビューもこれらを失うと想定してください。ディレクトリのコネクタならリスティングがオリジンを許可した時点から、カスタムコネクタなら埋め込みサイトが使えるところではどこでもです。また、iframe のサンドボックスはポップアップ、alert()、ファイルのダウンロードをブロックし、confirm() は false を返します。
Claude 向けに MCP App のエントリーポイントを宣言するには
ビューを開くツールに印を付けます。_meta の ui.resourceUri はそのままにして、openai/ui キーを追加し、その entrypoints リストにグローバルなエントリーを入れます。エントリーポイントのページでは、tools/list に現れる形でこう示されています。
{
"name": "open_studio",
"title": "Example Studio",
"description": "Open Example Studio.",
"inputSchema": { "type": "object" },
"_meta": {
"ui": { "resourceUri": "ui://example/home" },
"openai/ui": { "entrypoints": [{ "type": "global" }] }
}
}このキーは OpenAI の MCP 拡張に由来するので、OpenAI Apps SDK 向けに作ったツールにはすでに付いているかもしれません。そうしたツールでドキュメントが最初に確認するよう勧めているのは、ui.resourceUri も付いているかどうかです。この方法で開いたビューは、リクエストも会話もない状態で始まります。なので、入力はすべて省略可能にし、空の引数オブジェクトでも役に立つ画面が出るようにしてください。_meta.ui.visibility は未設定にするか、model を含めておきます。ツール名にも注意が必要です。アンダースコアやドットが 2 つ続く、あるいはドットとアンダースコアが隣り合うと、アプリは一覧に出るのに開けなくなります。変更後は Customize の Connectors でツール一覧を更新するか、最大 2 時間ほど待ってください。
Claude が呼び出せる MCP App のツールを登録するには
ビューのスクリプトで、app.connect() より前に app.registerTool を使います。SDK にはほぼ同じ名前の関数が 2 つあります。registerAppTool はサーバーで動き、ビューを開くツールを登録します。app.registerTool はビューの中で動き、ビューが開いている間に Claude が呼び出せるツールを登録します。
アプリツールのページが警告していることの多くは、1 つのツールではなくビュー全体を失敗させます。
app.registerToolに素の JSON Schema オブジェクトを渡すと、ビューのtools/listが失敗し、中のツールがすべて見えなくなります。このメソッドが求めるのは、JSON Schema を出力できる Standard Schema 実装ライブラリのスキーマオブジェクトで、たとえば zod 4.2 以降です。@modelcontextprotocol/は 1.7.0 以降が必要です(4 月 21 日公開。11 月 11 日時点の最新は 2.0.4)。ext-apps - ルートに
type: "object"がない入力スキーマ、64 を超えるツール、1 MiB を超える定義のどれかがあると、Claude はビューのツールを 1 つも使えません。
JSON Schema を自分で書く場合や、SDK を CDN から読み込む場合は、代わりに onlisttools と oncalltool ハンドラーを使い、App コンストラクターの第 2 引数に { tools: { listChanged: true } } を渡し、引数を自分で検証してください。ハンドラーは検証しません。
1 回の呼び出しの制限時間は 45 秒で、承認にかかる時間は含みません。それより長い処理は、開始してすぐ戻り、結果を報告する 2 つ目のツールを登録します。Claude は各ツールを名前と説明の 1 行目(最大 200 文字)で一覧にするので、その 1 行で完結させてください。
承認はツールの定義に結びつきます。確認画面にはコネクタ名とツールの title が表示され、Always allow は定義されたとおりのツールに対して保存されます。そのため、名前、タイトル、説明、スキーマを変えると確認画面が再び出ることがあります。定義は固定し、変わる値は結果に入れてください。
ドキュメントがついでのように触れている非対称性があります。ビューが app.callServerTool で自分のサーバーのツールを呼ぶとき、ユーザーには確認画面がまったく表示されません。WebMCP の記事で、ツール一覧はインターフェースであって境界ではないと書きました。アプリツールは Claude の中での同じ考え方です。確認画面が対象にするのは、Claude がビューに頼むことです。そのあとビューがサーバーに対して何をするかはあなたのコードが決めることで、その認可は今もサーバー側の仕事です。
リリース前に Claude 向け MCP App をテストするには
リスティングができる前は、ユーザーが使うインストールを模擬するしかないので、意図的に模擬します。ドキュメントをもとにした計画です。
- サーバーをリモートで配信します(トンネル経由のローカルサーバーはカスタムとみなされます)。パスは小文字にし、ビルドごとに別のアドレスを使います。
- カスタムコネクタとして追加し、Unified experience の会話でウェブ版を使ってテストします。承認を毎回確認できるよう、権限の設定は Manual にします。
- 1 つのメッセージでアプリを開き、次のメッセージでアプリツールの操作を頼みます。新しいビューのツールは、次に送ったメッセージと一緒に Claude に渡されます。
- アプリツール、エントリーポイント、埋め込みサイトが現れず、ほかに理由が見当たらなければ、組織がロールアウトの対象外なのかもしれません。ドキュメントの助言は、それらがなくてもアプリが動くようにしておき、あとでテストすることです。
- Community のケースを意図的に試します。
frameDomainsが空の分岐を強制し、エントリーポイントを外し、残ったものにインストールする価値があるか確かめます。 - リスティングが公開されたら、URL で追加したコネクタを掲載済みのアドレスに向けます。前述の埋め込みサイトのルールにより、それはカスタムとみなされなくなるので、ディレクトリからインストールした場合の見え方を確認できます。
デバッグについては、SDK がプロトコルのメッセージを console.debug でログに出すので、Chrome ではログレベルを Verbose にする必要があります。埋め込みサイトについては、トラブルシューティングの節に、[mcp-ext-apps-host] で始まり frameDomains に触れているコンソールの行を探すよう書かれています。Claude がオリジンをどう扱ったかを報告するのはそこです。
11 月の MCP Apps アップデートがサーバー作者にとって変えること
ドキュメントを読んだ限り、設計の軸にすべきなのは個々の API よりもこれらの条件です。ドキュメントのとおりなら、インラインのビューにはリスティングの条件がなく、新機能にはあります。1 つのアプリがいくつもの形を持つようになり、その形は自分では制御できない条件によってユーザーごとに決まり、ユーザーはどの形を受け取ったかを知らされません。まず最小の形を作ってください。インラインのビューだけで、アプリツールも埋め込みサイトもなく、ローカルサーバーから動くものです。そのうえで、各機能を、アプリが実行時に自ら利用可否を確かめるアップグレードとして足していきます。frameDomains を読み返し、アプリツールは任意にし、エントリーポイントには役に立つ空の状態を用意します。
このサイトは /mcp で小さなリモート MCP サーバーを動かしています。読み取り専用のツールで、サインインも UI リソースもなく、10 月 8 日から稼働しています。これにビューを付けるとすれば、表のとおり 3 つの機能すべてについてリモートサーバーの条件は満たします。https:// として追加したユーザーには、上で計算した 2e8c4b9c… の値が必要になります。サーバーにわかるのはせいぜいそこまでです。あるユーザーがどの形のアプリを受け取るかは、その人の組織、画面、コネクタのインストール方法で決まり、そのどれもサーバーには届きません。
01 / ディスカッション
コメント欄はありません。議論は X で行っています。
02 / ほかの記事
Claude Fable 5.2 とエージェントのメモリに残った古い注意書き:Anthropic が測定したこと
メモを忠実に守るモデルでは、誰も整理しなかったメモのツケが表に出ます。Anthropic のテストでは、古い禁止事項、レビュアーが付けた条件、あいまいな承認リストがルーチン作業を止めていました。ガイドが示す対処法は、どの注意書きにも理由が書き残されていることを前提にしています。
スペック駆動開発 (Spec-driven development) と AI エージェント: Spec Kit 自身のリポジトリはスペックを無視している
セッションの後にスペックを残すこと自体は簡単な部分です。スペックが価値を発揮するのはデリバリーの時点で、コードが存在する前に人が読み、直した唯一の成果物だからです。マージの後は、誰かが動かさない限り何とも照合されない文書になります。誠実な選択肢は、履歴として印を付けるか、そのスペックに対するチェックを維持するか、残すべきものを constitution とテストへ移すかで、最後の選択こそ Spec Kit のドキュメントが自身のリポジトリについて説明しているものです。
Anthropic のエージェントメモリの構成要素を Claude Code で読む:MEMORY.md を監査し、トランスクリプトを残し、自前のドリーミングを回す
Claude Code はメモと起動時のインデックスを無期限に残す一方、その裏付けになるトランスクリプトはデフォルトで 30 日後に削除し、両者を突き合わせる仕組みは持っていません。Anthropic の結果を見ると、その突き合わせには価値があります。ローカルで実行し、反映する前に結果を読む方法をまとめました。