AI・SEO対策

その「llms.txt 200 OK」、中身はHTMLです|日本の飲食・宿泊・小売30サイト実測

日高 駿11分で読めます
その「llms.txt 200 OK」、中身はHTMLです|日本の飲食・宿泊・小売30サイト実測

「llms.txtは置きましたか」という質問は、もう半分しか意味を持ちません。問うべきは、置いたものがエージェントに読める形で返ってきているかどうか。日本の飲食・宿泊・小売30サイトを2026年9月10日に測ったところ、/llms.txt がHTTP 200を返したのは6件、そのうち5件は中身がHTMLでした。

これは取込層(LLMO)の話です。引用や推薦の前に、そもそも取り込まれるかどうかの層。


KEY POINTS

項目内容
測定条件日本の飲食15・宿泊10・小売・免税5の計30サイト。2026年9月10日(JST)、一般的なデスクトップブラウザのUser-Agentで未認証GETを1回
/llms.txt404が19件、HTTP 200が6件、403が3件、タイムアウトが2件
200の中身6件のうち5件は本文がHTML。残る1件(matsuyafoods.com)は売却中ドメインのパーキングページが自動生成したもので、ブランドが置いたファイルではない
/llms-full.txt・robots.txtllms-full.txt は30件中0件が正常。robots.txt が200を返した19件のうち、AIボットのUser-agent行が有効な形であったのは2件
判定基準HTTP 200・Content-Typeがtext/plainまたはtext/markdown系・本文の先頭がHTMLでない、の3条件を全て満たしたものだけを「ある」と数えた

200 OKの中身を開けてみた

200が返ってきたことと、llms.txtがそこにあることは、別の事実です。

測ったのは、訪日客との接点が実際にある日本の飲食・宿泊・小売ブランド30サイト。内訳は飲食15、宿泊10、小売・免税5。2026年9月10日(JST)に、一般的なデスクトップブラウザのUser-Agentで、認証なしのGETを1回ずつ投げました。試した全件を記録しています。都合の悪い結果を落としてはいません。

/llms.txt を叩いてみると、19件は素直に404を返しました。HTTP 200が6件、403が3件、タイムアウトが2件。

開けてみるべきは、この200の6件です。5件は Content-Type が text/html で、本文の先頭が <!DOCTYPE html> から始まっていました。ippudo.com、torikizoku.co.jp、www.kurasushi.co.jp、www.fujiyahotel.co.jp、daiwaroynet.jp の5件。くら寿司の場合、/llms.txt が返してきたのは26,205バイトのHTMLで、先頭に <title>くら寿司|回転寿司</title> が入っています。存在しないパスにトップページを返す設定が、そのまま出ているわけです。

エージェントの側から見ると、これは404よりたちが悪い。404なら「無い」と分かって次に行けます。200が返れば、ナビゲーションと広告とスクリプトに包まれたHTMLを、わざわざ読みに行くことになる。llms.txt が最初から避けようとしていた作業を、llms.txt のURLでやらせている形です。

残る1件、matsuyafoods.com は3条件を満たしました。HTTP 200、Content-Type は text/plain、本文もHTMLではない。ただ、中身の先頭がこうでした。

matsuyafoods.com is a domain name currently listed for sale on GoDaddy's aftermarket.

matsuyafoods.com/llms.txt(2026年9月10日取得)

ブランドが書いたファイルではありません。売却中のドメインで、パーキングページの仕組みが自動生成したものです。こちらの標本の取り方が外れた件でもあります。落とさずに書いておきます。200でも、text/plainでも、書いたのがそのブランドとは限らない。1件しかない「正常」が、それを見せてくれました。

/llms-full.txt は、30件のうち正常に返ったものが0件。こちらも200が6件ありましたが、6件とも本文はHTMLです。

判定不能の5件(403が3件、タイムアウトが2件)を脇に置くと、この30サイトの中に「ブランド自身が置いた、読める llms.txt」は見つかりませんでした。

世界の数字も、同じ場所でつまずいている

200を返しながら中身が届かない現象は、日本に限った話ではありません。

Common Crawl が2026年8月31日に公開した分析が、この穴をそのまま数字にしています。2026年7月のクロール(CC-MAIN-2026-30)で /llms.txt と /llms-full.txt をシードに加え、何が返ってきたかを記録したものです。

この分析には母集団が三つあります。混ぜると数字が壊れるので、分けて置きます。

まず、llms.txt 単独で試したURLが4,895,688件。404が68.4%、200が22.32%。その200のうち、テキスト本文を伴っていたのが52.5%です。原文の書き方はこうなっています。

For /llms.txt, 11.72% of sampled URLs returned a text body.

Common Crawl「A Content Analysis of llms.txt Files from the July 2026 Crawl Archive」(2026年8月31日)

200が22.32%あって、テキスト本文まで届いたのが11.72%。同じ母集団の中で、この二つの間が抜けている。抜けた分が、私たちが30サイトで見たHTMLと同じ現象です。

llms.txt と llms-full.txt を合わせた結合母集団も見ておきます。記録された件数は6,563,125件。404が69.8%、200が19.61%。その200のうちテキスト本文を伴っていたのが45.63%です。母集団を変えても、抜ける場所は同じでした。

ここで一つ注意を。19.61%(結合母集団)と11.72%(llms.txt単独の母集団)は分母が違います。引き算して「これだけがソフト404だ」と言える数字ではない。比率は、分母を持ったまま運ばないと壊れるのです。

中身の分析は、そのどちらでもない三つ目の母集団で行われています。実際にテキストを返した584,107ファイルが対象。そこでは68.27%がテンプレート由来でした。Wix だけで41.34%を占めます。書いた人ではなく、CMSが吐いたファイルが土台になっているということ。

では、その吐かれたファイルは何を運んでいるのか。リンクが一つも入っていないものが22.56%あります。サイトの地図を渡すための形式で、行き先が書かれていない。仕様が求めるリンクの注記が付いているのは32.94%で、エージェントは「このリンクが何なのか」を知らされないまま受け取ります。文脈を切り詰めたいときに読み飛ばせる「## Optional」節を持つのは9.71%。長さの調整は、ほとんど効きません。

形だけなら安く配れる。形が何のためにあるかは配れない。著者の締めくくりが的確です。

The surface form travels well because it's cheap to emit. What the form is for doesn't travel at all.

Common Crawl、同上

仕様はContent-Typeを決めていない。だから基準はこちらで決めた

HTMLを返すことは、仕様違反ではありません。ただ、そのURLは llms.txt ではない。

llms.txt の仕様(llmstxt.org、v2・2026年8月10日改訂)を頭から終わりまで読んでも、Content-Type を text/plain にせよという規定は出てきません。text/markdown という文字列は登場しますが、それはリンク関係の type 属性の話です。

To help clients find these files, we recommend using standard link relations: rel="alternate" type="text/markdown" points to the markdown version of a page, and rel="describedby" points to the llms.txt file that covers it.

llmstxt.org「The /llms.txt file, v2」

仕様が決めているのは中身の形のほうです。H1にプロジェクト名かサイト名。必須はこれ一つだけ。続いて要約の blockquote、その後にH2で区切られたリンクリスト、という順序が定められています。

An H1 with the name of the project or site. This is the only required section

llmstxt.org「The /llms.txt file, v2」

置き場所も決まっていて、ルートの /llms.txt でも任意のサブパスでもよく、複数該当するときエージェントは最も具体的なものを使う、と書かれています。

応答ヘッダーの規定がない以上、「200が返る=ある」で数える限り、集計はいくらでも甘くなる。本質は、仕様に反しているかどうかではありません。エージェントが取りに来たとき、手ぶらで帰るかどうかです。

そこで今回は、判定基準を先に決めてから測りました。次の3条件を全部満たしたものだけを「ある」と数えています。

  • HTTPステータスが200であること
  • Content-Type が text/plain または text/markdown 系であること
  • 本文の先頭が <!DOCTYPE や <html で始まっていないこと

Content-Type は合っているのに本文がHTML、という組み合わせもあり得るので、3番目を独立した条件にしてあります。曖昧なものは「不明」に置いて、推測で埋めていません。

robots.txtは「宣言はあるのに、指示がない」

llms.txt は許可も禁止もしません。取り込みの可否を決めているのは、隣にある robots.txt のほうです。

Common Crawl の一文が正確なので、そのまま引きます。

Despite the name, llms.txt is not like robots.txt. It grants nothing and blocks nothing, and no crawler is obliged to read it.

Common Crawl、同上

同じ30サイトの robots.txt も一緒に取りました。200が19件、404が7件、403が2件、タイムアウトが2件。

200で返ってきた19件のうち、AIボットの User-agent 行がコメントアウトされずに書かれていたのは2件でした。19件中2件。tokyustay.co.jp と donki.com です。

ドン・キホーテには、有効な User-agent 行が7種類。GPTBot、OAI-SearchBot、ClaudeBot、Claude-User、CCBot、Amazonbot、Google-Extended。ところが、Allow か Disallow の指示が実際に付いているのは Google-Extended(Disallow: /)だけ。残る6種類には Crawl-delay: 600 があるだけで、許可も禁止も書かれていません。ChatGPT-User と Claude-SearchBot は行頭に # が付いていて、無効な状態です。

宣言はある。指示がない。この状態を社内で「AIボット対応済み」と報告してしまうと、報告書と実態の間に静かな差ができます。

OAI-AdsBotに開けたのは、多言語トップページ5本だけ

東急ステイは、インバウンドの現場らしい線の引き方でした。OAI-SearchBot には Allow: / 。一方 OAI-AdsBot には Disallow: / をかけた上で、例外を5本だけ置いています。Allow: /index.html、/en/index.html、/chn_cn/index.html、/chn_tc/index.html、/kor/index.html。

日本語と英語、簡体字、繁体字、韓国語のトップページ。各言語の入口だけを開けて、残りは閉じた形です。意図は書かれていないので断定はしません。ただ、robots.txt にこういう線が引かれている事実は、外国語で自店を探す客をどこまで想定しているかの記録として読めます。

ここでボットの名前を雑に扱うと、判断を間違えます。OpenAI の4つは役割が違うのです。

ボットOpenAI公式ドキュメントの説明
OAI-SearchBotChatGPTの検索機能でサイトを検索結果に出すためのもの。オプトアウトしたサイトは "will not be shown in ChatGPT search answers"
GPTBot生成AI基盤モデルの学習に使われ得るコンテンツをクロールするためのもの
ChatGPT-Userユーザーの操作でページを見に行くときのもの。"is not used to determine whether content may appear in Search"
OAI-AdsBotChatGPTに出稿された広告のランディングページを、ポリシー適合の観点で確認するためのもの

「AIボットをブロック」の一言で全部を止めると、検索結果に出るための OAI-SearchBot まで一緒に止まります。逆に、広告を出す予定がないのに OAI-AdsBot だけ丁寧に開けても、検索の露出には効きません。

Cloudflare が配布している Bot Preference Sync の BEGIN/END マーカー行は、19件のうち0件でした。robots.txt に自動で書き込まれるあのブロックは、今回の30サイトでは一度も見ていません。

月曜の朝、自分のURLで3分

この検査に、ツールも予算も要りません。

ターミナルで2行です。

curl -sI https://自社ドメイン/llms.txt
curl -s https://自社ドメイン/llms.txt | head -c 200

1行目でステータスと Content-Type を見て、2行目で本文の先頭200バイトを見る。<!DOCTYPE html> が出てきたら、そのファイルは無いのと同じです。robots.txt も、URLを差し替えれば同じ2行で確認できます。

制作会社に依頼している場合も、この2行の出力を貼って聞けば話が早い。「llms.txt はありますか」だと「はい、設置しました」で終わってしまいますから。

この測定の限界も書いておきます。1回だけの測定です。点が一つあるだけで、線ではありません。標本は30。日本の飲食店の何%、という言い方ができる数字ではない。認証なしの単発GETなので、判定不能だった5件はCDNのボット判定に触れた可能性があります。この5件は「不明」のまま残しました。

参照群として、自社の2ドメイン(menumenu.life、miruai.jp)も同じ手順で測りました。標本には入れていません。n=2ですし、自分たちの数字を自分たちの分母に混ぜたら意味が変わります。結果は2件とも llms.txt が3条件を満たし、llms-full.txt は2件とも404。robots.txt については、miruai.jp が AIボットの User-agent 行0種類でした。人のサイトを数えておいて、自分のところが空いている。ここは直します。

飲食店・宿泊事業者への示唆

  1. 「置いたか」ではなく「返ってきたか」で確認する:設置の報告ではなく、ステータス・Content-Type・本文の先頭という3つの出力で確認する。今回の30サイトでは、200が返った6件のうち5件がここで落ちました。
  2. robots.txt はボット名ごとに読む:OAI-SearchBot と GPTBot と ChatGPT-User と OAI-AdsBot は役割が違います。まとめて止めれば、検索結果に出る経路まで止まる。
  3. 宣言と指示を分けて点検する:User-agent 行があっても、Allow / Disallow が無ければ何も指示していないのと同じ。ドン・キホーテの robots.txt では、有効な7種類のうち指示が付いていたのは1種類だけでした。
  4. 外国語の入口を robots.txt の中でも数える:東急ステイは多言語トップページ5本だけを例外にしていました。外国人客の導線をサイト構造で作ったなら、その導線がボットにどう見えているかも一度確認しておく価値があります。

llms.txt を置いたかどうかは、着手の記録でしかありません。届いたかどうかを決めるのは、置いた側ではなく、返ってきたレスポンスだ。取込層の仕事は設置で終わらず、確認から始まります。

参考資料

#AI検索最適化#LLMO#GEO#クローラー#インバウンド集客
日高 駿

日高 駿

株式会社MenuMenu 代表取締役

ソフトウェアエンジニアであり、UI・UXデザイナー。2012年からシリコンバレーと韓国でプロダクトをつくってきました。SEO・MEO・AEOの専門家として、訪日観光客と日本のローカルビジネスをつなぐMenuMenuを自ら設計・開発しています。

プロフィールを見る →
共有

Next

「見つかっているか」を、数字で確かめませんか。

AIの答え、検索、地図。どこで見つかっていて、どこで見つかっていないのか。まずはサイトを点検し、現状を数字にしてから次の一手を決められます。