Blog

Czego potrzebuje strona gotowa na agentów AI: notatki z budowy dardo.studio

Sprawiliśmy, że agenci AI mogą czytać dardo.studio i z niego korzystać, warstwa po warstwie. Oto co robi każda z nich, kto dziś dokumentuje jej użycie i które zbudowalibyśmy ponownie.

Autor: Nicolás Cerón ·

Mały robot na kółkach jedzie wzdłuż karmazynowej linii prowadzącej przez nocną galerię muzeum w stronę oświetlonej rzeźby.

Krótka odpowiedź

Strona gotowa na agentów AI robi trzy rzeczy. Agenci AI mogą do niej dotrzeć. Mogą ją czytać bez przedzierania się przez menu, banery i skrypty. A tam, gdzie ma to sens, mogą wywoływać kilka zadeklarowanych narzędzi zamiast zgadywać, który przycisk nacisnąć.

Wszystkie trzy elementy wdrożyliśmy w dardo.studio na początku października 2026 roku. Oto co uruchomiliśmy i w jakim stopniu główne platformy AI dokumentują korzystanie z tego, według sprawdzenia na działającej stronie z 8 października 2026 roku.

Wnioski są mniej ekscytujące niż w większości list kontrolnych „AI-ready”. Największe znaczenie mają najstarsze warstwy: dostęp dla robotów i czysty, semantyczny HTML. Kopie w markdownie i llms.txt to tanie udogodnienia. MCP, A2A i WebMCP to prawdziwe protokoły z działającymi klientami, ale żadna z dokumentacji robotów, które cytujemy, od OpenAI, Anthropic, Perplexity czy Google, nie opisuje tego, by ich asystenci sami znajdowali narzędzia strony.

Zacznij od dostępu: robots.txt i warstwa brzegowa

Nasz plik robots.txt powtarza jedną grupę reguł dla agenta domyślnego (*) oraz dla każdego wymienionego z nazwy robota wyszukiwarek AI i narzędzia pobierającego strony na żądanie użytkownika:

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

Te same reguły obowiązują ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot, Claude-User i Bingbot. Zamknięty jest tylko /api/.

Roboty wyszukiwarek i roboty do trenowania to osobne rzeczy

Najwwięksi gracze dokumentują dziś osobne tokeny dla wyszukiwania i dla trenowania:

  • OpenAI. OAI-SearchBot pokazuje strony w wyszukiwarce ChatGPT. Strony, które go blokują, nie trafiają do odpowiedzi wyszukiwarki ChatGPT, choć nadal mogą pojawiać się jako zwykłe linki nawigacyjne. GPTBot zbiera dane treningowe. (roboty OpenAI)
  • Anthropic. Claude-SearchBot indeksuje na potrzeby wyszukiwania, ClaudeBot zbiera dane treningowe, a Claude-User pobiera strony, gdy ktoś o coś pyta Claude’a. (roboty Anthropic)
  • Perplexity. PerplexityBot wyświetla strony i linkuje do nich w wynikach Perplexity i nie służy do trenowania modeli bazowych. (roboty Perplexity)
  • Google. Google-Extended to token kontrolny dla trenowania Gemini i dla uziemiania odpowiedzi w innych produktach Google. Nie wpływa na uwzględnianie ani pozycję w Wyszukiwarce Google. (typowe roboty Google)

Narzędzia pobierające strony na żądanie użytkownika działają inaczej. OpenAI zastrzega, że robots.txt może nie obowiązywać ChatGPT-User, bo te żądania wywołuje człowiek. Perplexity-User i narzędzia Google uruchamiane przez użytkownika zazwyczaj go ignorują. Takie narzędzia działają w imieniu jednej osoby w czasie rzeczywistym; tam, gdzie blokada działa, przeważnie uniemożliwia asystentowi tej osoby przeczytanie Twojej strony.

Nasz plik nie wymienia robotów do trenowania, więc podlegają one regule * i mają dostęp. To decyzja biznesowa, a dostawcy opisują ją jako osobną kontrolę: zablokowanie GPTBot lub ClaudeBot to nie to samo, co rezygnacja z ich indeksów wyszukiwania.

Content Signals: jedna linijka, żadnych zobowiązań

Linijka Content-Signal pochodzi z Content Signals Policy Cloudflare, która wymienia trzy zastosowania: search, ai-input (przekazywanie treści modelowi w momencie odpowiedzi) i ai-train. Pomijamy ai-train, co według tej polityki ani nie zezwala na takie użycie, ani go nie ogranicza. Cloudflare podkreśla, że sygnały wyrażają preferencje, niczego nie blokują i mogą być ignorowane. Żadna z cytowanych tu stron o robotach ich nie wspomina. Kosztuje to jedną linijkę; na razie niczego się nie spodziewaj.

Sprawdzaj warstwę brzegową, nie tylko plik

robots.txt określa politykę, ale o wszystkim decyduje Twój CDN. Podczas testu 2 października Browser Integrity Check Cloudflare odpowiadał kodem 403 na domyślnego klienta HTTP Pythona (Python-urllib) i na libwww-perl, mimo że robots.txt pozwalał na wszystko. Skrypty pisane przez agentów programistycznych często używają biblioteki standardowej Pythona bez zmian.

Dodaliśmy regułę konfiguracji Cloudflare, która wyłącza z blokady żądania GET i HEAD dla treści publicznych; /api/ nadal zwraca 403. Ten sam przegląd wykazał, że nasze pliki .txt nie miały ustawionego kodowania, przez co niektórzy klienci czytali „Bogotá” jako „Bogotá”. Wystarczył jeden nagłówek: charset=utf-8.

Testuj prawdziwymi żądaniami pod każdym user agentem. To pokazuje, że nic nie blokuje danej nazwy, ale nie dowodzi, że odwiedził nas prawdziwy robot.

Prosty, semantyczny HTML: warstwa, od której zależy każdy agent

Przewodnik Google po optymalizacji pod AI opisuje agentów przeglądarkowych, którzy analizują zrzuty ekranu, badają DOM i interpretują drzewo dostępności. Odsyła właścicieli stron do wskazówek web.dev dotyczących stron przyjaznych agentom, które w większości sprowadzają się do pracy nad dostępnością: używaj <button> i <a> zamiast ostylowanych <div>ów, powiąż każdą etykietę z jej polem i dopilnuj, by układ nie przesuwał się pod zrzutem ekranu.

Na dardo.studio każda strona ma jeden element <main> i opisane landmarki <nav>. Przełączniki menu i motywu to prawdziwe przyciski, które informują o swoim stanie przez aria-expanded i aria-pressed, a zamknięte menu są inert. Każde pole formularza kontaktowego znajduje się wewnątrz swojego elementu <label>, co nadaje mu dostępną nazwę. web.dev zaleca atrybut for; objęcie pola etykietą działa tak samo.

To już dziś pomaga użytkownikom czytników ekranu, a to wystarczający powód.

Czysta kopia w markdownie każdej strony

Agenci płacą za każdy przeczytany token, a wyrenderowana strona niesie ze sobą nawigację, baner cookies, skrypty i grafiki dekoracyjne. Przed tą pracą żądanie naszych stron z nagłówkiem Accept: text/markdown zwracało to wszystko jako HTML.

Teraz etap budowania zapisuje plik index.md obok każdej indeksowalnej strony. Zaczyna się od front matter (tytuł, opis, kanoniczny adres URL, język, wersja w drugim języku i data aktualizacji), a potem zawiera treść z elementu <main> bez skryptów, przycisków, obrazów dekoracyjnych i spisu treści na stronie. Odpowiedzi z FAQ zostają. Formularze zamieniają się w listę pól i opcji, dzięki czemu agent może powiedzieć użytkownikowi, o co pyta nasz formularz kontaktowy, bez jego uruchamiania.

Kopię można pobrać na trzy sposoby:

  • Wyślij nagłówek Accept: text/markdown na zwykły adres URL. Takie odpowiedzi zawierają Vary: Accept, więc pamięci podręczne przechowują obie wersje osobno.
  • Poproś o plik: /en/services/seo/index.md.
  • Dodaj .md do ścieżki strony (/en/services/seo.md). Dla adresów kończących się ukośnikiem propozycja llms.txt używa index.md, czyli formy powyżej.

Każda strona HTML wskazuje też swoją kopię za pomocą <link rel="alternate" type="text/markdown">.

Wskazujemy wyszukiwarkom z powrotem wersję HTML

Z poradnika Google wynika, że może on skanować i indeksować wiele typów plików poza HTML, bez traktowania ich w szczególny sposób. Kopia w markdownie mogłaby konkurować z własną stroną, dlatego każda odpowiedź markdown wskazuje stronę HTML jako kanoniczną:

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

Kto czyta te kopie? Cloudflare stworzył Markdown for Agents, aby konwertować HTML na brzegu sieci dla żądań preferujących markdown, co sugeruje, że agenci o niego proszą. Nie podaje jednak, którzy klienci wysyłają ten nagłówek, a my również nie mamy zweryfikowanej listy. Jeśli korzystasz z funkcji Cloudflare, doda ona Content-Signal: ai-train=yes, search=yes, ai-input=yes, chyba że Twój serwer źródłowy ustawia własny. Nasze kopie generujemy podczas budowania, aby dokładnie odpowiadały stronie.

llms.txt: przydatny indeks bez wpływu na wyszukiwanie

llms.txt to propozycja Jeremy'ego Howarda, opublikowana po raz pierwszy we wrześniu 2024 r. i wciąż otwarta na uwagi społeczności: plik markdown pod adresem /llms.txt z nazwą witryny, krótkim streszczeniem i listami linków, które mogą się przydać agentowi.

Nasz, pod adresami /llms.txt i /es/llms.txt, jest generowany z tych samych danych co strony, więc nie może się z nimi rozjechać. Podaje fakty o studiu (Bogotá, założone w 2026 r., zespół trzech osób, sposób wyceny projektów, drogi kontaktu), wymienia usługi i realizacje oraz wyjaśnia, jak pobrać kopie w markdownie. llms-full.txt zawiera pełny tekst stron studia, usług, realizacji i kontaktu.

Jedna linijka wskazuje firmy o podobnych nazwach, które nie są nami. Gdy sprawdzaliśmy 2 października, to one prowadziły w wynikach wyszukiwania dla „dardo studio”. Ta linijka może być najprzydatniejsza w całym pliku.

Stan rzeczy, wprost:

  • Google twierdzi, że llms.txt nie jest potrzebny, by pojawiać się w Wyszukiwarce ani funkcjach AI, że Wyszukiwarka go ignoruje, a posiadanie go ani nie pomaga, ani nie szkodzi.
  • OpenAI, Anthropic i Perplexity nie podają w dokumentacji swoich robotów, że ich boty czytają pliki llms.txt innych witryn. Własne serwisy z dokumentacją OpenAI, Anthropic i Perplexity publikują taki plik, z myślą o agentach czytających ich dokumentację.

Warto go mieć, jeśli jest generowany i dokładny. Pomaga agentom programistycznym i narzędziom, które go szukają. Nie jest dźwignią widoczności.

Narzędzia, które agenci mogą wywoływać: MCP, A2A i katalog API

Opublikowaliśmy dwa narzędzia tylko do odczytu:

  • list_services zwraca nasze opublikowane usługi, ich zakres, rezultaty i adresy źródłowe po angielsku lub hiszpańsku, filtrowane opcjonalnym słowem kluczowym.
  • get_project_brief zwraca pytania, na które warto odpowiedzieć przed kontaktem z nami, oraz zlokalizowany link kontaktowy dla danej usługi.

Jedna implementacja stoi za kilkoma punktami wejścia:

Punkt wejściaAdres w dardo.studioStandard i status
Serwer MCP/mcp, karta pod /.well-known/mcp/server-card.jsonMCP Streamable HTTP; karta serwera to wstępna propozycja
Agent A2A/a2a, karta pod /.well-known/agent-card.jsonA2A 1.0, JSON-RPC
Punkt końcowy JSON/agent/services.json, opisany w OpenAPIZwykły HTTP
Katalog API/.well-known/api-catalogRFC 9727, ścieżka standaryzacji IETF

Każda odpowiedź HTML i markdown wysyła nagłówek Link wskazujący katalog, indeks umiejętności agentów i obie karty, więc z każdej strony można dojść do reszty.

Zasady projektowe, które byśmy powtórzyli

  • Tylko do odczytu i publiczne. Narzędzia MCP deklarują readOnlyHint: true i czytają ten sam opublikowany katalog co HTML, bez bazy danych w tle. get_project_brief niczego nie wysyła, nie rezerwuje ani nie wycenia; człowiek przegląda i wysyła.
  • Ograniczone dane wejściowe. Treść żądań jest ograniczona do 8 KiB, sprawdzamy nagłówki Origin z przeglądarki (wymaga tego specyfikacja MCP), a wywołania mają własny limit szybkości.
  • Bez stanu. Agent A2A odpowiada natychmiast, nie przechowuje zadań, ma wyłączone strumieniowanie i nie pobiera plików ani adresów URL, które mu wysłano.
  • Jasne zasady. /auth.md mówi, że nie są potrzebne żadne dane uwierzytelniające oraz że odczyt danych publicznych nie upoważnia do wysłania wiadomości ani dokonania płatności.

Coś też pominęliśmy. Skanery gotowości sprawdzają protokoły handlowe i wykrywanie OAuth. Niczego nie sprzedajemy przez kasę i nie chronimy żadnych zasobów, więc publikowanie tego opisywałoby możliwości, które nie istnieją.

Kto dziś korzysta z tych narzędzi: klienci MCP, które ktoś połączył z /mcp, oraz klienci A2A, którym podano naszą kartę. Dla studia wartość jest skromna: precyzyjna odpowiedź na pytanie „czym zajmuje się Dardo i co warto im wysłać?”. Dla witryny z danymi na żywo, o które ludzie pytają, takimi jak stan magazynowy, dostępność czy dokumentacja produktu, argumenty są mocniejsze. Agenci, którzy zapisują dane, potrzebują uwierzytelniania i etapów weryfikacji; to już praca z zakresu automatyzacji AI.

WebMCP: te same narzędzia w przeglądarce

WebMCP pozwala stronie rejestrować narzędzia, które może wywoływać agent AI w przeglądarce. To Draft Community Group Report grupy W3C Web Machine Learning Community Group i zastrzega, że nie jest standardem W3C. Według web.dev jest aktywnie rozwijany, może się zmienić i można go wypróbować w Chrome w ramach origin trial.

Nasze strony rejestrują te same dwa narzędzia przez document.modelContext (lub navigator.modelContext w starszych wersjach zapoznawczych). Bez tego API przeglądarka nie uruchamia niczego dodatkowego. Ponieważ narzędzia już istniały, zajęło to około 40 linijek. Traktuj to jako eksperyment.

Każda warstwa i czy warto się nią zajmować

WarstwaCo to jestKto z tego dziś korzystaCzy warto?
Semantyczny HTML i opisane formularzePrawdziwe przyciski, linki, landmarki i etykietyPrzeglądarki, technologie asystujące i agenci przeglądarkowiTak. Zacznij od tego
robots.txt dla wyszukiwarek i agentów użytkownikaReguły dla poszczególnych crawlerów, które oddzielają wyszukiwanie od trenowaniaOpenAI, Anthropic, Perplexity i Google opisują swoje tokeny w dokumentacjiTak. Potem przetestuj na poziomie CDN
Content SignalsPreferencje search, ai-input, ai-train w robots.txtŻadna z firm AI, które sprawdziliśmy, nie opisuje ich przestrzeganiaJedna linijka. Niczego nie oczekuj
Kopie w markdownie z nagłówkami canonicalCzysta wersja tekstowa każdej stronyAgenci, którzy żądają markdownu; brak opublikowanej listy, którzy toTak, z nagłówkiem canonical
llms.txt i llms-full.txtWyselekcjonowany indeks i pełny tekst dla agentówGoogle Search go ignoruje; żadna dokumentacja crawlerów nie twierdzi, że go czytaZostaw, jeśli jest generowany. To nie jest dźwignia widoczności
Serwer MCP (tylko do odczytu)Zadeklarowane narzędzia, które agenci mogą wywoływaćKlienci MCP, które ktoś podłączaTylko jeśli są dane lub akcje warte wywołania
Karta agenta A2AMaszynowo czytelny opis agentaKlienci A2A, którym ją wskazanoSpekulacyjne dla większości stron
Katalog API (RFC 9727)Jedna standardowa lista Twoich publicznych APINarzędzia, które jej szukająTanie, jeśli już masz API
WebMCPNarzędzia rejestrowane przez stronę w przeglądarceChrome, w ramach origin trialEksperyment

Co zbudowalibyśmy ponownie

Po kolei: semantyczny HTML, przetestowany dostęp dla crawlerów, kopie w markdownie z nagłówkami canonical, generowany llms.txt, a narzędzia tylko wtedy, gdy jest coś wartego wywołania. Potem mierz. Logi serwera pokazują, którzy agenci pobierają kopie markdown lub wywołują /mcp. Pobranie to nie cytowanie, a nic z tego nie gwarantuje, że system AI wspomni o Tobie.

Gotowość na agentów to część naszej pracy nad optymalizacją pod wyszukiwanie AI, obok treści i pomiarów, które decydują, czy odpowiedzi AI Cię cytują. Aby wdrożyć to na swojej stronie, opowiedz nam o projekcie.