ブログ

エージェント対応のウェブサイトに必要なもの:dardo.studio構築の記録

dardo.studioをAIエージェントが読み取り、呼び出せるように、レイヤーごとに整えました。各レイヤーの役割、現在どこが読み取りを公式に説明しているか、そして作り直すとしても採用したいものを紹介します。

執筆者 Nicolás Cerón ·

夜の美術館のギャラリーで、車輪付きの小さなロボットが深紅のガイドラインに沿って、照らされた彫刻へ向かっている。

結論から

エージェント対応のウェブサイトには、3つの条件があります。AIエージェントがアクセスできること。メニューやバナー、スクリプトをかき分けずに内容を読み取れること。そして、適した場面では、どのボタンを押すか推測させる代わりに、宣言されたいくつかのツールを呼び出せることです。

dardo.studioには、2026年10月初旬にこの3つすべてを実装しました。何を実装したか、そして主要なAIプラットフォームがそのうちどこまで利用を公式に説明しているかを、2026年10月8日時点の公開サイトで確認した結果とあわせて紹介します。

結論は、よくある「AI対応」チェックリストほど華やかではありません。最も重要なのは、昔からあるレイヤー、つまりクローラーのアクセス許可と、クリーンでセマンティックなHTMLです。Markdownコピーやllms.txtは手軽にできる便利機能にとどまります。MCP、A2A、WebMCPは実際にクライアントが動いている本物のプロトコルですが、私たちが参照したOpenAI、Anthropic、Perplexity、Googleのクローラー関連ドキュメントには、各社のアシスタントがサイトのツールを自力で見つけると説明したものはありません。

まずはアクセスから:robots.txtとエッジ

私たちのrobots.txtでは、デフォルトのエージェント(*)と、名前を挙げたAI検索クローラーおよびユーザーフェッチャーのそれぞれに、同じグループを繰り返し記述しています。

User-agent: OAI-SearchBot
Allow: /
Disallow: /api/
Content-Signal: search=yes, ai-input=yes

ChatGPT-User、PerplexityBot、Perplexity-User、Claude-SearchBot、Claude-User、Bingbotにも同じルールを適用しています。閉じているのは/api/だけです。

検索クローラーと学習用クローラーは別物

主要各社は現在、検索用と学習用で別々のトークンを公開しています。

  • OpenAI。OAI-SearchBotは、ChatGPT検索にサイトを表示するためのものです。これをブロックしたサイトはChatGPT検索の回答から外れますが、通常のナビゲーションリンクとしては表示されることがあります。GPTBotは学習データを収集します。(OpenAIのクローラー)
  • Anthropic。Claude-SearchBotは検索用にインデックスを作成し、ClaudeBotは学習データを収集し、Claude-Userはユーザーが Claudeに質問したときにページを取得します。(Anthropicのクローラー)
  • Perplexity。PerplexityBotはPerplexityの検索結果にサイトを表示してリンクするためのもので、基盤モデルの学習には使われません。(Perplexityのクローラー)
  • Google。Google-Extendedは、Geminiの学習と、他のGoogleプロダクトでのグラウンディングを制御するためのトークンです。Google検索への掲載や順位には影響しません。(Googleの一般的なクローラー)

ユーザーがきっかけとなるフェッチャーは別扱いです。OpenAIは、リクエストを開始するのが人間であるため、ChatGPT-Userにはrobots.txtが適用されない場合があると説明しています。Perplexity-Userと、Googleのユーザー起点のフェッチャーは、一般にrobots.txtを無視します。これらのフェッチャーはリアルタイムで一人のユーザーのために動くため、ブロックが効く場合でも、多くはそのユーザーのアシスタントがページを読めなくなるだけです。

私たちのファイルでは学習用クローラーの名前を挙げていないため、*の対象となり、許可されています。これは事業上の判断であり、各社も別個の制御として説明しています。GPTBotやClaudeBotをブロックすることは、各社の検索インデックスから外れることとは違います。

Content Signals:1行だけ、約束はなし

Content-Signalの行は、CloudflareのContent Signals Policyに由来します。このポリシーは、search、ai-input(回答時にモデルへコンテンツを渡すこと)、ai-trainの3つの用途を定めています。私たちはai-trainを記述していませんが、ポリシー上これはその用途を許可も制限もしないことを意味します。Cloudflareは、シグナルは意向の表明であり、何もブロックせず、無視される可能性があると述べています。ここで参照したクローラーのページには、どれもこれに触れた記載がありません。書くのは1行で済みます。ただし、今のところ効果は期待しないでください。

ファイルだけでなくエッジも確認する

robots.txtはポリシーを示すだけで、実際の挙動を決めるのはCDNです。10月2日にテストしたところ、robots.txtがすべてを許可しているにもかかわらず、CloudflareのBrowser Integrity Checkは、PythonのデフォルトHTTPクライアント(Python-urllib)とlibwww-perlに403を返しました。コーディングエージェントが書くスクリプトは、Pythonの標準ライブラリをそのまま使うことがよくあります。

そこで、公開コンテンツへのGETおよびHEADリクエストを対象外にするCloudflareの設定ルールを追加しました。/api/は引き続き403を返します。同じ見直しで、.txtファイルに文字コードの指定がなく、一部のクライアントで「Bogotá」が「Bogotá」と読まれることも分かりました。修正はヘッダー1つ、charset=utf-8です。

各ユーザーエージェントで実際にリクエストを送ってテストしましょう。それで、その名前を何もブロックしていないことは確認できますが、本物のクローラーが訪問したことの証明にはなりません。

シンプルでセマンティックなHTML:すべてのエージェントが頼るレイヤー

GoogleのAI最適化ガイドは、スクリーンショットを分析し、DOMを調べ、アクセシビリティツリーを解釈するブラウザエージェントについて説明しています。そして、サイト運営者にweb.devのエージェントに優しいガイダンスを案内しています。その内容はほとんどがアクセシビリティ対応です。スタイルを付けた<div>の代わりに<button>や<a>を使う、すべてのラベルを入力欄に関連付ける、スクリーンショットの途中でレイアウトがずれないようにする、といったことです。

dardo.studioでは、各ページに<main>を1つ置き、ラベル付きの<nav>ランドマークを用意しています。メニューとテーマの切り替えは本物のボタンで、aria-expandedとaria-pressedで状態を伝え、閉じたメニューはinertにしています。問い合わせフォームの各フィールドは<label>の内側にあり、アクセシブルな名前が付きます。web.devはfor属性を勧めていますが、入力欄をラベルで囲んでも同じ役割を果たします。

これは今すぐスクリーンリーダーのユーザーの助けになり、それだけでも十分な理由です。

すべてのページにクリーンなMarkdownコピーを

エージェントは読み取るトークンごとにコストを支払いますが、レンダリングされたページにはナビゲーション、Cookieバナー、スクリプト、装飾用のグラフィックが含まれています。この取り組みの前は、Accept: text/markdownを付けてページをリクエストしても、それらすべてを含むHTMLが返されていました。

現在はビルド時に、インデックス対象のすべてのページと同じ場所へ index.md を書き出しています。冒頭にはフロントマター(タイトル、説明文、canonical URL、言語、他言語版、更新日)を置き、続けてスクリプト、ボタン、装飾画像、ページ内目次を除いた <main> の内容を収めています。FAQの回答はそのまま残ります。フォームは項目と選択肢の一覧になるため、エージェントはフォームに触れなくても、問い合わせフォームで何を聞かれるのかを利用者に伝えられます。

コピーを取得する方法は3つあります。

  • 通常のURLに Accept: text/markdown を付けてリクエストします。このレスポンスには Vary: Accept が付くため、キャッシュは各バージョンを区別して保持します。
  • ファイルを直接リクエストします:/en/services/seo/index.md
  • ページのパスに .md を付けます(/en/services/seo.md)。スラッシュで終わるURLについては、llms.txtの提案に従い、上記の形式である index.md を使います。

すべてのHTMLページは、<link rel="alternate" type="text/markdown"> でもコピーを指し示しています。

検索エンジンにはHTMLを正規ページとして示す

Googleのガイドによると、GoogleはHTML以外にも多くのファイル形式をクロールしてインデックスでき、それらを特別扱いすることもありません。Markdownのコピーが元のページと競合するおそれがあるため、すべてのMarkdownレスポンスでHTMLページをcanonicalとして指定しています。

$ curl -sI https://dardo.studio/en/services/seo/index.md
content-type: text/markdown; charset=utf-8
link: <https://dardo.studio/en/services/seo/>; rel="canonical", ...

こうしたコピーは誰が読むのでしょうか。Cloudflareは、Markdownを好むリクエストに対してエッジでHTMLを変換するMarkdown for Agentsを開発しており、エージェントが実際にMarkdownを求めていることがうかがえます。ただし、どのクライアントがこのヘッダーを送るのかは示されておらず、当社にも確認済みの一覧はありません。Cloudflareのこの機能を使う場合、オリジン側で独自に設定していなければ Content-Signal: ai-train=yes, search=yes, ai-input=yes が追加されます。当社はコピーをビルド時に生成しているので、ページと完全に一致します。

llms.txt:便利な索引だが、検索への効果はない

llms.txtはJeremy Howard氏による提案で、2024年9月に公開され、現在もコミュニティからの意見を受け付けています。サイト名、短い概要、エージェントが必要としそうなリンク集を記した、/llms.txt に置くMarkdownファイルです。

当社の /llms.txt と /es/llms.txt は、ページと同じデータから生成しているため、内容がずれることはありません。スタジオの基本情報(ボゴタ、2026年設立、3人のチーム、プロジェクトの料金の考え方、連絡方法)を記載し、サービスと実績を一覧にし、Markdownコピーの取得方法も説明しています。llms-full.txt には、スタジオ、サービス、実績、問い合わせの各ページの全文が入っています。

1行だけ、当社と紛らわしい名前の別の事業者について書いています。10月2日に確認した時点では、「dardo studio」の検索結果の上位はそれらの事業者でした。この1行は、ファイルの中でいちばん役に立つかもしれません。

現状を率直にまとめます。

  • Googleは、検索やAI機能に表示されるためにllms.txtは不要で、検索はそれを無視し、置いても効果も悪影響もないとしています。
  • OpenAI、Anthropic、Perplexityは、クローラーのドキュメントで、自社のボットが他サイトのllms.txtを読むとは述べていません。OpenAI、Anthropic、Perplexity自身のドキュメントサイトはllms.txtを公開しており、これはドキュメントを読むエージェント向けです。

自動生成され、内容が正確であれば置いておく価値はあります。コーディングエージェントや、これを探すツールの役に立ちます。ただし、可視性を高める手段ではありません。

エージェントが呼び出せるツール:MCP、A2A、APIカタログ

読み取り専用のツールを2つ公開しました。

  • list_services は、公開中のサービス、対応範囲、成果物、参照元URLを英語またはスペイン語で返します。任意のキーワードで絞り込めます。
  • get_project_brief は、当社に連絡する前に答えておくべき質問と、そのサービス向けの各言語のお問い合わせリンクを返します。

ひとつの実装が、複数の入口の背後にあります。

入口dardo.studio上のアドレス規格と状況
MCPサーバー/mcp、カードは /.well-known/mcp/server-card.jsonMCP Streamable HTTP。サーバーカードはドラフト提案
A2Aエージェント/a2a、カードは /.well-known/agent-card.jsonA2A 1.0、JSON-RPC
JSONエンドポイント/agent/services.json、OpenAPIで記述通常のHTTP
APIカタログ/.well-known/api-catalogRFC 9727、IETF標準化過程

HTMLとMarkdownのすべてのレスポンスで、カタログ、エージェントスキルの索引、2つのカードを指す Link ヘッダーを送っています。そのため、どのページからでも残りにたどり着けます。

次も採用したい設計ルール

  • 読み取り専用で公開。MCPツールは readOnlyHint: true を宣言し、HTMLと同じ公開済みカタログを読みます。背後にデータベースはありません。get_project_brief は送信、予約、見積りを行わず、人が内容を確認して送ります。
  • 入力の制限。リクエストボディは8 KiBまでに制限し、ブラウザの Origin ヘッダーを検証し(MCP仕様で必須)、呼び出しには専用のレート制限を設けています。
  • 状態を持たない。A2Aエージェントはすぐに応答し、タスクを保持せず、ストリーミングはオフで、送られてきたファイルやURLを取得することもありません。
  • 明確な条件。/auth.md には、認証情報は不要であること、また公開データを読むことはメッセージの送信や支払いの許可を意味しないことを記しています。

あえて載せなかったものもあります。対応状況のスキャナーは、コマース関連のプロトコルやOAuthディスカバリーの有無を確認します。当社はチェックアウトで何も販売しておらず、保護するリソースもないため、それらを公開すると存在しない機能を示すことになります。

現在これらのツールを使っているのは、誰かが /mcp に接続したMCPクライアントと、当社のカードを渡されたA2Aクライアントです。スタジオにとっての価値は控えめで、「Dardoは何をしていて、何を送ればいいのか」という問いに正確に答えられる程度です。在庫、空き状況、製品ドキュメントなど、問い合わせの多いリアルタイムのデータを持つサイトでは、より効果的でしょう。データを書き込むエージェントには認証と確認のステップが必要で、それはAI自動化の領域です。

WebMCP:同じツールをブラウザ内で

WebMCPを使うと、ページがツールを登録し、ブラウザ内のAIエージェントがそれを呼び出せるようになります。W3CのWeb Machine Learning Community GroupによるDraft Community Group Reportで、W3C標準ではないと明記されています。web.devによると、現在も活発に開発中で変更される可能性があり、Chromeではオリジントライアルで試せます。

当サイトのページでは、同じ2つのツールを document.modelContext(旧プレビュー版では navigator.modelContext)から登録しています。このAPIがなければ、ブラウザは追加の処理を一切行いません。ツールはすでにあったため、実装は約40行で済みました。あくまで実験として捉えてください。

各レイヤーと、取り組む価値があるかどうか

レイヤー概要現在の読み手取り組む価値は?
セマンティックHTMLとラベル付きフォーム適切なボタン、リンク、ランドマーク、ラベルブラウザ、支援技術、ブラウザエージェントあり。最初に整える
検索用・ユーザーエージェント用の robots.txt検索とトレーニングを分けるクローラーごとのルールOpenAI、Anthropic、Perplexity、Google がトークンを公開しているあり。そのうえでCDNでテストする
Content Signalsrobots.txt に記述する search、ai-input、ai-train の設定確認した限り、尊重すると明記しているAI企業はない1行で済む。ただし期待はしない
canonicalヘッダー付きのMarkdownコピー各ページのすっきりしたテキスト版Markdownを要求するエージェント。対象の一覧は公開されていないあり。canonicalヘッダーを付けて
llms.txt と llms-full.txtエージェント向けの厳選インデックスと全文Google検索は無視する。読むと明記しているクローラーのドキュメントはない自動生成なら残す。露出を高める手段ではない
MCPサーバー(読み取り専用)エージェントが呼び出せる宣言済みのツールユーザーが接続したMCPクライアント呼び出す価値のあるデータや操作がある場合のみ
A2Aエージェントカードエージェントを機械可読な形で記述したものこれを参照するA2Aクライアント多くのウェブサイトでは見込み段階
APIカタログ(RFC 9727)公開APIをまとめた、決まった場所にある一覧これを探すツールすでにAPIがあるなら手軽
WebMCPページがブラウザ上で登録するツールChrome(オリジントライアル経由)実験

もう一度作るなら選ぶもの

順番は、セマンティックHTML、テスト済みのクローラーアクセス、canonicalヘッダー付きのMarkdownコピー、自動生成の llms.txt、そして呼び出す価値のあるものがある場合のみツール。そのあとで計測します。サーバーログを見れば、どのエージェントがMarkdownコピーを取得したり /mcp を呼び出したりしているかがわかります。取得されることは引用されることではなく、これらのどれもAIシステムに紹介されることを保証するものではありません。

エージェント対応は、当社のAI検索最適化の一部です。AIの回答で引用されるかどうかを左右するコンテンツや計測もあわせて手がけています。サイトに組み込みたい方は、プロジェクトについてご相談ください。