Блог

Що потрібно сайту для роботи з AI-агентами: нотатки зі створення dardo.studio

Ми зробили dardo.studio зрозумілим і доступним для виклику AI-агентами, крок за кроком. Ось що робить кожен рівень, хто задокументував його використання та які б ми створили знову.

Автор: Nicolás Cerón ·

Невеликий робот на колесах їде за малиновою напрямною лінією музейною галереєю вночі до освітленої скульптури.

Коротка відповідь

Сайт, готовий до роботи з AI-агентами, робить три речі. AI-агенти можуть до нього дістатися. Вони можуть прочитати його, не продираючись крізь меню, банери та скрипти. А там, де це доречно, можуть викликати кілька оголошених інструментів, а не вгадувати, яку кнопку натиснути.

Усе це ми впровадили в dardo.studio на початку жовтня 2026 року. Ось що ми запустили і наскільки велика частина цього, за документацією, використовується основними AI-платформами. Перевірено на живому сайті 8 жовтня 2026 року.

Підсумок менш захопливий, ніж у більшості чеклістів «готовності до AI». Найбільшу вагу мають найстаріші рівні: доступ для краулерів і чистий семантичний HTML. Копії в Markdown та llms.txt — дешеві зручності. MCP, A2A і WebMCP — справжні протоколи з робочими клієнтами, але жодна з документацій краулерів OpenAI, Anthropic, Perplexity чи Google, на які ми посилаємося, не описує, щоб їхні асистенти самостійно знаходили інструменти сайту.

Почніть з доступу: robots.txt і edge

У нашому 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 та grounding в інших продуктах Google. Він не впливає на включення чи ранжування в Google Search. (основні краулери Google)

Фетчери, що запускаються користувачем, — інша річ. OpenAI зазначає, що robots.txt може не застосовуватися до ChatGPT-User, адже ці запити ініціює людина. Perplexity-User і фетчери Google, що запускаються користувачем, зазвичай його ігнорують. Ці фетчери діють від імені однієї людини в реальному часі; де блокування працює, воно здебільшого лише не дає асистентові цієї людини прочитати вашу сторінку.

Наш файл не називає краулерів для навчання, тож вони підпадають під * і їм дозволено доступ. Це бізнес-рішення, і вендори документують його як окремий контроль: заблокувати GPTBot чи ClaudeBot — не те саме, що вийти з їхніх пошукових індексів.

Content Signals: один рядок, жодних зобов'язань

Рядок Content-Signal походить із Content Signals Policy від Cloudflare, яка називає три способи використання: search, ai-input (подання контенту моделі під час відповіді) та ai-train. Ми пропускаємо ai-train, що за цією політикою його ні дозволяє, ні обмежує. Cloudflare каже, що сигнали виражають побажання, нічого не блокують і можуть ігноруватися. Жодна зі згаданих тут сторінок про краулери їх не згадує. Це коштує один рядок; поки що нічого не очікуйте.

Перевіряйте edge, а не лише файл

robots.txt задає політику, а що станеться насправді, вирішує ваша CDN. Коли ми тестували 2 жовтня, Browser Integrity Check від Cloudflare відповідав 403 стандартному HTTP-клієнту Python (Python-urllib) та libwww-perl, хоча robots.txt дозволяв усе. Скрипти, які пишуть агенти для кодування, часто використовують стандартну бібліотеку Python без змін.

Ми додали правило конфігурації Cloudflare, яке робить виняток для запитів GET і HEAD до публічного контенту; /api/ і далі відповідає 403. Той самий огляд показав, що в наших файлах .txt не було charset, тому деякі клієнти читали «Bogotá» як «Bogotá». Виправлення — один заголовок: charset=utf-8.

Тестуйте реальними запитами під кожним user agent. Це показує, що ніщо не блокує саме це ім'я; це не доводить, що справжній краулер заходив.

Простий семантичний HTML: рівень, від якого залежить кожен агент

Посібник Google з оптимізації для AI описує агентів у браузері, які аналізують скриншоти, переглядають DOM та інтерпретують дерево доступності. Він відсилає власників сайтів до рекомендацій web.dev щодо дружності до агентів, які здебільшого стосуються доступності: використовуйте <button> і <a> замість стилізованих <div>, пов'язуйте кожну мітку з її полем і не допускайте зсуву макета під скриншотом.

На dardo.studio кожна сторінка має один <main> і підписані орієнтири <nav>. Перемикачі меню й теми — справжні кнопки, що повідомляють свій стан через aria-expanded і aria-pressed, а закриті меню мають inert. Кожне поле контактної форми розміщене всередині свого <label>, що дає йому доступну назву. web.dev радить атрибут for; обгортання поля виконує ту саму роль.

Це вже сьогодні допомагає користувачам екранних читачів, і цього достатньо.

Чиста копія кожної сторінки в Markdown

Агенти платять за кожен токен, який читають, а відрендерена сторінка містить навігацію, банер про cookie, скрипти й декоративну графіку. До цієї роботи запит наших сторінок із Accept: text/markdown повертав усе це як HTML.

Тепер на етапі збирання біля кожної індексованої сторінки створюється файл index.md. Він починається з front matter (заголовок, опис, канонічна URL-адреса, мова, версія іншою мовою та дата оновлення), а далі йде вміст елемента <main> сторінки без скриптів, кнопок, декоративних зображень і змісту сторінки. Відповіді з розділів FAQ залишаються. Форми перетворюються на список полів і варіантів вибору, тож агент може розповісти людині, про що запитує наша контактна форма, не торкаючись її.

Отримати копію можна трьома способами:

  • Надішліть Accept: text/markdown на звичайну URL-адресу. Такі відповіді містять Vary: Accept, тому кеші зберігають версії окремо.
  • Запросіть файл: /en/services/seo/index.md.
  • Додайте .md до шляху сторінки (/en/services/seo.md). Для URL-адрес, що закінчуються скісною рискою, пропозиція llms.txt використовує index.md, тобто форму, наведену вище.

Кожна HTML-сторінка також вказує на свою копію через <link rel="alternate" type="text/markdown">.

Спрямовуємо пошукові системи назад до HTML

У посібнику Google зазначено, що він може сканувати та індексувати багато типів файлів, окрім HTML, і не ставиться до них особливо. Копія в 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, щоб на периферії конвертувати HTML для запитів, які віддають перевагу markdown, а це натякає, що агенти такі запити надсилають. Вона не називає, які клієнти надсилають цей заголовок, і в нас також немає перевіреного списку. Якщо ви користуєтеся функцією Cloudflare, вона додає Content-Signal: ai-train=yes, search=yes, ai-input=yes, якщо ваш початковий сервер не задає власного значення. Ми генеруємо свої копії під час збирання, щоб вони точно відповідали сторінці.

llms.txt: корисний індекс, який не впливає на пошук

llms.txt — це пропозиція Джеремі Говарда, уперше опублікована у вересні 2024 року й досі відкрита для відгуків спільноти: файл markdown за адресою /llms.txt з назвою сайту, коротким описом і списками посилань, які можуть знадобитися агенту.

Наш файл, доступний за адресами /llms.txt і /es/llms.txt, генерується з тих самих даних, що й сторінки, тому розбіжностей не буде. У ньому наведено факти про студію (Богота, заснована 2026 року, команда з трьох людей, як формується вартість проєктів, способи зв'язку), перелічено послуги та роботи й пояснено, як отримати копії в markdown. llms-full.txt містить повний текст сторінок студії, послуг, робіт і контактів.

В одному рядку названо підприємства зі схожими назвами, які не маємо до нас стосунку. Коли ми перевіряли 2 жовтня, саме вони були першими в результатах пошуку за запитом "dardo studio". Цей рядок, можливо, найкорисніший у файлі.

Стан справ, коротко й прямо:

  • Google заявляє, що llms.txt не потрібен, щоб з'являтися в Пошуку чи його AI-функціях, що Пошук його ігнорує, а наявність такого файлу не допомагає і не шкодить.
  • OpenAI, Anthropic і Perplexity у документації своїх краулерів не повідомляють, що їхні боти читають llms.txt чужих сайтів. Водночас документаційні сайти OpenAI, Anthropic і Perplexity самі публікують такий файл для агентів, які читають їхню документацію.

Тримайте його, якщо він генерується автоматично й точний. Він допомагає агентам для програмування та інструментам, які його шукають. Але це не важіль видимості.

Інструменти, які можуть викликати агенти: MCP, A2A і каталог API

Ми опублікували два інструменти лише для читання:

  • list_services повертає наші опубліковані послуги, обсяг робіт, результати та URL-адреси джерел англійською або іспанською, із фільтром за необов'язковим ключовим словом.
  • 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 Standards Track

Кожна відповідь у HTML і markdown надсилає заголовок Link, що вказує на каталог, індекс навичок агентів і обидві картки, тож будь-яка сторінка веде до решти.

Правила дизайну, які ми б повторили

  • Лише читання й публічність. Інструменти MCP оголошують readOnlyHint: true і читають той самий опублікований каталог, що й HTML, без бази даних за ними. get_project_brief нічого не надсилає, не бронює й не розраховує вартість; людина переглядає й надсилає сама.
  • Обмежений вхід. Тіла запитів обмежені 8 KiB, заголовки Origin браузера перевіряються (цього вимагає специфікація MCP), а виклики мають власне обмеження частоти.
  • Без стану. Агент A2A відповідає одразу, не зберігає завдань, має вимкнену потокову передачу й не завантажує файли чи URL-адреси, які йому надсилають.
  • Зрозумілі умови. /auth.md повідомляє, що облікові дані не потрібні й що читання публічних даних не дає права надсилати повідомлення чи здійснювати платіж.

Дещо ми також свідомо не робили. Сканери готовності перевіряють наявність протоколів комерції та OAuth discovery. Ми нічого не продаємо через касу й не захищаємо жодних ресурсів, тож публікація цього описувала б можливості, яких не існує.

Хто користується цими інструментами сьогодні: клієнти MCP, які хтось підключив до /mcp, і клієнти A2A, яким дали нашу картку. Для студії цінність скромна: точна відповідь на запитання "чим займається Dardo і що йому надіслати?" Для сайту з актуальними даними, про які запитують, наприклад про залишки, наявність чи документацію до продукту, аргументи переконливіші. Агентам, які записують дані, потрібні автентифікація та етапи перевірки; це вже робота з автоматизації на основі ШІ.

WebMCP: ті самі інструменти всередині браузера

WebMCP дає змогу сторінці реєструвати інструменти, які може викликати AI-агент у браузері. Це Draft Community Group Report спільноти W3C Web Machine Learning Community Group, і в ньому зазначено, що він не є стандартом W3C. web.dev повідомляє, що він активно розробляється, може змінитися, а спробувати його можна в Chrome через origin trial.

Наші сторінки реєструють ті самі два інструменти через document.modelContext (або navigator.modelContext у старіших превʼю). Без цього API браузер не виконує нічого зайвого. Оскільки інструменти вже існували, на це пішло близько 40 рядків. Сприймайте це як експеримент.

Кожен рівень і чи варто він зусиль

РівеньЩо цеХто читає його сьогодніЧи варто?
Семантичний HTML і підписані формиСправжні кнопки, посилання, ландмарки та підписиБраузери, допоміжні технології та браузерні агентиТак. Починайте з нього
robots.txt для пошукових і користувацьких агентівПравила для кожного краулера, що відокремлюють пошук від навчанняOpenAI, Anthropic, Perplexity і Google документують свої токениТак. Потім перевірте на рівні CDN
Content SignalsНалаштування search, ai-input, ai-train у robots.txtЖодна з перевірених нами AI-компаній не документує їх дотриманняОдин рядок. Не чекайте нічого
Markdown-копії з канонічними заголовкамиЧиста текстова версія кожної сторінкиАгенти, що запитують markdown; публічного списку таких немаєТак, із канонічним заголовком
llms.txt і llms-full.txtДобірний індекс і повний текст для агентівGoogle Search його ігнорує; жодна документація краулерів не заявляє, що читає йогоЗалиште, якщо він генерується. Це не важіль видимості
MCP-сервер (лише читання)Оголошені інструменти, які можуть викликати агентиMCP-клієнти, які підключає людинаЛише якщо є дані або дії, які варто викликати
A2A agent cardМашинозчитуване опис агентаA2A-клієнти, спрямовані на ньогоДля більшості сайтів спекулятивно
Каталог API (RFC 9727)Єдиний well-known список ваших публічних APIІнструменти, що його шукаютьНедорого, якщо API вже є
WebMCPІнструменти, які сторінка реєструє в браузеріChrome, через origin trialЕксперимент

Що б ми зробили знову

По черзі: семантичний HTML, перевірений доступ краулерів, markdown-копії з канонічними заголовками, згенерований llms.txt і інструменти лише тоді, коли є що викликати. Потім вимірюйте. Серверні логи показують, які агенти завантажують markdown-копії або викликають /mcp. Завантаження — це не цитування, і ніщо з цього не гарантує, що AI-система згадає вас.

Готовність до агентів — частина нашої роботи з оптимізації для AI-пошуку, поряд із контентом і вимірюванням, які визначають, чи цитують вас AI-відповіді. Щоб впровадити це на вашому сайті, розкажіть нам про проєкт.