部落格

支援 AI 代理的網站需要什麼:打造 dardo.studio 的心得筆記

我們一層一層地讓 dardo.studio 能被 AI 代理讀取與呼叫。本文說明每一層的作用、目前有哪些平台在文件中說明會讀取,以及哪些層我們會再做一次。

作者: Nicolás Cerón ·

一台小型輪式機器人在夜晚的美術館展廳裡,沿著一條深紅色導引線,朝一座被燈光照亮的雕塑前進。

簡短回答

支援 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.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 回應都會送出 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 回答是否引用你的內容與成效衡量。若想把它建置到你的網站中,歡迎和我們聊聊你的專案。