当社独自のアクセス統計は常に有効です。Google Analyticsは、公開ページ(ログイン後のワークスペースは対象外)の利用状況を把握するためのもので、許可をいただいた場合のみ有効になります。詳しくは プライバシーポリシーをご覧ください。

Claude Artifacts MCP:閲覧者が開くたびに更新されるライブ競合ダッシュボード

公開されたClaudeのアーティファクトは、閲覧者自身のアカウントを使ってMCPコネクタを呼び出します。TikTok、YouTube、Instagramで9ブランドを検証し、開くたびにかかるコストを算出しました。

イラスト:宙に浮かぶダッシュボードページ。空の表のセルと小さな縦棒が並び、1行が青緑色です。ページから3つの小さな台へ細い線が伸びています。それぞれの台には、縦長の動画カード、横長の動画カード、正方形の画像カードという空白のカードが載っています。ページの右上には小さな時計と小さな円盤があります。

2026年7月、Claudeは公開アーティファクトに新しい機能を追加しました。ページが開かれるたびに、閲覧者自身のclaude.ai接続を通じてMCPコネクタを呼び出せます(Claude Code week 29 digest)。開いた全員に最新データを表示する競合ダッシュボードに適した仕組みです。2026-11-05のシンガポール時間00:18から01:05にかけて、EveryInfraのリモートMCPサーバー経由で9ブランドの最近の投稿を取得しました。データ呼び出しは39回で、うち38回が課金、1回が返金となり、合計$0.021128でした。

ダッシュボードのデータ元はGoPro、Insta360、DJIの3ブランドです。残る6ブランド(Zara、Bershka、Mango、Garmin、Whoop、Oura)については、より多くのアカウントタイプを示すため、第2ラウンドでテストしました。レイテンシのデータと「データの落とし穴」セクションでは、この6ブランドを使用しています。

Claude側については、この記事全体が設定例です。ダッシュボードページのコードを作成し、手元のマシンで実際のレスポンスをそのコードに流して再現しました。claude.aiでは公開していません。

最も有用な知見は、当社のツールアノテーションに関するものです。EveryInfraのデータツールeveryinfra_call_apiは、現在readOnlyHint: falseとdestructiveHint: trueを宣言しています。これは当社ツールの現在のアノテーションであり、データツールに対するClaudeプラットフォームのルールではありません。

実際の影響は次のとおりです。Claudeのページランタイムは、このツールの結果をキャッシュしません。また、ページから自動更新のwatchメソッドでこのツールを呼び出すこともできません。そのため、ページ側で独自にキャッシュを持つ必要があります。

つまり、独自のキャッシュを持たないページは、開かれるたびに課金されます。10人が1日3回開く場合、月900回の表示で8,100回の課金呼び出しとなり、月$4.50です。結果をアーティファクトの共有ストレージに保存し、6時間ごとに更新すれば、同じ利用でも月$0.60で済みます。

金額はわずかです。本当のコストは待ち時間と1分あたりの制限です。最も遅い同期呼び出しには69秒かかりました。また、スタンドアップ前に10人がページを開くと、1つの共有キーに1分間で90回の呼び出しが集中します。

イラスト:5つの小さなデスクが半円状に並んでいます。各デスクには何も映っていない画面があり、中央の丸いデータハブへ細い線でつながっています。そのうち1本の線はティール色です。ハブの横の小さな棚には白紙のカードが置かれ、共有コピーを表しています。
閲覧者はそれぞれ自分の接続を使います。結果を共有の「棚」に置いておけば、次の閲覧者は再取得する必要がありません。

claude artifacts mcpとは:ページを開いたときにデータを取得する仕組み

アーティファクトとは、Claudeが作成し、他の人に見せられるものです。ドキュメント、スライド、デザイン、ダッシュボード、小さなツールなどが該当します。ヘルプセンターによると、アーティファクトは共有でき、データを保存でき、アプリに接続することもできます(What are artifacts?、2026-11-05閲覧)。2026-09-16より前に作成されたアーティファクトは、現在「レガシーアーティファクト」となっています。この記事で扱うのは「アプリへの接続」の部分です。ページを開くと、claude.aiのコネクタを通じてMCPサーバー上のツールを呼び出し、その結果を描画します。

最も詳しいのはClaude Codeのドキュメントです(Artifacts、2026-11-05閲覧)。公開されたページは、誰かが閲覧するたびにMCPコネクタを呼び出せます。そのため、ページには作成時のセッションのスナップショットではなく、最新のデータが表示されます。ページは読み込み時にデータを取得します。一定間隔で、または閲覧者が更新コントロールを操作したときに更新することもできます。レスポンスは閲覧者のブラウザにキャッシュされるため、ページを開き直すと、まずキャッシュされたデータが描画され、その後更新されます。

Claudeはページを公開する際、そのページが呼び出せるコネクタを宣言します。ページは宣言の範囲外のものを呼び出せません。対象となるのは、claude.aiアカウントのコネクタだけです。Claude Codeの.mcp.jsonにあるローカルサーバーは、Claudeがページを作成している間はデータを提供できます。公開後のページからは呼び出せません。

Claude Code側では、この機能は2026年7月13日〜17日の週(v2.1.207〜v2.1.212)にリリースされました。ダイジェストによると、ページは「誰かが閲覧するたびに」コネクタを呼び出せ、各呼び出しは閲覧者自身の接続を通じて実行されます(第29週ダイジェスト)。claude.aiのチャット内のアーティファクトには、それより前の2025-10-21にMCPと永続ストレージが追加されています(Turn ideas into interactive AI-powered apps)。2026-09-16のリリースノートには、デザイン、スライド、ドキュメントがどの会話でも使えるようになったと記載されています(リリースノート)。

事実情報源の記載内容情報源と閲覧日
アーティファクトからのコネクタ呼び出しに対応するプランPro、Max、Ultra、Team、Enterprise(Web版とデスクトップ版)support.claude.com 17153992、2026-11-05
このようなページの公開に必要なClaude Codeの最小バージョンv2.1.209code.claude.com/docs/en/artifacts、2026-11-05
閲覧者が使うのは誰の接続か閲覧者自身のコネクタ。ページが認証情報を見ることはありませんcode.claude.com/docs/en/artifacts、2026-11-05
初回の呼び出し各閲覧者が、最初のコネクタ呼び出しの前に承認します同じページ
アクションごとに承認が必要なツールアーティファクトでは使用不可support.claude.com 17153992、2026-11-05
ページのストレージアーティファクトあたり最大20 MB、テキストのみ、個人用と共有用support.claude.com 17153992、2026-11-05
公開リンクヘルプセンター:アプリに接続したアーティファクトでは「Anyone with the link」は使えません。Claude Codeのドキュメント:公開共有は可能ですが、サインインしていない閲覧者や組織外の閲覧者にはライブセクションが表示されませんsupport.claude.com 9547008およびcode.claude.com、2026-11-05
組織設定のスイッチOrganization settingsの「Enable artifact connectors」code.claude.comおよびsupport.claude.com 16994751、2026-11-05

利用条件:プラン、アプリ、管理者設定

ヘルプセンターの「Connect your apps to an artifact」セクションには、Pro、Max、Ultra、Team、Enterpriseが記載されています。対応アプリはWeb版とデスクトップ版のClaudeです(support 17153992)。同じページには、アーティファクトには「Cloud code execution and file creation」設定が必要だとも書かれています。Freeプランはこのリストに含まれていません。

カスタムコネクタはすべてのプランで使えますが、Freeプランでは1つまでに制限されています(Get started with custom connectors using remote MCP)。ただし、Freeアカウントではコネクタを呼び出すアーティファクトを作成できません。そのため、このダッシュボードには少なくとも1つの有料プランが必要です。

料金は、2026-11-05に閲覧したClaudeの料金ページに基づいています(claude.com/pricing)。Proは年間プランで月額$17、月払いで$20です。Maxは$100から、Ultraは$200です。

Teamのスタンダードシートは年間プランで月額$20、月払いで$25です。プレミアムシートは$100または$125です。Enterpriseは1シートあたり$20に加え、API料金での従量課金となります。10人のチームでTeamのスタンダードシートを月払いで契約すると、シート料金は月$250です。この金額と比べると、以下で説明するデータコストはごくわずかです。

TeamとEnterpriseでは、2つのスイッチが追加されます。1つ目は、組織全体でアーティファクトのオン/オフを切り替えるスイッチです。2つ目は、アーティファクトからのコネクタ呼び出しを制御するスイッチです。Claude Codeのドキュメントによると、これはOrganization settings > Capabilitiesの「Enable artifact connectors」にあります(Artifacts)。

同じスイッチは、claude.aiのチャットで作成したページにも適用されます。管理者ガイドには、見落としやすい点が補足されています。管理者は、アーティファクトがアクセスできるアプリを制限できません。また、使用量は各ユーザー自身の上限にカウントされます(Artifacts admin guide for Team and Enterprise plans)。

公開後は誰の接続で実行されるか

これは最も重要なルールで、情報源の記載も明確です。公開されたページがコネクタを呼び出すとき、その呼び出しにはページを閲覧している人のアカウントが使われます。公開した人のアカウントは使われません。同じダッシュボードを開いた2人でも、アカウントがアクセスできる範囲が異なるため、表示されるデータが異なる場合があります。ページが誰かの認証情報を見ることはありません。呼び出しはclaude.aiがページに代わって行います。

各閲覧者は、ページが最初にコネクタを呼び出す前に承認します。承認しなかった閲覧者や、そのコネクタを接続していない閲覧者にも、ライブセクションを除いたページは表示されます(Artifacts, "How connector calls work for viewers"、2026-11-05閲覧)。ヘルプセンターにも同じ内容が書かれています。共有または公開されたアーティファクトであっても、各自が自分のアプリを接続します(support 17153992)。

Claude Codeドキュメントのスクリーンショット:code.claude.comのArtifactsページにある「How connector calls work for viewers」セクション。ティール色の枠で3つのルールを示しています。各閲覧者は自分のコネクタを使い、ページが認証情報を見ることはありません。閲覧者は最初の呼び出しの前にアクセスを承認します。アクションもクリックした人のアカウントを使います。下部の帯には「code.claude.com/docs/en/artifacts、2026-11-05 SGT閲覧」と記載されています。
スクリーンショット:Claude Codeドキュメント、2026-11-05 00:29(シンガポール時間)に撮影。ティール色の枠は当社が追加したものです。 code.claude.com、Artifacts

このダッシュボードでは、「閲覧者自身の接続」に2つの形があります。どちらを使うかによって、誰にコストが発生し、誰のレート制限にカウントされるかが変わります。1つ目は、コネクタでOAuthサインインを使用するケースです。各自がコネクタを追加する際に、自分のEveryInfraアカウントにサインインします。以降、ページから呼び出すたびに、その人の残高から料金が差し引かれ、その人の1分あたりのレート制限にカウントされます。

2つ目は、コネクタで1つの共有APIキーを使用するケースです。TeamまたはEnterpriseのOwnerがコネクタを追加し、リクエストヘッダーにキーを入力します。ヘルプセンターによると、これにより、そのコネクタを使う全員が、そのAPIキーに付与されたアクセス権で利用できるようになります(support 11175166)。形式上は、各自が「自分の接続」を使っていることになります。しかし実際には、すべてのコストが1つのEveryInfraアカウントに発生し、すべての呼び出しがそのアカウントの利用分としてカウントされます。

ライブデータが表示されない人は2種類います。ルールはヘルプセンターの共有に関する記事に記載されています(Share artifacts、2026-11-05閲覧)。アプリに接続するアーティファクトやClaudeを使うアーティファクトでは、「Anyone with the link」によるリンク共有は利用できません。組織外から招待した人には、Claudeやコネクタを使う部分が機能しません。組織外の人は、1つのアーティファクトにつき最大50人まで招待できます。

Claude Codeのドキュメントには、コネクタを使うページを公開共有できると書かれています。ただし、claude.aiにサインインしていない閲覧者や組織外の閲覧者に対しては、コネクタの呼び出しは実行されません。公開リンクについては2つの情報源の記載が食い違っています。一方で、組織外の人にはライブデータが表示されないという結果は一致しています。この記事では、より厳しいヘルプセンターのルールに従い、ダッシュボードを組織内でのみ共有します。

最近のRedditでも、この点に関するスレッドがいくつも立っています。あるユーザーは、Claude Codeでデータベースを使った採用ダッシュボードを作成し、Claudeのライセンスを持たないマネージャーに見せる方法を質問していました。返信では、組織内共有にはサインインしたメンバーが必要であり、公開リンクではコネクタの呼び出しが実行されないと説明されています(r/ClaudeCodeのスレッド)。別のスレッドでは、どのチームメイトにもダッシュボードが空のまま表示されました(r/ClaudeAIのスレッド)。

原因は同じルールでした。ページが使うすべてのコネクタを、利用者それぞれが自分で接続して承認する必要があります。そのため、各ライブセクションに、接続すべきコネクタ名を記した短い注記を入れてください。Claude Codeのドキュメントも同じ方法を勧めています。

呼び出し制限:情報源に書かれていること、書かれていないこと

2026-11-05に、claude.com、support.claude.com、code.claude.com、docs.claude.comにあるアーティファクトのコネクタに関するページを確認しました。いずれのページにも、アーティファクトからのコネクタ呼び出しについて「1分あたりの呼び出し回数」や「1日あたりの呼び出し回数」といった数値は記載されていません。管理者ガイドには、アーティファクトの使用量が各ユーザーの利用上限にカウントされるとだけ書かれています。手元にインストールしたClaude Codeに含まれるランタイムの型定義には、rate_limitedというエラーコードがあり、「reserved, never returned today」(予約済みで、現時点では返されない)という注記が付いています。

つまり、正直に答えるとこうなります。Claudeはこれらのページの呼び出し上限を公開していません。実際に制限となりうるのは、以下に記載された上限と、コネクタサーバー自体のレート制限です。

制約値出典ダッシュボードへの影響
claude.aiとデスクトップでのツール結果のサイズ約150,000文字claude.com/docs/connectors/building、2026-11-05TikTokの投稿20件で約50,000バイト
claude.aiとデスクトップでのツール呼び出しのタイムアウト240秒同じページ最も遅い同期呼び出しは69秒
ページランタイムの応答待ち上限約130秒手元のClaude Code 2.1.309に含まれるランタイム型定義、バージョン0.2.96(公開ドキュメントではなく、変更される可能性あり)遅いプラットフォームには非同期処理とポーリングが必要
アーティファクトのストレージ1件あたり20 MB、テキストのみsupport.claude.com 17153992必要なフィールドだけに絞って保存する
外部への招待アーティファクトあたり最大50人、招待相手はライブセクションを利用できないsupport.claude.com 9547008組織内で共有する
EveryInfraの1分あたりの制限デフォルトでアカウントあたり60回、全キーの合計everyinfra.com/pricing、2026-11-05キーを共有すると、チーム全体で1分あたり60回
EveryInfraのキーごとの制限キーごとにより低い制限を設定できる。テスト用のキーは1分あたり10回だった2026-11-05、シンガポール時間00:19:51に429レスポンスダッシュボード専用のキーを用意する

3行目には短い補足が必要です。Claude Codeには、artifactランタイムの型定義のローカルコピーが同梱されています。確認したのは、Claude Code 2.1.309に付属するバージョン0.2.96です。それによると、ページはclaude.use("mcp")から呼び出し関数を取得し、応答を約130秒待ちます。

このファイルは公開されたWebページではなく、変更される可能性があります。そのため、現時点での動作としてのみ扱います。同じルールを公開ドキュメントが扱っている場合は、公開ドキュメントを優先します。

ダッシュボードに必要なデータ:3つのプラットフォームと3つの機能

ダッシュボードは小さく保ちました。各ブランドにTikTok、YouTube、Instagramの3行があります。各行には、1日あたりの投稿数、再生数の中央値またはいいね数の中央値、TikTokのエンゲージメント率、フォロワー数、最新投稿からの経過日数を表示します。表の下には、直近30日間のTikTokの投稿ごとの再生数をプロットします。データはEveryInfraの3つの機能から取得します。価格は、2026年11月5日のシンガポール時間00:15に読み取ったカタログのprice_usdの値です(カタログ)。

プラットフォーム機能送信したパラメータ1回あたりの料金同期・非同期ページで使うフィールド
TikToktiktok/user_videosusername、limit 20(最大50)$0.000556同期投稿日時、再生数、いいね数、コメント数、シェア数、固定表示フラグ、フォロワー数、認証済みフラグ
YouTubeyoutube/user_postsチャンネルのurl、limit 20(最大50)$0.000556同期タイトル、相対形式の投稿日時、再生数、登録者数
Instagraminstagram/user_postsusername、limit 20(デフォルト30、最大200)$0.000556非同期:送信時に課金、ポーリングは無料投稿日時、メディアの種類、いいね数、コメント数

3つとも料金は件数単位ではなく呼び出し単位です。1件でも50件でも料金は同じで、結果が空の場合は返金されます。各プラットフォームのページはTikTokデータAPI、YouTubeデータAPI、InstagramデータAPIです。

各プラットフォームの公式APIを使わないのはなぜでしょうか。YouTube Data APIのデフォルトのクォータは1日10,000ユニットです(YouTubeのクォータコスト、2026-11-03更新)。他のチャンネルも読み取れますが、自分のGoogle Cloudプロジェクトが必要です。Instagram Business Discoveryでは、他のプロフェッショナルアカウントのフォロワー数、いいね数、コメント数を読み取れます。ただし、自分のプロフェッショナルアカウントとアクセストークンが必要です(Meta開発者ドキュメント)。

TikTokの/v2/video/list/で取得できるのは、アクセスを許可したユーザー本人の公開動画だけで、1ページあたり最大20件です(TikTok開発者ドキュメント)。競合のアカウントは読み取れません。同僚全員が開くページの裏で、アカウントとトークンを3組管理することになります。コネクタが1つなら運用も楽です。

各セルの計算方法:投稿頻度、中央値、エンゲージメント率

ページはすべての数値を表示時に計算します。キャッシュには生のフィールドだけを保存するため、データを取得し直さなくても計算式を変更できます。「1日あたりの投稿数」は、固定表示されていない投稿の数を、それらの投稿のうち最も古いものから取得時刻までの日数で割った値です。YouTubeの投稿日時は「3w ago」「2mo ago」のような相対表記です。日数に換算すると、精度は1週間または1か月単位になります。そのため、YouTubeのセルはおおよその規模を示すだけです。

「直近30日間の投稿数」は使いません。理由は後述のテスト2のとおりで、投稿の多いアカウントでは20件で30日をカバーできないからです。

このページでは、再生数といいね数に平均値ではなく中央値を使っています。ソーシャル投稿の再生数は大きくばらつくためです。GoProのYouTube動画の最新20本では、最も多いものが4.4M回、通常の動画で最も少ないものが21,000回でした。一、二本のヒットがあるだけで平均値は大きく引き上げられ、日によって大きく変動します。TikTokのエンゲージメント率は、投稿ごとに、いいね数、コメント数、シェア数の合計を再生数で割って算出します。セルにはその率の中央値を表示しています。

YouTubeの機能はいいね数を返さず、Instagramの機能は再生数を返しません。これらのセルは空のままにし、ページは他の数値で埋めません。「フォロワー数」は1件目の投稿者フォロワー数から取得します。Instagramの機能はこれを返さないため、そのセルも空です。

空欄のセルは意図的なものです。10人が毎日確認するページには、大きなリスクが1つあります。セルの意味が変わっても、誰も気づかないことです。たとえば、ある日Instagramの機能が再生数を返し始めたとします。

エンゲージメントのセルが空欄から値に変わり、見た人は競合が戦略を変えたと考えるでしょう。そのため、ページでは各列の見出しの下に、フィールド名と対象プラットフォームを記載しています。データのないセルにはダッシュを表示します。

ステップ1:EveryInfraをClaudeのコネクタとして追加(設定例)

EveryInfraには、2つの支払いモデルに対応する2つのリモートMCPアドレスがあります。以下の手順は設定例です。今回のテストでは、Web版のClaudeにはサインインしていません。画面上の名称は2026-11-05時点のClaudeヘルプセンターに基づいているため、実際の表示と照らし合わせて確認してください。

1つ目の方法では、メンバーそれぞれが自分のEveryInfraアカウントを使います。アドレスはhttps://api.everyinfra.com/mcp/allです。認証情報なしでリクエストすると、401とWWW-Authenticateヘッダーが返ります。このヘッダーはメタデータドキュメントを指しており、そのauthorization_serversフィールドにEveryInfraのサインインサービスが記載されています。

このテストはシンガポール時間2026-11-05 00:12に実施しました(メタデータドキュメント)。これはMCPの標準的なフローです。サーバーがRFC 9728に基づいて保護リソースのメタデータを公開し、クライアントはそれを使って認可サーバーを見つけます(MCPの認可仕様、2025-11-25、RFC 9728)。

Claudeのコネクタのドキュメントによると、そのOAuthクライアントは2025-03-26、2025-06-18、2025-11-25の認可仕様に準拠しています。コールバックアドレスはhttps://claude.ai/api/mcp/auth_callbackです(Build an MCP server for Claude)。このアドレスでは24個のツールが一覧表示されます。

2つ目の方法では、チーム全体で1つのキーを使います。アドレスはhttps://api.everyinfra.com/mcpです。コネクタを追加するときに、「リクエストヘッダー」にAuthorization: Bearer <EVERYINFRA_API_KEY>を入力します。このアドレスでは12個のツールが一覧表示され、受け付ける認証はキーのみです。ここで注意すべき制限が1つあります。

Claudeのコネクタのドキュメントでは、静的ヘッダーによる認証情報は一部の組織向けのベータ機能とされています(コネクタの認証、2026-11-05閲覧)。それ以外の組織のオーナーには、「リクエストヘッダー」の項目自体が表示されません。また、ドキュメントによると、このキーは個人ではなく組織の認証情報です。メンバー全員のリクエストに同じキーが付与されます。

`/mcp/all`でのOAuth`/mcp`での共有キー
支払い元閲覧者それぞれのEveryInfraアカウントキーを所有する1つのアカウント
1分あたりの上限閲覧者アカウントごとに60回チーム全体で60回、またはキーに個別設定されたより低い上限
一覧表示されるツール2412
設定できるユーザーClaudeの有料ユーザー全員TeamまたはEnterpriseのオーナー(ベータ版の「リクエストヘッダー」フィールドが有効な場合のみ)
主なリスクメンバーごとにEveryInfraアカウントと残高が必要メンバー全員の呼び出しに同じキーが使われる
text
Configuration example (Claude web or desktop, Pro or Max account)
1. Customize > Connectors > + Add > Add custom connector
2. Name:  EveryInfra                     <- the page code must use this exact server name
3. URL:   https://api.everyinfra.com/mcp/all
4. Authentication: Sign in when needed   <- each person signs in to their own EveryInfra account
5. Add. In the connector's tool permissions, set everyinfra_call_api to Always allow
   (the Help Center says tools that need approval for each action do not work in artifacts)

Configuration example (Team or Enterprise, one Owner adds it, one shared key)
1. Organization settings > Connectors > Add custom connector
2. URL:   https://api.everyinfra.com/mcp
3. Request headers:  Authorization: Bearer <EVERYINFRA_API_KEY>
   (beta, only some organizations see this field; make a separate key with its own per-minute limit)
4. Organization settings > Capabilities > turn on Enable artifact connectors
5. Each member clicks Connect under Customize > Connectors

問題の多くはステップ5で起こります。Claudeは各コネクタのツールを「読み取り専用」と「書き込み/削除」の2つのグループに分けます。各グループは「常に許可」「承認が必要」「ブロック」のいずれかに設定できます(コネクタでClaudeの機能を拡張する)。everyinfra_call_apiのツール宣言には、readOnlyHint: false、destructiveHint: true、openWorldHint: trueが指定されています。シンガポール時間2026-11-05 00:12に、tools/listの生のレスポンスを確認しました。これが当社ツールの現在のアノテーションです。MCPの仕様では、これらのフィールドはツール自身が自らの動作についてのヒントとして宣言するものです(MCPスキーマ、2026-07-28)。

ツールがどのグループに入っているかは、ご自身の権限ページで確認できます。この設定例では、claude.aiでそのページを開いていません。手順は次のとおりです。コネクタを追加したら、そのツールの権限設定を開きます。everyinfra_call_apiが含まれるグループを探し、そのグループを「常に許可」に設定します。

ヘルプセンターによると、アクションごとに承認が必要なコネクタツールはアーティファクトから利用できません。そのため、ツールが「承認が必要」のままだと、ダッシュボードは空のままになります。ポーリング用のツールeveryinfra_get_jobは読み取り専用とされているため、この影響を受けません。

ステップ2:Claudeのコードアーティファクトで作るMCPページの骨組み

ページの中核となる処理は3つです。呼び出すコネクタツールを宣言すること、まず共有キャッシュを確認すること、キャッシュが古すぎる場合にのみ有料の呼び出しを行うことです。

以下は、当社ダッシュボードのデータ取得部分です。ページ全体は約110行で、表とグラフのコードは省略しています。claude.use("mcp")とclaude.use("db")は、ページのランタイムが提供する2つのエントリーポイントです。どちらも、ビューで利用できない場合はnullを返すため、これらがなくてもページが表示されるようにしておく必要があります。

js
// Capability declaration that Claude submits at publish time.
// The page cannot call tools outside it.
// capabilities: { mcp: { servers: [{ server: "EveryInfra",
//                 tools: ["everyinfra_call_api", "everyinfra_get_job"] }] },
//                 db: {} }
const SERVER = "EveryInfra", CALL = "everyinfra_call_api", JOB = "everyinfra_get_job";
const TTL_MS = 6 * 3600 * 1000;                       // shared cache: 6 hours
const req = (b, p) => ({
  tiktok:    { platform: "tiktok",    action: "user_videos", params: { username: b.tiktok, limit: 50 } },
  youtube:   { platform: "youtube",   action: "user_posts",  params: { url: b.youtube, limit: 50 } },
  instagram: { platform: "instagram", action: "user_posts",  params: { username: b.instagram, limit: 50 } },
}[p]);
const KEEP = ["id", "post_id", "posted_at", "view_count", "like_count", "comment_count",
              "share_count", "is_pinned", "author_follower_count", "author_is_verified"];
const trim = (rows) => rows.map((r) => Object.fromEntries(KEEP.filter((k) => k in r).map((k) => [k, r[k]])));

let mcp = null, db = null;
async function fetchRows(b, p, force) {
  const key = `cache/${b.name}-${p}`.toLowerCase();
  if (db && !force) {                                   // 1. read the shared cache first
    const snap = await db.doc(key).get().catch(() => null);
    if (snap?.exists && Date.now() - snap.data().fetchedAt < TTL_MS) return snap.data();
  }
  if (!mcp) throw { code: "no_mcp" };
  let out = (await mcp.callTool(SERVER, CALL, req(b, p))).payload;   // 2. one paid call
  for (let i = 0; out.job_id && out.status !== "succeeded" && i < 20; i++) {
    if (["failed", "cancelled"].includes(out.status)) throw { code: "job_" + out.status };
    await new Promise((r) => setTimeout(r, 15000));                  // Instagram is async; polling is free
    out = (await mcp.callTool(SERVER, JOB, { job_id: out.job_id })).payload;
  }
  const doc = { fetchedAt: Date.now(), rows: trim(out.results || []) }; // 3. keep only the fields we use
  if (db) db.doc(key).set(doc).catch(() => {});        // view-only members cannot write; they still see data
  return doc;
}
(async () => { [mcp, db] = await Promise.all([claude.use("mcp"), claude.use("db")]); load(false); })();

このコードのいくつかの部分は、実際のレスポンスに基づいて決めました。1つ目に、payloadはツール結果の最初のテキストブロックを、ランタイムがJSONとしてパースしたものです。EveryInfraはJSONテキストを返すため、ページはpayload.resultsを直接読み取ります。

第2に、各レスポンスにはbillingブロックとquotaブロックもあります。ここには、この呼び出しの課金額とアカウント残高が入っています。共有キーを使うと、ページのコードから組織アカウントの残高を読めてしまいます。そのためtrimでは、ページに必要な10個のフィールドだけを残します。残高を共有ストレージに書き込むことも、表示することもしません。

3つ目に、ページは失敗した呼び出しを自動で再試行しません。ローカルの型定義によると、読み取り専用でないツールでは、タイムアウトや接続切れが起きると結果が不明になります。新たな呼び出しは、閲覧者が再度操作するまで待つ必要があります。EveryInfraの429は課金されないため、このエラーの横には「再試行」ボタンを置けます。

ページのランタイムはエラーコードを返し、コードごとに異なるメッセージが必要です。次の表は、ランタイムの型定義にあるコードと、当社のページで表示する内容の対応です。

エラーコード意味ページの表示
server_not_connected閲覧者がこの名前のコネクタを追加していない「EveryInfraコネクタを追加してください」
approval_required呼び出しに閲覧者の承認が必要同じ呼び出しを1回だけ実行するボタン
needs_reauthコネクタのサインインの有効期限切れ「設定 > コネクタでEveryInfraを再接続してください」
tool_errorツールは実行されたが、429などの失敗を報告したエラーメッセージと「再試行」ボタン
server_unavailable時間内に応答がない、またはサーバーエラー「利用できません」と表示し、有料ツールのため自動再試行は行わない
ダッシュボードページのローカルプレビュー(ライトテーマ)のスクリーンショット。タイトルはCompetitor Pulseです。その下の行には、データは5 Nov 2026, 12:24 am SGT時点のもので、今回の表示で9回のライブ呼び出しを行ったとあります。表は9行で、GoPro、Insta360、DJIがそれぞれ3行ずつです。列は、1日あたりの投稿数、再生数の中央値、いいね数の中央値、エンゲージメント率、フォロワー数、最新投稿です。TikTokのGoProは1日0.22投稿、再生数の中央値85.1K、3.5%、フォロワー3.5Mです。下の3枚の小さなカードには、直近30日間のTikTokの投稿ごとの再生数がプロットされています。
スクリーンショット:ローカルプレビュー。claude.useのモックが、2026-11-05の00:18〜00:24(シンガポール時間)に得た実際のレスポンスを再生しています。ページ上のすべての数値は、別途行ったPythonでの検証結果と一致しています。 本記事のダッシュボードページのローカルプレビュー(EveryInfra MCPの実際のレスポンスを使用)

このスクリーンショットはclaude.aiで撮影したものではありません。Claude側については、本記事では設定例を示すのみで、このダッシュボードをclaude.aiで公開してはいません。自分たちのマシン上でclaude.use()の小さなモックを使い、保存しておいた実際のレスポンスを同じページコードに渡しました。このスクリーンショットは、ページコードとレスポンスの形が噛み合っていることを示しています。また、数値が正しいことも示しています。

JavaScriptで計算したセルはすべて、別のPythonスクリプトの結果と一致しています。claude.aiの権限確認プロンプト、初回の承認、キャッシュの挙動はスクリーンショットでは確認できません。これらはご自身のアカウントで公開してはじめて確認できます。

実際の1往復:各プラットフォームを1回ずつ呼び出し

まずは、TikTokのリクエストとレスポンスの生データです。2026-11-05のシンガポール時間00:18:50に、https://api.everyinfra.com/mcpへtools/callを送信しました。ツールはeveryinfra_call_apiで、GoProのTikTokユーザー名とlimit 20を指定しました。22.22秒後に、49,956バイトのJSONが返ってきました。

動画は20本ありました。1本は2025年のピン留めされた広告です。残り19本は新しい順に並んでおり、最新の動画は取得の2.3時間前、2026-11-04に投稿されたものでした。各行には35個のフィールドがあり、billing.charged_usdは0.000556でした。

当社APIが返した実際のレスポンスのスクリーンショットで、ダークテーマのコードカードです。最上部の行にはPOST https://api.everyinfra.com/mcp、tools/call、00:18:50 SGT、22.22秒、49,956バイトと表示されています。リクエストはeveryinfra_call_api、platform tiktok、action user_videos、username gopro、limit 20です。レスポンスの抜粋にはcount 20と、投稿日時、再生数、いいね数、コメント数、シェア数を含む動画2本が表示されています。注記には「残り18件、ピン留め1件、各35フィールド」とあります。青緑色の枠でcharged_usd 0.000556が強調されています。
スクリーンショット:MCPの実際のレスポンス1件。GoProのTikTok最新動画20本で、課金額は$0.000556 EveryInfra MCPの実際のレスポンス

YouTubeの呼び出しは00:19:16に送信し、11.66秒後に13,047バイトで返ってきました。20件の動画について、タイトル、再生回数、チャンネル登録者数(GoProは11.3M)が含まれていました。高評価数は含まれていませんでした。投稿日時は「4d ago」「3w ago」「1mo ago」のような相対表記でした。再生回数は125,000や300,000のように丸められていました。

20件のうち2件は不自然な内容でした。投稿時刻のフィールドに「and NASA」や「and」+パートナー名が入り、再生数は0でした。これはGoProがパートナーと共同で投稿した動画です。ページではこうした件を区別し、中央値の計算から除外する必要があります。そうしないと、再生数の中央値が下がってしまいます。

Instagramは非同期です。00:19:28にGoProのリクエストを送信しました。8.48秒後に、status: runningとともにジョブIDが返り、everyinfra_get_jobで結果を取得するよう案内がありました。課金は送信時に発生し、ポーリングは無料です。

第1ラウンドでは、3ブランドすべてを送信し終えてからジョブを読み取りました。GoProのジョブは送信から23秒後の時点でまだ実行中でした。223秒の時点では完了しており、投稿20件、34,031バイトでした。

DJIのジョブは15秒ごとにポーリングしました。00:23:27にrunning、00:23:43にfinalizing、00:23:58にsucceededとなり、合計約56秒でした。Instagramのレスポンスにはいいね数とコメント数が含まれます。再生数とフォロワー数は含まれません。カタログのフィールド注記にも同じことが書かれており、この機能はどちらも返さず、返す投稿は最大48件です。

テスト1:各呼び出しにかかる時間

ページを1回開くと9件の呼び出しが発生します。最初の画面が空のままになる時間は、各呼び出しにかかる時間で決まります。下のグラフは、第1〜第3ラウンドの全36件の呼び出しを1件1点で示したものです。TikTokの同期呼び出しの中央値は21.23秒、YouTube呼び出しの中央値は14.00秒でした。どちらも50〜70秒のロングテールがあります。

Insta360のYouTube呼び出しは66.58秒かかりました。OuraのYouTube呼び出しは69.16秒かかった末に0件を返し、自動で返金されました。Instagramの送信は速く、中央値は2.12秒です。ただし、結果が返るまでにはさらに1分から数分かかります。

呼び出し呼び出し回数中央値(秒)最速(秒)最遅(秒)
TikTok同期1221.238.6252.78
YouTube同期1214.008.7169.16
Instagram送信122.121.9012.19
Instagram完了(上限値)1214347510
対数軸のドットチャート。行はTikTok同期、YouTube同期、Instagram送信、Instagram完了(上限値)の4つです。各点は実際の呼び出し1件を表します。太いティール色の目盛りが中央値を示します。TikTokの中央値は約21.23秒で、点は8〜53秒に分布しています。YouTubeの中央値は約14.00秒で、最も遅い呼び出しは69秒です。Instagram送信の中央値は約2.12秒です。Instagram完了の中央値は約143秒で、47秒から8.5分に分布しています。

これらの数値から、ページの設計を3つの点で変える必要があります。第一に、ページは9件の呼び出しを並列で送信しなければなりません。順番に送ると、最悪の場合、最初の画面が揃うまでに5〜6分かかります。並列でも、最も遅いセルは1分以上かかります。そのため、各セルに個別の「読み込み中」状態が必要です。

第二に、Instagramでは送信、ジョブID、ポーリングの流れを使う必要があります。1回の同期呼び出しでは対応できません。ページのランタイムは応答を約130秒待ち、Claudeのホスト型アプリはツール呼び出しを240秒で打ち切ります。第2ラウンドでは、最も遅かったInstagramのジョブは、送信から成功を確認した最初のポーリングまで510秒かかりました。

その一因は、こちらのポーリングが遅かったことです。第3ラウンドでは15秒ごとにポーリングし、3件のジョブはすべて47〜59秒で完了しました。第三に、キャッシュを使えばこうした待ち時間はすべてなくなります。共有ストレージから9つのセルを読み込む時間はミリ秒単位です。

テスト2:20件でどこまで遡れるか

1回目と2回目のラウンドではlimitを20にしました。投稿の多いアカウントでは、20件で30日間を埋められません。この記事のウェアラブルブランドでは、結果はまちまちです。WHOOPはTikTok動画20件で37.1日分をカバーした一方、Instagram投稿20件では14.3日分しかカバーできませんでした。Ouraは投稿が少なく、TikTok動画19件で83.9日分、Instagram投稿20件で27.0日分でした。GarminはYouTube動画20件で約60日前まで遡り、Instagram投稿20件で40.1日分でした。

カメラブランドはさらに投稿が多くなっています。Insta360のピン留めされていないTikTok動画17本は、わずか7.2日分しかカバーしていませんでした。ページで30日間の投稿数ではなく1日あたりの投稿数を表示しているのはこのためです。

対数軸のグループ化棒グラフ。3つのブランドそれぞれに、最新20件がカバーする日数を示す棒が最大3本あります。Oura:TikTokは84日(青緑色)、YouTubeは使用可能な結果が0件、Instagramは27日。WHOOP:TikTokは37日、YouTubeは90日、Instagramは14日。Garmin:TikTokは使用可能な結果が0件、YouTubeは60日、Instagramは40日。破線は30日を示します。

より良い対処はlimitを大きくすることです。3つの機能はいずれも呼び出し単位の料金です。TikTokとYouTubeは最大50件、Instagramは最大200件まで指定できます。件数を増やしても料金は変わりません。シンガポール時間01:03〜01:05に、limitを50にしてさらに3回呼び出しました。

TikTokのInsta360は、20件で7.2日分だったのが50件で24.0日分になりました。TikTokのMangoは14.1日分から56.1日分に、YouTubeのGoProは約150日分から約365日分になりました。どの呼び出しも料金は$0.000556のままでした。

その代償はデータサイズです。TikTokの各件には35のフィールドがあります。20件で約50,000バイト、50件では137,072バイトになりました。Claudeのホスト型アプリでのツール結果1件あたりの上限は150,000文字なので、残りは約13,900文字しかありません(Insta360の呼び出しは136,062文字を返しました)。

今回のテストで最も強調したいのはこの点です。確認せずにlimitを最大まで上げないでください。TikTokは50件の時点ですでに上限に近づいています。それ以上取得するには、ページングか非同期モードが必要です。

呼び出し(2026-11-05、シンガポール時間)20件でカバーする日数50件でカバーする日数返された文字数150,000までの余裕秒
Insta360 TikTok、01:03:597.224.0136,06213,93819.75
Mango TikTok、01:04:2714.156.1121,79428,20630.70
GoPro YouTube、01:05:0615036531,212118,78811.52

以下は、ウェアラブル3ブランドの第2ラウンドの数値です。OuraのTikTokの最新動画とInstagramの最新投稿は、いずれも2026-11-02のものでした。GarminのInstagramの最新投稿は2026-10-31のものでした。

ブランドとプラットフォーム1日あたりの投稿数再生回数の中央値いいね数の中央値エンゲージメント率フォロワー数
Oura、TikTok0.2320,700—1.09%161,600
Oura、YouTube—(0件、返金済み)————
Oura、Instagram0.74—1,785——
WHOOP、TikTok0.5417,250—2.82%415,900
WHOOP、YouTube0.197,100——165,000
WHOOP、Instagram1.40—3,412——
Garmin、TikTok—(プレースホルダーアカウント)———21
Garmin、YouTube0.3322,500——368,000
Garmin、Instagram0.50—7,228——

テスト3:TikTokの再生回数の推移

ダッシュボードの下部には、直近30日間のTikTokの投稿ごとの再生回数をプロットしています。下のグラフは、ウェアラブルブランドについて第2ラウンドで取得した実際のレスポンスを対数スケールで表示したものです。WHOOPはおよそ2日に1回投稿しています。動画の大半は5,000〜20,000回再生で、最も多いものは65,000回です。

Ouraは投稿頻度が低く、この期間の動画は5本、再生回数は3,040〜25,900回でした。再生回数の中央値は20,700回、エンゲージメント率の中央値は1.09%です。WHOOPは再生回数の中央値が17,250回、エンゲージメント率の中央値が2.82%でした。

ドットチャート。X軸は投稿日(10月6日〜11月4日)、Y軸は再生回数(対数スケール)です。Ouraのドットはティール色の円、WHOOPのドットはダークグレーの四角です。サブタイトルには、新しい動画はまだ再生回数が伸びている途中のため、右側のドットは低くなると記載されています。Garminは、試したハンドルではプレースホルダーアカウントが返されたため表示していません。

このグラフは注意して読む必要があります。各ドットは取得時点の累計再生回数であり、一定期間内の再生回数ではありません。昨日の動画と3週間前の動画を比べるのは公平ではなく、新しい動画のほうが常に弱く見えます。「今週どちらが好調だったか」を知るには、投稿後48時間の再生回数を比較してください。そのためには、ページが各動画を初めて検出した時点の再生回数を保存し、48時間後に再取得する必要があります。

共有ストレージならそれが可能ですが、組み込みのキャッシュではできません。共有ストレージは履歴を保持できますが、ブラウザキャッシュは最新の結果しか保持しません。

テスト4:41分間でデータはどれだけ変化したか

適切なキャッシュ期間は、データの変化の速さによって決まります。シンガポール時間の01:00〜01:03に、3つのカメラブランドについて、3つのプラットフォームすべてで第1ラウンドの呼び出しを再実行しました。第1ラウンドとの間隔は約41分(0.7時間)です。同じ投稿の再生回数またはいいね数を比較しました。

ブランドとプラットフォームごとの9行からなる横棒グラフ。各行には、変化の中央値を示す青緑色の棒と、最大の変化を示すグレーの棒の2本があります。x軸は0〜25%です。変化の中央値はすべて0.4%未満です。最大の変化は、Insta360のInstagramが23.4%、DJIのInstagramが12.2%、GoProのTikTokが6.14%、DJIのTikTokが5.37%、Insta360のTikTokが5.05%です。YouTubeの3行はいずれも1.2%未満です。各行には、20件のうち何件が変化したかも表示されています。

2回の取得の間に、9つのセルのいずれにも新しい投稿は現れませんでした。変化のほぼすべては、直近1〜2日の投稿に集中しています。TikTokではInsta360の動画15本が変化しましたが、増加率の中央値はわずか0.18%でした。最大の増加は2026-11-03の動画で、再生回数が247,300回から259,800回に増えました(+5.05%)。

DJIで増加率が最も高かったのは、2026-11-04の動画でした(+5.37%)。変化したGoProの動画は5本のみでした。増加率が最も高かったのは2026-11-04の動画で、再生回数は1,532回から1,626回に増えました。

Instagramでは変化した投稿が多かった(20件中12〜17件)ものの、増加率の中央値は約0.1%でした。増加が大きかった上位2件は、いずれも2026-11-04の新しい投稿です。Insta360の投稿はいいね数が742から916に(+23.4%)、DJIの投稿は2,406から2,700に(+12.2%)増えました。YouTubeでは、変化した動画は各チャンネルで20本中最大1本でした。再生回数は丸められた値(例:125,000)のため、小さな増加は反映されません。

ブランドとプラットフォームフィールド変化した行数(20行中)変化率の中央値最大変化率
GoPro TikTok再生回数50.00%6.14%
GoPro YouTube再生回数10.00%0.26%
GoPro Instagramいいね数160.06%0.46%
Insta360 TikTok再生回数150.18%5.05%
Insta360 YouTube再生回数00.00%0.00%
Insta360 Instagramいいね数120.10%23.45%
DJI TikTok再生回数140.36%5.37%
DJI YouTube再生回数10.00%1.20%
DJI Instagramいいね数170.10%12.22%

結果は明確です。1日あたりの投稿数や再生回数の中央値といったセルでは、6時間の共有キャッシュでも失われる情報はほとんどありません。古い投稿の41分間の変化は1%未満でした。変化するのは直近1日の投稿です。

ページで新しい投稿の伸び方を追跡しますか?その場合は、直近48時間を独立した行にしてください。その行には1時間など短めのキャッシュを使い、その他のセルは6〜24時間ごとの更新のままにします。

テスト5:レスポンスサイズと共有ストレージ

アーティファクトのストレージはそれぞれ20 MBで、テキストのみです(support 17153992)。1回の表示で取得する生のレスポンス9件の合計は約326 KBです。trimで10個のフィールドだけを残すと27.6 KBとなり、元のサイズの8.5%まで減ります。6時間ごとに1件ずつ履歴として保持しても、1か月で120件、わずか3.3 MBです。

20 MBの範囲に十分収まります。生のレスポンス全体は保存しないでください。理由の1つはサイズです。もう1つは、レスポンス内にアカウント残高が含まれており、共有ストレージはすべてのメンバーが読み取れるためです。

データの落とし穴:プレースホルダーアカウント、パートナー動画、空の結果

今回のテストの27個のデータセルのうち、3つはそのままではダッシュボードに載せられませんでした。原因はそれぞれ異なり、ページはそのすべてを検出する必要があります。

ケース実例(2026-11-05、シンガポール時間)課金額ページの処理
ユーザー名が別人のものだったTikTokのGarmin:ブランド名から推測したハンドルで、フォロワー21人の未認証アカウントの行が1件返された$0.000556フォロワー数が極端に少ない場合やauthor_is_verifiedがfalseの場合は「アカウントを確認」のフラグを付け、比較から除外する
パートナー動画の行GoPro、Insta360、DJIのYouTubeで、投稿時刻が「and」+パートナー名で再生数0の件がそれぞれ2〜4件通常どおり課金投稿時刻を読み取れない行は中央値の計算から除外し、「パートナー投稿」として一覧表示する
空の結果OuraのYouTubeチャンネルのアドレスで、69.16秒後に0件が返却返金済み、$0「このアドレスでは投稿が見つかりません」と表示し、チャンネルのアドレスを確認するようユーザーに促す
固定投稿TikTokアカウント9件のうち5件に固定投稿があり、Insta360とDJIにはそれぞれ3件の固定投稿があった通常どおり課金投稿頻度と中央値を計算する前に固定投稿を除外する
1分あたりの上限に到達1回目で429のレスポンスが4件、うち3件は00:19:51に発生。メッセージには、キー自体の上限が1分あたり10回と記載課金なしretry_afterの秒数と「再試行」ボタンを表示する

最も見落としやすいのは1行目です。ブランドのTikTokユーザー名が、ブランド名と同じとは限りません。試したハンドルは、小規模な個人アカウントのものでした。APIは実際にコンテンツを返しているため、この呼び出しは通常どおり課金されます。初めてブランドを追加するときは、チャットでClaudeに頼み、tiktok/profileなどのプロフィール機能でアカウントを確認してください。認証済みフラグとフォロワー数を確認してから、ページにハンドルを入れてください。

1回開くあたりのコスト:10人が1日3回開く場合

2026-11-05時点のカタログ価格では、3つの機能はいずれも1回の呼び出しあたり$0.000556です。ダッシュボードは3ブランド×各3プラットフォームなので、1回開くと9回の呼び出しで$0.005004になります。Instagramのポーリング用ツールeveryinfra_get_jobは無料です。空の結果は返金され、429のレスポンスは課金されません。

10人が1日3回ページを開く場合の月間データコストを示す、4本の横棒グラフ。キャッシュなしは$4.50でグレー。個人別・24時間は$1.50。共有・6時間は$0.60。共有・24時間は$0.15。後ろの3本はティール。サブタイトルには、1回開くと9回の呼び出しで$0.005004と記載。
方式月間取得回数課金対象の呼び出し月間データコスト備考
キャッシュなし全900回のアクセス8,100$4.5010人 × 3回 × 30日 × $0.005004
個人別、24時間各自1日1回、3002,700$1.50現在このツールは読み取り専用としてマークされていないため、組み込みキャッシュでは実現できない。個人用ストレージを使用
共有、6時間1日4回、1201,080$0.60アーティファクトの共有ストレージに保存。有効期限切れ後に最初に開いた人が取得
共有、24時間1日1回、30270$0.15週次ミーティングで確認するページ向け
参考:Teamの標準シート10席(月額)——$250claude.com/pricing、2026-11-05

どの金額もわずかです。最も高い方式でも月$5未満で、Teamシート10席の$250と比べれば小さな額です。ただし、先に2つの点を考慮してください。OAuthの場合、キャッシュの有効期限が切れた後に最初にページを開いた人が、その取得の料金を支払います。つまり、毎朝いちばん早く来た同僚が全員分を負担することになります。

金額はごくわずかですが、ページ上で明記しておきましょう。共有キーの場合、すべての料金は組織の1つのアカウントから引き落とされます。残高がなくなると、チーム全員のダッシュボードが一斉に空になります。EveryInfraのコンソールで、そのアカウントに残高不足アラートを設定してください。

開くたびの課金を避けるキャッシュ方法

Claudeのページランタイムには、独自の呼び出しキャッシュがあります。読み取り専用として宣言されたツール(readOnlyHint: true)の場合、結果はデフォルトで5分間保持され、最大7日間まで延長できます。Artifactsのドキュメントにも、再度開いたページはまずキャッシュ済みのレスポンスを使って描画されると記載されています。しかし、ローカルにインストールしたClaude Code 2.1.309に含まれるランタイムの型定義(バージョン0.2.96、公開ドキュメントではありません)には、追加のルールがあります。readOnlyHint: falseを宣言したツールでは、キャッシュのオプションは無視され、呼び出しは一切キャッシュされません。また、ページはそのツールに対して自動更新用のwatchToolメソッドも使えません。

現在のeveryinfra_call_apiのアノテーションは、このルールに該当します。そのため、ランタイムが結果を再利用することはなく、呼び出しごとに課金されます。対処法はシンプルで、ページ側で独自にキャッシュを持たせることです。以下にその方法を紹介します。

フローのアニメーション。8秒ごとに1ループ。閲覧者がページを開きます。最初のステップで、共有キャッシュがまだ有効期限内かどうかを確認します。有効期限内なら、ページは表を描画し、今回の表示のコストは$0です。期限切れなら、claude.aiが閲覧者自身の接続を使ってEveryInfraのMCPツールeveryinfra_call_apiを呼び出します。ページは表を描画し、不要な部分を省いた結果を破線に沿って共有キャッシュに書き戻します。

アーティファクトの共有ストレージ(db機能)の使用をおすすめします。各セルについて、不要な部分を省いた結果と取得時刻を保存します。ページを開いたらまずそれを読み込み、6時間経過した場合にのみ再取得します。これには3つの利点があります。

コストは月$4.50から$0.60に下がります。キャッシュが有効期限内なら、最初の画面は1分ではなく数ミリ秒で描画されます。さらに、次のグラフのとおり、1分あたりの負荷も下がります。

デフォルトでは、Contributor以上のメンバーは共有ストレージに書き込めますが、閲覧のみのメンバーは読み取りしかできません。そのため、閲覧のみのメンバーが期限切れのページを開くと、1回分の取得料金を支払って最新のデータを見ることになります。しかし、そのメンバーは結果を書き戻せないため、次の人がまた取得します。コードはこのケースに対応できる必要があります。

横棒グラフ。10人が同じ1分間にページを開くと仮定。各自が自分のアカウントでサインインする場合、最も負荷の高いアカウントへの呼び出しはその1分間で9回(ティール)。1つの共有キーでキャッシュなしの場合、1つのアカウントへの呼び出しは90回(ダークグレー)で、1分あたり60回を示す破線を超える。1つの共有キーで共有キャッシュありの場合は9回(ティール)。

1分あたりの上限が問題になるのは、共有キーを使う場合だけです。EveryInfraでは、デフォルトで1アカウントあたり1分間に60回まで呼び出せます。これはすべてのキーの合計です(料金ページ)。たとえば、スタンドアップの前に、10人が同じ1分間にキャッシュなしのページを開いたとします。1つのアカウントに90回の呼び出しが発生し、最後の30回は429になります。これらは課金されませんが、該当するセルは空のままです。

この記事で使ったテスト用キーには、キー独自に1分あたり10回の上限が設定されていました。1回目ではこの上限に4回達し、うち3回は00:19:51でした。メッセージには、キー自体の上限を使い切ったため、9秒後に再試行するよう記載されていました。そこで、ダッシュボードには、アカウントの上限より低い1分あたりの上限を設定した専用のキーを用意しましょう。そうすれば、同じアカウント上のほかのプログラムが必要とする呼び出し枠を、ダッシュボードが使い切ってしまうことはありません。

共有キャッシュには、それ特有のコストもあります。HaloPSAのサービスデスク用ダッシュボードに関するRedditの投稿とそのコメントで、よく説明されています(r/halopsaのスレッド)。1つ目のコストはアクセス権です。キャッシュされたデータは、最初に取得した人のアクセス権で取得されたものです。

後から閲覧する人は、自分のアクセス権の範囲外のデータを見る可能性があります。競合他社の公開ソーシャルデータは誰にとっても同じなので、今回のケースでは問題になりません。社内データでは、実際に問題になります。

2つ目のコストは信頼性です。デフォルトのルールでは、どのContributorでも共有ストレージ内のキャッシュドキュメントを変更できます。誰かが偽の数値を書き込むと、すべての閲覧者がその数値を目にします。これを防ぐには、キャッシュのパスへの書き込みをEditorに限定します。その代わり、一般のメンバーは期限切れのページを開くたびに取得を行うことになります。

最近の変更点

2026-10-28、AnthropicはClaude for Legalに、すぐに使える法務向けアーティファクトのギャラリーを追加しました。発表記事ではアーティファクトを「トラッカーやダッシュボードなどのインタラクティブなツール」と呼び、コネクタによってチームが普段使っている情報源を取り込めると説明しています(Introducing artifacts for legal work with Claude)。ローンチパートナーの1社であるHarveyも同日に記事を公開しました。同社のIntakeアーティファクトは、Harvey MCPサーバーを通じてHarveyに接続します(Harveyのブログ)。2026-10-21には、ヘルプセンターのリリースノートにClaude Duetなどのアップデートが記載されました(リリースノート)。同じリリースノートによると、2026-10-15にはEnterpriseプランでアーティファクトのテンプレートがデフォルトで有効になりました。

2026-10-08、Claude DashboardsとClaude Motionがベータ版として公開されました。Dashboardsは有料プランで利用でき、BigQueryやSnowflakeなどのデータプラットフォームに接続できます。ほかのコネクタとも連携でき、各グラフにはデータが最後に更新された日時が表示されます(Claudeブログ、Get started with Claude dashboards)。同日のThe New Stackの記事では、Anthropicの広報担当者のコメントが引用されています。

デフォルトでは、共有ダッシュボードのクエリは各閲覧者自身の接続で実行されます(The New Stack)。DashboardsはデータウェアハウスでのSQLを主な用途としています。今回のようにソーシャルデータのAPIを呼び出すページには、MCPコネクタを使ったシンプルなアーティファクトのほうが直接的です。

Claude Code側では、v2.1.209で、コネクタが公開していないツール名を公開時に受け付けてしまう問題が修正されました。v2.1.265以降は、ページで宣言されているツール名が公開時にチェックされ、一致するものが1つもなければ公開が拒否されます(Claude Codeの変更履歴、Artifacts)。2026-11-05時点で確認できた最新バージョンはv2.1.318です。

未解決のGitHub issueが1件残っています。2026-08-06に、クラウドセッションから更新するとコネクタの許可設定が消える問題がユーザーから報告されました。アプリには再度許可する手段がありません(claude-ai-mcp #787)。Redditでも、同じ「not in this artifact's mcp_tools allowlist」エラーに遭遇したユーザーがいます(r/ClaudeAIのスレッド)。

ClaudeアーティファクトのFAQ

Claudeのアーティファクトから接続済みのMCPコネクタを呼び出せますか?

はい。出典:Googleのサジェスト「claude code artifacts can now call mcp connectors」。公開したアーティファクトは、誰かが開くたびに、その閲覧者のclaude.aiコネクタを通じてMCPツールを呼び出せます。Pro、Max、Ultra、Team、Enterpriseのいずれかのプランが必要です。Claude Codeから公開するにはv2.1.209以降が必要です。対象はclaude.aiのコネクタだけで、公開したページからローカルの.mcp.jsonにあるサーバーは呼び出せません(Artifacts)。

ClaudeアーティファクトからのMCP呼び出しに上限はありますか?

出典:Googleのサジェスト「claude artifacts mcp limits」。2026-11-05時点で、Claudeの公開ドキュメントにはアーティファクトからのコネクタ呼び出し回数の上限が記載されていません。書かれているのは、利用量が各ユーザーの上限に加算されることだけです。明記されている制限は、claude.aiとデスクトップでの結果1件あたり約150,000文字、呼び出し1回あたり240秒です(Build an MCP server for Claude)。コネクタサーバー側のレート制限も適用されます。EveryInfraでは、デフォルトでアカウントあたり毎分60回まで呼び出せます。

Claudeアカウントを持っていない人もライブデータを見られますか?

いいえ。出典:Claudeのライセンスを持たないマネージャーにデータベースのダッシュボードを見せる方法を尋ねたr/ClaudeCodeのスレッド。外部の人や、公開リンクからサインインせずに閲覧する人には、コネクタを使う部分が動作しません。ヘルプセンターにも、アプリに接続したアーティファクトでは「Anyone with the link」を使えないと書かれています(Share artifacts)。外部の読者向けには、静的なスナップショットをエクスポートするか、独自のサインイン機能を持つ小さな社内Webページを作成してください。

共有したダッシュボードがチームメンバーには空で表示されるのはなぜですか?

出典:チーム全員でダッシュボードが空になったr/ClaudeAIのスレッド。コネクタは各アカウントに紐づいています。各閲覧者は、ページが使うすべてのコネクタを接続し、最初の呼び出しを承認する必要があります。TeamとEnterpriseでは、「Enable artifact connectors」がオンになっているか確認してください。コネクタの権限設定で、そのツールが「Needs approval」になっていないかも確認してください。コネクタが公開していないツール名をページが呼び出している場合、ページは全員に対して空になります(Artifacts troubleshooting)。

再公開後に出る「not in this artifact's allowlist」はどういう意味ですか?

出典:r/ClaudeAIのスレッドと、claude-ai-mcpのGitHub issue 787。ページが呼び出せるツールを決めるのは、ページのコードではなく公開時の宣言です。クラウドセッションから更新すると、この宣言が消えることがあります。スレッドで効果があった解決策は、ローカルセッションからコネクタ名とツール名を省略せずに指定して公開し直す方法だけでした。

共有キャッシュによって、見るべきでない人にデータが見えたり、誰かに書き換えられたりすることはありますか?

出典:r/halopsaのサービスデスク用ダッシュボードに関する投稿へのコメント。はい、どちらのリスクも実際にあります。キャッシュされたデータは、最初に取得した人のアクセス権で取得されたものです。デフォルトのルールでは、Contributorがキャッシュのドキュメントに書き込めます。

競合の公開ソーシャルデータであれば、アクセス権による違いはありません。書き換えを防ぐには、キャッシュのパスへの書き込みをEditorに限定します。この場合、一般メンバーは、キャッシュの期限切れ後にページを開くたびにデータを取得します。

Claudeアーティファクトには追加料金がかかりますか?

出典:Googleのサジェスト「do claude artifacts cost money」。アーティファクトは有料プランに含まれており、単独の料金はありません。利用量は各ユーザーの上限に加算されます。データAPIの呼び出しは別料金です。この記事の例では、1回開くごとに$0.005004かかります。10人が1日3回開く場合、キャッシュなしでは月$4.50、6時間の共有キャッシュでは月$0.60です。

始め方

  1. EveryInfraに新規登録し、残高をチャージします。クイックスタートに従って、APIキーを取得するかOAuthでのサインインを準備します。リモートMCPのガイドはMCPサーバーとリモートMCPのセットアップにあります。
  2. 上の設定例のとおりに、Claudeでコネクタを追加します。名前をEveryInfraにし、everyinfra_call_apiを「Always allow」に設定します。
  3. Claudeのチャットで、ブランドごとにコネクタを1回ずつ呼び出します。ユーザー名、チャンネルのアドレス、返されたフィールドを確認します。
  4. この記事のスケルトンをもとにページを作るようClaudeに依頼します。mcpとdbの機能を宣言して公開し、組織内でのみ共有します。
  5. 各メンバーがコネクタを接続し、最初の呼び出しを承認します。ページにはキャッシュの経過時間を明記し、期限切れ後の取得費用を誰が負担するかも記載します。

関連記事

EveryInfraのブログには、競合をテーマにした記事がほかに2本あります。1つのSKILL.mdを4つのAIツールで:競合レビュー分析は、レビュー分析をエージェントスキルにまとめたものです。Claude CodeやCodexなどのツールで1回実行すると、静的なレポートが得られます。ChatGPT Spacesで作る競合ソーシャルトラッカーは、ChatGPT Spaceの共有ページを使います。このページは自動では更新されません。毎週のスケジュールタスクが新しい数値を書き込むので、閲覧者には常に直近のタスクのデータが表示されます。

この記事が異なるのは、データをいつ取得するかと、その費用を誰が払うかの2点です。Claudeのアーティファクトは、各ユーザーがページを開いた時点で、そのユーザーのコネクタを通じてデータを取得します。そのため、更新頻度を決めるのはスケジュールタスクではなく、閲覧者の数とページを開く頻度です。費用を払うのも、タスクを設定した人ではありません。

OAuthの場合、費用を払うのは各閲覧者です。共有キーの場合は、キーを入力した組織が払います。この2点がキャッシュの設計を左右し、以下のテストもすべてこの2点に関するものです。毎週の静的レポートだけが必要なら、ほかの2本の記事のほうがシンプルです。

参考文献

  1. Claudeヘルプセンター「What are artifacts and how do I use them?」、2026-11-05閲覧:https://support.claude.com/en/articles/17153992-what-are-artifacts-and-how-do-i-use-them
  2. Claudeヘルプセンター「Share artifacts」、2026-11-05閲覧:https://support.claude.com/en/articles/9547008-share-artifacts
  3. Claudeヘルプセンター「Artifacts admin guide for Team and Enterprise plans」、2026-11-05閲覧:https://support.claude.com/en/articles/16994751-artifacts-admin-guide-for-team-and-enterprise-plans
  4. Claudeヘルプセンター「Get started with custom connectors using remote MCP」、2026-11-05閲覧:https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp
  5. Claudeヘルプセンター「Use connectors to extend Claude's capabilities」、2026-11-05閲覧:https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities
  6. Claudeヘルプセンター「Get started with Claude dashboards」、2026-11-05閲覧:https://support.claude.com/en/articles/17454700-get-started-with-claude-dashboards
  7. Claudeヘルプセンター「Release notes」、2026-11-05閲覧:https://support.claude.com/en/articles/12138966-release-notes
  8. Claude Codeドキュメント「Artifacts」、2026-11-05閲覧:https://code.claude.com/docs/en/artifacts
  9. Claude Code「Week 29 digest」(2026年7月13日〜17日)、2026-11-05閲覧:https://code.claude.com/docs/en/whats-new/2026-w29
  10. Claude Code「What's new」インデックス、2026-11-05閲覧:https://code.claude.com/docs/en/whats-new
  11. Claude Codeドキュメント「Connect Claude Code to tools via MCP」、2026-11-05閲覧:https://code.claude.com/docs/en/mcp
  12. GitHub上のClaude Code変更履歴、2026-11-05閲覧:https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
  13. ドキュメント内のClaude Code変更履歴、2026-11-05閲覧:https://code.claude.com/docs/en/changelog
  14. claude.com開発者ドキュメント「Build an MCP server for Claude」、2026-11-05閲覧:https://claude.com/docs/connectors/building
  15. claude.com開発者ドキュメント「Authentication for connectors」、2026-11-05閲覧:https://claude.com/docs/connectors/building/authentication
  16. Claude APIドキュメント「MCP connector」、2026-11-05閲覧:https://docs.claude.com/en/docs/agents-and-tools/mcp-connector
  17. Claudeの料金ページ、2026-11-05閲覧:https://claude.com/pricing
  18. Claudeブログ「Build live dashboards and animate explainers with Claude」(2026-10-08)、2026-11-05閲覧:https://claude.com/blog/dashboards-and-motion
  19. Claude「Introducing artifacts for legal work with Claude」(2026-10-28)、2026-11-05閲覧:https://claude.com/resources/articles/introducing-artifacts-for-legal-work
  20. Claude「Turn ideas into interactive AI-powered apps」(2025-10-21の更新注記を含む)、2026-11-05閲覧:https://claude.com/resources/articles/build-artifacts
  21. GitHub anthropics/claude-ai-mcp issue 787(2026-08-06起票)、2026-11-05閲覧:https://github.com/anthropics/claude-ai-mcp/issues/787
  22. MCP仕様2025-06-18「Tools」、2026-11-05閲覧:https://modelcontextprotocol.io/specification/2025-06-18/server/tools
  23. MCP仕様2025-06-18「Authorization」、2026-11-05閲覧:https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
  24. MCP仕様2025-11-25「Authorization」、2026-11-05閲覧:https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization
  25. MCP仕様2026-07-28「Schema Reference」、2026-11-05閲覧:https://modelcontextprotocol.io/specification/2026-07-28/schema
  26. IETF RFC 9728「OAuth 2.0 Protected Resource Metadata」、2026-11-05閲覧:https://datatracker.ietf.org/doc/html/rfc9728
  27. IETF RFC 6750「OAuth 2.0 Bearer Token Usage」、2026-11-05閲覧:https://datatracker.ietf.org/doc/html/rfc6750
  28. MDN「429 Too Many Requests」、2026-11-05閲覧:https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429
  29. Google for Developers「YouTube Data API quota costs」(2026-11-03更新)、2026-11-05閲覧:https://developers.google.com/youtube/v3/determine_quota_cost
  30. Meta for Developers「IG User Business Discovery」、2026-11-05閲覧:https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/reference/ig-user/business_discovery
  31. Meta for Developers「Graph API rate limits」、2026-11-05閲覧:https://developers.facebook.com/docs/graph-api/overview/rate-limiting
  32. TikTok for Developers「List Videos」、2026-11-05閲覧:https://developers.tiktok.com/doc/tiktok-api-v2-video-list
  33. TikTok for Developers「Understanding TikTok API Rate Limits」、2026-11-05閲覧:https://developers.tiktok.com/doc/tiktok-api-v2-rate-limit
  34. EveryInfraのリモートMCP(tools/listおよびtools/call)、2026-11-05:https://api.everyinfra.com/mcp
  35. EveryInfraの/mcp/all向け保護リソースメタデータ、2026-11-05 00:12(シンガポール時間)閲覧:https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all
  36. EveryInfraのデータ機能カタログ、2026-11-05 00:15(シンガポール時間)閲覧:https://api.everyinfra.com/api/v1/social/catalog
  37. EveryInfraのOpenAPIドキュメント、2026-11-05閲覧:https://api.everyinfra.com/openapi.json
  38. Reddit r/ClaudeCode「Share an artifact with a database to users without a Claude License」、2026-11-05閲覧:https://www.reddit.com/r/ClaudeCode/comments/1xhwscj/help_needed_share_an_artifact_with_a_database_to/
  39. Reddit r/ClaudeAI「Has anyone gotten a Claude artifact with connectors to work for their whole team?」、2026-11-05閲覧:https://www.reddit.com/r/ClaudeAI/comments/1wb1ep7/has_anyone_gotten_a_claude_artifact_with/
  40. Reddit r/ClaudeAI「Problem with Artifact MCP permissions」、2026-11-05閲覧:https://www.reddit.com/r/ClaudeAI/comments/1vr1k8q/problem_with_artifact_mcp_permissions_how_can_i/
  41. Reddit r/halopsa「The mother of all HaloPSA dashboards, built in Claude artifacts」、2026-11-05閲覧:https://www.reddit.com/r/halopsa/comments/1wfttq0/the_mother_of_all_halopsa_dashboards_built_in/
  42. Reddit r/ClaudeAI「Artifacts cannot invoke custom MCP connectors」、2026-11-05閲覧:https://www.reddit.com/r/ClaudeAI/comments/1q8gp3l/artifacts_cannot_invoke_custom_mcp_connectors/
  43. The New Stack「Claude can now build your dashboards」(2026-10-08)、2026-11-05閲覧:https://thenewstack.io/claude-dashboards-data-motion/
  44. Harvey「Harvey Brings Intake to Claude for Legal Artifacts Launch」(2026-10-28)、2026-11-05閲覧:https://www.harvey.ai/blog/harvey-intake-claude-for-legal-artifact

参考資料 BL-87