Блог

Что нужно сайту, готовому к работе с ИИ-агентами: заметки о создании dardo.studio

Мы сделали dardo.studio доступным для чтения и вызова ИИ-агентами, слой за слоем. Рассказываем, что делает каждый слой, кто читает его по документации сегодня и какие слои мы бы построили снова.

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

Небольшой колёсный робот едет по малиновой направляющей линии через музейный зал ночью к освещённой скульптуре.

Короткий ответ

Сайт, готовый к работе с ИИ-агентами, делает три вещи. ИИ-агенты могут до него добраться. Они могут прочитать его, не продираясь через меню, баннеры и скрипты. А там, где это уместно, они могут вызывать несколько объявленных инструментов вместо того, чтобы гадать, какую кнопку нажать.

Все три возможности мы внедрили в dardo.studio в начале октября 2026 года. Ниже рассказываем, что мы запустили и в какой мере крупные ИИ-платформы документально подтверждают их использование; проверка на работающем сайте проведена 8 октября 2026 года.

Вывод получился скромнее, чем в большинстве чек-листов «готовности к ИИ». Больше всего значат самые старые слои: доступ для краулеров и чистый семантический HTML. Копии в markdown и llms.txt — недорогое удобство. MCP, A2A и WebMCP — настоящие протоколы с работающими клиентами, но ни в одной документации краулеров OpenAI, Anthropic, Perplexity и Google, на которую мы ссылаемся, не описано, чтобы их ассистенты сами находили инструменты сайта.

Начнём с доступа: robots.txt и граница сети

В нашем robots.txt одна и та же группа правил повторяется для агента по умолчанию (*) и для каждого названного нами поискового ИИ-краулера и пользовательского загрузчика:

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. На включение в Google Поиск и ранжирование он не влияет. (общие краулеры 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 подчёркивает, что сигналы выражают предпочтения, ничего не блокируют и могут игнорироваться. Ни на одной из процитированных здесь страниц о краулерах они не упоминаются. Это стоит одной строки; пока ничего не ждите.

Проверяйте границу сети, а не только файл

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

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

Проверяйте реальными запросами под каждым user agent. Так видно, что имя ничто не блокирует, но это не доказывает, что настоящий краулер заходил на сайт.

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

В руководстве Google по оптимизации для ИИ описаны браузерные агенты, которые анализируют скриншоты, изучают 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, если ваш origin не задаёт свой. Свои копии мы генерируем при сборке, чтобы они точно совпадали со страницей.

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 КиБ, заголовки Origin из браузера проверяются (этого требует спецификация MCP), а у вызовов есть собственное ограничение частоты.
  • Без состояния. A2A-агент отвечает сразу, не хранит задачи, не использует потоковую передачу и не загружает присланные ему файлы или URL.
  • Понятные условия. В /auth.md сказано, что учётные данные не нужны и что чтение публичных данных не даёт права отправлять сообщения или совершать платежи.

Кое-что мы намеренно не стали делать. Сканеры готовности проверяют наличие протоколов для коммерции и OAuth discovery. Мы ничего не продаём через корзину и не защищаем никаких ресурсов, поэтому их публикация описывала бы несуществующие возможности.

Кто пользуется этими инструментами сегодня: MCP-клиенты, которые кто-то подключил к /mcp, и A2A-клиенты, которым передали нашу карточку. Для студии польза скромная: точный ответ на вопрос «чем занимается Dardo и что им отправить?». Для сайта с актуальными данными, о которых спрашивают, например с остатками, наличием или документацией по продуктам, довод сильнее. Агентам, которые записывают данные, нужны аутентификация и этапы проверки; это уже работа по автоматизации с помощью ИИ.

WebMCP: те же инструменты внутри браузера

WebMCP позволяет странице регистрировать инструменты, которые может вызывать ИИ-агент в браузере. Это 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Ни одна из проверенных нами ИИ-компаний не документирует их соблюдениеОдна строка. Ничего не ждите
Markdown-копии с каноническими заголовкамиЧистая текстовая версия каждой страницыАгенты, запрашивающие markdown; списка таких агентов нетДа, с каноническим заголовком
llms.txt и llms-full.txtОтобранный индекс и полный текст для агентовGoogle Search его игнорирует; в документации краулеров о его чтении не заявленоОставьте, если он генерируется. Видимость он не повышает
MCP-сервер (только чтение)Объявленные инструменты, которые могут вызывать агентыMCP-клиенты, которые подключает человекТолько если есть данные или действия, ради которых стоит вызов
Карточка агента A2AМашиночитаемое описание агентаКлиенты A2A, настроенные на неёДля большинства сайтов — гадание на будущее
Каталог API (RFC 9727)Один стандартный список ваших публичных APIИнструменты, которые его ищутНедорого, если API уже есть
WebMCPИнструменты, которые страница регистрирует в браузереChrome, в рамках origin trialЭксперимент

Что мы бы построили снова

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

Готовность к агентам — часть нашей работы по оптимизации для ИИ-поиска наряду с контентом и измерениями, от которых зависит, цитируют ли вас ответы ИИ. Чтобы внедрить это на вашем сайте, расскажите нам о проекте.