Blogg

Vad en agentredo webbplats behöver: lärdomar från bygget av dardo.studio

Vi gjorde dardo.studio läsbar och anropbar för AI-agenter, ett lager i taget. Här är vad varje lager gör, vem som dokumenterar att de läser det idag och vilka vi skulle bygga igen.

Av Nicolás Cerón ·

En liten robot på hjul följer en karmosinröd ledlinje över ett museigalleri på natten mot en upplyst skulptur.

Det korta svaret

En agentredo webbplats gör tre saker. AI-agenter kan nå den. De kan läsa den utan att ta sig igenom menyer, banners och skript. Och där det är rimligt kan de anropa några deklarerade verktyg i stället för att gissa vilken knapp de ska trycka på.

Vi byggde in alla tre på dardo.studio i början av oktober 2026. Här är vad vi lanserade och hur mycket av det som de stora AI-plattformarna dokumenterar att de använder, kontrollerat mot den live-publicerade webbplatsen den 8 oktober 2026.

Sammanfattningen är mindre spännande än de flesta checklistor för "AI-redo". De äldsta lagren väger tyngst: åtkomst för crawlers och ren, semantisk HTML. Markdown-kopior och llms.txt är billiga bekvämligheter. MCP, A2A och WebMCP är riktiga protokoll med fungerande klienter, men ingen av den crawlerdokumentation vi hänvisar till från OpenAI, Anthropic, Perplexity eller Google beskriver att deras assistenter på egen hand hittar en webbplats verktyg.

Börja med åtkomst: robots.txt och nätverkskanten

Vår robots.txt upprepar en grupp för standardagenten (*) och för varje AI-sökcrawler och användarutlöst hämtare vi nämner:

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

Samma regler gäller för ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot, Claude-User och Bingbot. Bara /api/ är stängt.

Sökcrawlers och träningscrawlers är separata

De stora företagen dokumenterar nu separata token för sökning och för träning:

  • OpenAI. OAI-SearchBot lyfter fram webbplatser i ChatGPT-sök. Webbplatser som blockerar den utelämnas från svaren i ChatGPT-sök, men kan ändå visas som vanliga navigeringslänkar. GPTBot samlar in träningsdata. (OpenAI crawlers)
  • Anthropic. Claude-SearchBot indexerar för sökning, ClaudeBot samlar in träningsdata och Claude-User hämtar sidor när en person ställer en fråga till Claude. (Anthropic crawlers)
  • Perplexity. PerplexityBot lyfter fram och länkar till webbplatser i Perplexitys resultat och används inte för att träna grundmodeller. (Perplexity crawlers)
  • Google. Google-Extended är en kontrolltoken för träning av Gemini och för grounding i andra Google-produkter. Den påverkar inte inkludering eller rankning i Google Sök. (Google common crawlers)

Användarutlösta hämtare är annorlunda. OpenAI säger att robots.txt kanske inte gäller ChatGPT-User, eftersom en person startar de förfrågningarna. Perplexity-User och Googles användarutlösta hämtare ignorerar den i regel. Dessa hämtare agerar för en enskild person i realtid; där en blockering fungerar hindrar den mest den personens assistent från att läsa din sida.

Vår fil nämner inte träningscrawlers, så de omfattas av * och är tillåtna. Det är ett affärsbeslut, och leverantörerna dokumenterar det som en separat kontroll: att blockera GPTBot eller ClaudeBot är inte detsamma som att lämna deras sökindex.

Content Signals: en rad, inga åtaganden

Raden Content-Signal kommer från Cloudflares Content Signals Policy, som nämner tre användningar: search, ai-input (att mata en modell med innehåll när den svarar) och ai-train. Vi utelämnar ai-train, vilket enligt policyn varken tillåter eller begränsar den användningen. Cloudflare säger att signaler uttrycker preferenser, inte blockerar något och kan ignoreras. Ingen av de crawlersidor vi hänvisar till här nämner dem. Det kostar en rad; förvänta dig inget än.

Kontrollera nätverkskanten, inte bara filen

robots.txt anger en policy; det är ditt CDN som avgör vad som händer. När vi testade den 2 oktober svarade Cloudflares Browser Integrity Check med 403 till Pythons standardklient för HTTP (Python-urllib) och libwww-perl, trots att robots.txt tillät allt. Skript som skrivs av kodningsagenter använder ofta Pythons standardbibliotek oförändrat.

Vi lade till en konfigurationsregel i Cloudflare som undantar GET- och HEAD-förfrågningar för offentligt innehåll; /api/ svarar fortfarande med 403. Samma genomgång visade att våra .txt-filer saknade teckenkodning, så vissa klienter läste "Bogotá" som "Bogotá". Lösningen var en enda header: charset=utf-8.

Testa med riktiga förfrågningar under varje user agent. Det visar att inget blockerar namnet; det bevisar inte att den riktiga crawlern har besökt sidan.

Enkel, semantisk HTML: lagret som alla agenter är beroende av

Googles guide för AI-optimering beskriver webbläsaragenter som analyserar skärmdumpar, inspekterar DOM och tolkar tillgänglighetsträdet. Den hänvisar webbplatsägare till web.dev:s agentvänliga vägledning, som till största delen handlar om tillgänglighetsarbete: använd <button> och <a> i stället för stylade <div>-element, koppla varje etikett till sitt fält och se till att layouten inte förskjuts under en skärmdump.

På dardo.studio har varje sida en <main> och märkta <nav>-landmärken. Meny- och temaväxlare är riktiga knappar som anger sitt läge med aria-expanded och aria-pressed, och stängda menyer är inert. Varje fält i kontaktformuläret ligger inuti sin <label>, vilket ger det ett tillgängligt namn. web.dev föreslår attributet for; att omsluta fältet gör samma nytta.

Det hjälper användare av skärmläsare redan i dag, vilket i sig är skäl nog.

En ren markdown-kopia av varje sida

Agenter betalar för varje token de läser, och en renderad sida innehåller navigering, en cookiebanner, skript och dekorativ grafik. Före det här arbetet gav förfrågningar till våra sidor med Accept: text/markdown allt det som HTML.

Nu skriver ett byggsteg en index.md bredvid varje indexerbar sida. Filen inleds med front matter (titel, beskrivning, kanonisk URL, språk, språkversionen på det andra språket och uppdateringsdatum) och fortsätter med sidans <main>-innehåll utan skript, knappar, dekorativa bilder eller den inbyggda innehållsförteckningen. Svaren i FAQ:n finns kvar. Formulär blir en lista över sina fält och val, så att en agent kan berätta för en person vad vårt kontaktformulär frågar efter utan att röra det.

Det finns tre sätt att hämta kopian:

  • Skicka Accept: text/markdown till den vanliga URL:en. Dessa svar har Vary: Accept, så att cacheminnen håller versionerna isär.
  • Begär filen: /en/services/seo/index.md.
  • Lägg till .md på sidans sökväg (/en/services/seo.md). För URL:er som slutar med snedstreck använder förslaget llms.txt index.md, alltså formen ovan.

Varje HTML-sida pekar dessutom ut sin kopia med <link rel="alternate" type="text/markdown">.

Peka tillbaka mot HTML-sidan för sökmotorerna

Googles guide konstaterar att Google kan genomsöka och indexera många filtyper förutom HTML, utan att behandla dem på något särskilt sätt. En markdown-kopia kan konkurrera med sin egen sida, så varje markdown-svar anger HTML-sidan som kanonisk:

$ 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", ...

Vem läser de här kopiorna? Cloudflare har byggt Markdown for Agents för att konvertera HTML i kanten av nätverket för förfrågningar som föredrar markdown, vilket tyder på att agenter efterfrågar det. Cloudflare anger inte vilka klienter som skickar headern, och vi har heller ingen verifierad lista. Om du använder Cloudflares funktion lägger den till Content-Signal: ai-train=yes, search=yes, ai-input=yes, om inte din origin sätter en egen. Vi genererar våra kopior vid bygget så att de stämmer exakt med sidan.

llms.txt: ett användbart index utan effekt på sökningen

llms.txt är ett förslag av Jeremy Howard, först publicerat i september 2024 och fortfarande öppet för synpunkter från communityn: en markdown-fil på /llms.txt med webbplatsens namn, en kort sammanfattning och listor med länkar som en agent kan vilja ha.

Vår fil, på /llms.txt och /es/llms.txt, genereras ur samma data som sidorna, så den kan inte glida isär från dem. Den anger fakta om studion (Bogotá, grundad 2026, ett team på tre, hur projekt prissätts, kontaktvägar), listar tjänster och arbeten och förklarar hur man hämtar markdown-kopior. llms-full.txt innehåller hela texten från sidorna om studion, tjänsterna, arbetena och kontakt.

En rad nämner företag med liknande namn som inte är vi. När vi kontrollerade den 2 oktober toppade de sökresultaten för "dardo studio". Den raden kan vara den mest användbara i filen.

Läget, rakt på sak:

  • Google säger att du inte behöver llms.txt för att synas i Sök eller i dess AI-funktioner, att Sök ignorerar filen och att en sådan varken hjälper eller stjälper.
  • OpenAI, Anthropic och Perplexity säger inte i sin dokumentation för sökrobotar att deras botar läser andra webbplatsers llms.txt. OpenAIs, Anthropics och Perplexitys egna dokumentationssajter publicerar dock en, för agenter som läser deras dokumentation.

Behåll en om den genereras och är korrekt. Den hjälper kodagenter och verktyg som letar efter den. Den är inget verktyg för att öka synligheten.

Verktyg som agenter kan anropa: MCP, A2A och API-katalogen

Vi har publicerat två skrivskyddade verktyg:

  • list_services returnerar våra publicerade tjänster, omfattning, leveranser och käll-URL:er på engelska eller spanska, filtrerade med ett valfritt nyckelord.
  • get_project_brief returnerar de frågor du bör besvara innan du kontaktar oss och den lokaliserade kontaktlänken för den tjänsten.

En implementation ligger bakom flera ingångar:

IngångAdress på dardo.studioStandard och status
MCP-server/mcp, kort på /.well-known/mcp/server-card.jsonMCP Streamable HTTP; serverkortet är ett utkast till förslag
A2A-agent/a2a, kort på /.well-known/agent-card.jsonA2A 1.0, JSON-RPC
JSON-endpoint/agent/services.json, beskriven i OpenAPIVanlig HTTP
API-katalog/.well-known/api-catalogRFC 9727, IETF Standards Track

Varje HTML- och markdown-svar skickar en Link-header som pekar på katalogen, indexet över agentfärdigheter och båda korten, så att vilken sida som helst leder vidare till resten.

Designregler vi skulle upprepa

  • Skrivskyddat och offentligt. MCP-verktygen deklarerar readOnlyHint: true och läser samma publicerade katalog som HTML-sidorna, utan någon databas bakom. get_project_brief skickar inte in, bokar eller offererar något; en person granskar och skickar.
  • Begränsad inmatning. Förfrågningskroppar är begränsade till 8 KiB, webbläsarens Origin-headers kontrolleras (MCP-specifikationen kräver det) och anrop har en egen hastighetsgräns.
  • Inget tillstånd. A2A-agenten svarar direkt, sparar inga uppgifter, har strömning avstängd och hämtar inte filer eller URL:er som skickas till den.
  • Tydliga villkor. /auth.md säger att inga inloggningsuppgifter behövs och att rätten att läsa offentliga data inte ger behörighet att skicka ett meddelande eller göra en betalning.

Vi har också utelämnat saker. Beredskapsskannrar letar efter handelsprotokoll och OAuth-discovery. Vi säljer inget via en kassa och skyddar inga resurser, så att publicera sådant skulle beskriva funktioner som inte finns.

Vem använder de här verktygen i dag: MCP-klienter som någon har kopplat till /mcp och A2A-klienter som fått vårt kort. För en studio är värdet måttligt: ett precist svar på "vad gör Dardo, och vad ska jag skicka dem?" Argumenten är starkare för en webbplats med live-data som folk frågar om, som lagersaldo, tillgänglighet eller produktdokumentation. Agenter som skriver data behöver autentisering och granskningssteg; det är arbete för AI-automatisering.

WebMCP: samma verktyg i webbläsaren

Med WebMCP kan en sida registrera verktyg som en AI-agent i webbläsaren kan anropa. Det är en Draft Community Group Report från W3C Web Machine Learning Community Group och anger att det inte är en W3C-standard. web.dev säger att det är under aktiv utveckling, kan komma att ändras och kan testas i Chrome via en origin trial.

Våra sidor registrerar samma två verktyg via document.modelContext (eller navigator.modelContext i äldre förhandsversioner). Utan API:et kör webbläsaren inget extra. Eftersom verktygen redan fanns tog det ungefär 40 rader. Se det som ett experiment.

Alla lager, och om de är värda det

LagerVad det ärVem läser det idagVärt det?
Semantisk HTML och formulär med etiketterRiktiga knappar, länkar, landmärken och etiketterWebbläsare, hjälpmedel och webbläsaragenterJa. Bygg det först
robots.txt för sök- och användaragenterRegler per crawler som skiljer sök från träningOpenAI, Anthropic, Perplexity och Google dokumenterar sina tokensJa. Testa sedan i CDN:et
Content SignalsInställningarna search, ai-input och ai-train i robots.txtInget AI-bolag vi kontrollerade dokumenterar att de följer demEn rad. Förvänta dig inget
Markdown-kopior med canonical-headersEn ren textversion av varje sidaAgenter som efterfrågar markdown; ingen publicerad lista över vilkaJa, med canonical-headern
llms.txt och llms-full.txtEtt kurerat index och fulltext för agenterGoogle Search ignorerar den; ingen crawlerdokumentation säger sig läsa denBehåll den om den genereras. Inget verktyg för synlighet
MCP-server (skrivskyddad)Deklarerade verktyg som agenter kan anropaMCP-klienter som en person ansluterBara om det finns data eller åtgärder värda att anropa
A2A-agentkortEn maskinläsbar beskrivning av en agentA2A-klienter som pekas ditSpekulativt för de flesta webbplatser
API-katalog (RFC 9727)En känd lista över dina publika API:erVerktyg som letar efter denBilligt om du redan har API:er
WebMCPVerktyg som sidan registrerar i webbläsarenChrome, via en origin trialExperiment

Det vi skulle bygga igen

I ordning: semantisk HTML, testad crawleråtkomst, markdown-kopior med canonical-headers, en genererad llms.txt, och verktyg först när det finns något värt att anropa. Mät sedan. Serverloggarna visar vilka agenter som hämtar markdown-kopior eller anropar /mcp. En hämtning är inte en källhänvisning, och inget av detta garanterar att ett AI-system nämner dig.

Agentberedskap är en del av vårt arbete med AI-sökoptimering, tillsammans med innehållet och mätningen som avgör om AI-svar citerar dig. Vill du bygga in det på din webbplats? Berätta om projektet.