簡短回答
支援 AI 代理的網站要做到三件事。第一,AI 代理能夠連上網站。第二,它們不必穿過選單、橫幅和腳本,就能讀懂內容。第三,在合適的情況下,它們可以呼叫幾個已公開宣告的工具,而不必猜該按哪個按鈕。
我們在 2026 年 10 月初把這三件事都做進了 dardo.studio。以下是我們上線的內容,以及主要 AI 平台在文件中說明會使用其中多少項目;這些都已在 2026 年 10 月 8 日對照正式上線的網站查證過。
結論比多數「AI-ready」檢查清單來得平淡。最老的幾層最重要:爬蟲存取,以及乾淨、語意化的 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 產品中資料佐證(grounding)的控制權杖。它不會影響網站在 Google 搜尋中的收錄或排名。(Google 通用爬蟲)
使用者觸發的擷取器則不同。OpenAI 表示,robots.txt 可能不適用於 ChatGPT-User,因為這類請求是由使用者發起的。Perplexity-User 和 Google 的使用者觸發擷取器通常會忽略它。這些擷取器是即時替單一使用者執行動作;封鎖若有效,多半只是阻止那位使用者的助理讀取你的頁面。
我們的檔案沒有點名訓練爬蟲,所以它們適用 * 的規則,也就是允許。這是一項商業決策,而且各家業者在文件中都把它當成獨立的控制項:封鎖 GPTBot 或 ClaudeBot,和退出它們的搜尋索引不是一回事。
Content Signals:一行設定,沒有任何承諾
Content-Signal 這一行來自 Cloudflare 的 Content Signals Policy,其中列出三種用途:search、ai-input(在回答時把內容提供給模型)和 ai-train。我們沒有寫 ai-train,依照該政策,這既不代表授權,也不代表限制此用途。Cloudflare 表示,這些訊號只是表達偏好,不會阻擋任何事,也可能被忽略。這裡引用的爬蟲文件頁面都沒有提到它們。它只需要一行;目前先別期待有什麼效果。
要檢查邊緣層,而不只是檔案
robots.txt 只是宣告政策,真正決定結果的是你的 CDN。我們在 10 月 2 日測試時,Cloudflare 的 Browser Integrity Check 對 Python 預設的 HTTP 用戶端(Python-urllib)和 libwww-perl 回應了 403,但 robots.txt 明明允許一切。由程式碼代理寫出的腳本,常常直接使用 Python 的標準函式庫。
我們新增了一條 Cloudflare 設定規則,讓公開內容的 GET 和 HEAD 請求不受限制;/api/ 仍然回應 403。同一次檢查還發現,我們的 .txt 檔案沒有指定字元集,所以有些用戶端會把「Bogotá」讀成「Bogotá」。解法只需要一個標頭:charset=utf-8。
請用各種 user agent 發出真實請求來測試。這只能證明沒有任何機制封鎖該名稱,並不能證明真正的爬蟲來過。
單純、語意化的 HTML:每個代理都仰賴的一層
Google 的 AI 最佳化指南提到,瀏覽器代理會分析螢幕截圖、檢查 DOM,並解讀無障礙樹(accessibility tree)。指南引導網站經營者參考 web.dev 的代理友善指引,而其內容大多屬於無障礙工作:使用 <button> 和 <a>,而不是套上樣式的 <div>;讓每個標籤都連結到對應的輸入欄位;並避免版面在截圖時發生位移。
在 dardo.studio 上,每個頁面都只有一個 <main>,以及附有標示的 <nav> 地標。選單和佈景主題切換是真正的按鈕,會透過 aria-expanded 和 aria-pressed 回報狀態,而收合的選單則設為 inert。聯絡表單的每個欄位都放在自己的 <label> 裡,因此都有可存取的名稱。web.dev 建議使用 for 屬性;把 input 包起來也能達到同樣的效果。
這對現在的螢幕閱讀器使用者就有幫助,光憑這點就已足夠。
為每個頁面提供乾淨的 Markdown 副本
代理每讀一個 token 都要付費,而渲染後的頁面包含導覽列、Cookie 橫幅、腳本和裝飾性圖形。在這項工作之前,用 Accept: text/markdown 請求我們的頁面,回傳的仍是包含上述所有內容的 HTML。
現在,建置流程會在每個可被索引的頁面旁產生一份 index.md。檔案開頭是 front matter(標題、描述、標準網址、語言、另一語言版本與更新日期),接著是該頁面的 <main> 內容,不含腳本、按鈕、裝飾性圖片,也不含頁內目錄。常見問題的解答會保留。表單會轉為欄位與選項的清單,讓 AI 代理不必實際操作表單,就能告訴使用者我們的聯絡表單需要填寫哪些內容。
取得這份副本的方式有三種:
- 對一般網址送出
Accept: text/markdown。這些回應會帶有Vary: Accept,讓快取將不同版本分開存放。 - 直接請求檔案:
/en/services/seo/index.md。 - 在頁面路徑後加上
.md(/en/services/seo.md)。對於以斜線結尾的網址,llms.txt 提案採用index.md,也就是上述的形式。
每個 HTML 頁面也會透過 <link rel="alternate" type="text/markdown"> 指向自己的副本。
讓搜尋引擎回到 HTML 頁面
Google 的指南提到,除了 HTML 之外,Google 也能抓取並索引許多檔案類型,且不會特別區別對待。Markdown 副本可能與自己的頁面互相競爭,因此每個 markdown 回應都會將 HTML 頁面指定為標準網址:
$ 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 for Agents,可在邊緣端為偏好 markdown 的請求轉換 HTML,這顯示確實有代理在提出這類請求。不過 Cloudflare 並未說明哪些用戶端會送出這個標頭,我們也沒有經過驗證的名單。如果你使用 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 年成立、三人團隊、專案報價方式、聯絡管道),也列出服務與作品,並說明如何取得 markdown 副本。llms-full.txt 則收錄工作室、服務、作品與聯絡頁面的完整文字。
其中有一行說明了幾家名稱相近、但與我們無關的企業。我們在 10 月 2 日查看時,它們在「dardo studio」的搜尋結果中排在前面。這一行或許是整份檔案中最有用的一行。
目前的情況,直白地說:
- Google 表示,要出現在搜尋或其 AI 功能中,並不需要 llms.txt;搜尋會忽略它,有沒有這個檔案既不會加分,也不會扣分。
- OpenAI、Anthropic 與 Perplexity 在其爬蟲文件中,並未說明他們的機器人會讀取其他網站的 llms.txt。不過 OpenAI、Anthropic 與 Perplexity 自家的文件網站確實有提供 llms.txt,供讀取文件的代理使用。
如果檔案是自動產生且內容正確,可以保留。它對程式開發代理和會尋找它的工具有幫助,但並不是提升能見度的手段。
代理可呼叫的工具:MCP、A2A 與 API 目錄
我們發布了兩個唯讀工具:
list_services會以英文或西班牙文回傳我們公開的服務、範圍、交付項目與來源網址,並可用選填的關鍵字篩選。get_project_brief會回傳聯絡我們之前需要先回答的問題,以及該服務對應語言的聯絡連結。
同一套實作對應多個入口:
| 入口 | dardo.studio 上的位址 | 標準與狀態 |
|---|---|---|
| MCP 伺服器 | /mcp,卡片位於 /.well-known/mcp/server-card.json | MCP Streamable HTTP;伺服器卡片為草案提案 |
| A2A 代理 | /a2a,卡片位於 /.well-known/agent-card.json | A2A 1.0、JSON-RPC |
| JSON 端點 | /agent/services.json,以 OpenAPI 描述 | 一般 HTTP |
| API 目錄 | /.well-known/api-catalog | RFC 9727,IETF 標準追蹤 |
每個 HTML 與 markdown 回應都會送出 Link 標頭,指向目錄、代理技能索引與兩張卡片,因此從任何一個頁面都能找到其餘資源。
我們會再次採用的設計原則
- 唯讀且公開。MCP 工具宣告了
readOnlyHint: true,並讀取與 HTML 相同的公開目錄,背後沒有資料庫。get_project_brief不會提交、預約或報價;由人來檢視並送出。 - 限制輸入。請求內容上限為 8 KiB,會檢查瀏覽器的
Origin標頭(MCP 規範要求這麼做),呼叫也有獨立的速率限制。 - 無狀態。A2A 代理會立即回覆,不保留任務,串流功能關閉,也不會擷取傳送給它的檔案或網址。
- 條款清楚。/auth.md 說明無需任何憑證,且讀取公開資料並不代表獲得授權去傳送訊息或付款。
我們也刻意省略了一些東西。就緒度掃描工具會檢查是否有商務協定與 OAuth 探索。我們沒有透過結帳流程販售任何東西,也沒有需要保護的資源,若公開這些項目,就等於描述不存在的功能。
目前誰在使用這些工具:有人連接到 /mcp 的 MCP 用戶端,以及取得我們卡片的 A2A 用戶端。對工作室而言,價值不大:能精確回答「Dardo 做什麼?我該傳給他們什麼資料?」對於有即時資料、讓人詢問的網站,例如庫存、可預訂狀況或產品文件,這個做法更有說服力。會寫入資料的代理則需要驗證與審核步驟,那屬於 AI 自動化的工作。
WebMCP:在瀏覽器內使用相同的工具
WebMCP 讓頁面可以註冊工具,供瀏覽器中的 AI 代理呼叫。它是 W3C Web Machine Learning 社群群組的社群群組報告草案,並聲明其並非 W3C 標準。web.dev 指出它仍在積極開發中,可能會變動,並可透過 Chrome 的 origin trial 試用。
我們的頁面會透過 document.modelContext(較舊的預覽版則是 navigator.modelContext)註冊同樣的兩個工具。如果沒有這個 API,瀏覽器不會額外執行任何東西。因為工具本來就已存在,這大約只花了 40 行程式碼。請把它當作一項實驗。
每一層的內容,以及值不值得做
| 層級 | 內容 | 目前誰在讀取 | 值得做嗎? |
|---|---|---|---|
| 語意化 HTML 與有標籤的表單 | 真正的按鈕、連結、頁面區域標記與標籤 | 瀏覽器、輔助技術與瀏覽器代理 | 值得,請優先建置 |
| 針對搜尋與使用者代理的 robots.txt | 依爬蟲分別設定規則,區分搜尋與訓練 | OpenAI、Anthropic、Perplexity 與 Google 都有公開說明其權杖 | 值得,然後在 CDN 層測試 |
| Content Signals | 在 robots.txt 中設定 search、ai-input、ai-train 偏好 | 我們查過的 AI 公司,沒有一家文件說明會遵守 | 只要一行,但別抱期待 |
| 附有 canonical 標頭的 Markdown 副本 | 每個頁面的純文字乾淨版本 | 會請求 Markdown 的代理;目前沒有公開名單說明是哪些 | 值得,但要搭配 canonical 標頭 |
| llms.txt 與 llms-full.txt | 為代理整理的精選索引與完整文字 | Google 搜尋會忽略它;沒有任何爬蟲文件聲明會讀取 | 若是自動產生就留著,但它不是提升能見度的手段 |
| MCP 伺服器(唯讀) | 宣告好、可供代理呼叫的工具 | 由使用者連接的 MCP 用戶端 | 僅在有值得呼叫的資料或操作時 |
| A2A agent card | 以機器可讀格式描述一個代理 | 指向它的 A2A 用戶端 | 對多數網站而言屬於推測性質 |
| API 目錄(RFC 9727) | 一份列出公開 API 的 well-known 清單 | 會去尋找它的工具 | 若已有 API,成本很低 |
| WebMCP | 頁面在瀏覽器中註冊的工具 | Chrome,透過 origin trial | 實驗性質 |
我們會再做一次的項目
依序是:語意化 HTML、經過測試的爬蟲存取、附有 canonical 標頭的 Markdown 副本、自動產生的 llms.txt,以及只在有值得呼叫的內容時才提供工具。接著進行衡量。伺服器記錄會顯示哪些代理擷取了 Markdown 副本或呼叫了 /mcp。擷取不等於引用,以上這些也都無法保證AI 系統會提到你。
代理就緒是我們AI 搜尋最佳化服務的一環,同時還包括決定 AI 回答是否引用你的內容與成效衡量。若想把它建置到你的網站中,歡迎和我們聊聊你的專案。
