Машинный слой
Всё, что есть на сайте, ваш агент может прочитать программно — без скрейпинга и без ключей. Курсы, разборы и страницы отдаются через MCP и A2A; результаты поиска и карточки курсов содержат ссылку на страницу, где то же самое видно человеку. Здесь ничего не пишется и не меняется: слой только читает.
Какой протокол брать. MCP — если IDE или чат с MCP-клиентом: Claude Code, Codex, Cursor — агент сам вызывает инструменты. A2A — если один агент разговаривает с другим: отправляет сообщение и получает ответ. У A2A два «биндинга» — два способа доставить одно и то же сообщение:JSON-RPC одним вызовом или HTTP+JSON обычным REST-запросом; агент за ними один.
Это точка входа, а не спецификация: формы запросов — вспецификации MCP и спецификации A2A; сигнатуры инструментов агент получит сам через tools/list.
/mcpPOSTMCP 2025-06-18 · Streamable HTTP, JSON-RPC. Обязательные заголовки: Content-Type: application/json, Accept: application/json, text/event-stream. Ответ: text/event-stream. Первый вызов: initialize. без заголовка Accept сервер отвечает 406; ответ приходит потоком даже на одиночный вызов. GET /mcp → 405./a2aPOSTA2A 1.0 · JSON-RPC. Обязательные заголовки: Content-Type: application/json, A2A-Version: 1.0. Ответ: application/json. Первый вызов: SendMessage. без заголовка A2A-Version сервер отвечает 400. GET /a2a → 404./a2a/rest/v1/message:sendPOSTA2A 1.0 · HTTP+JSON. Обязательные заголовки: Content-Type: application/json, A2A-Version: 1.0. Ответ: application/json. POST идёт на полный путь операции, а не на базовый; без A2A-Version — 400. GET /a2a/rest → 404./.well-known/agent-card.jsonGETA2A · JSON, discovery. с неё начинает клиент A2A; стандартные поля карточки не объявляют MCP — он опубликован отдельно, здесь и в llms.txt.search_siteпоиск по разделам курсов, абзацам статей и страницам; каждый результат — с цитатой и адресом раздела (#id)list_coursesкаталог курсов, необязательный фильтр по семействуget_courseописание, разделы и FAQ одного курса по slugget_passageодна единица цитирования целиком по unit_id: текст, адрес с якорем, происхождение, соседиaicoding://site/indexресурс · индекс публичного содержимого целиком, JSONtools/list, и второй список разошёлся бы с первым.claude mcp add --transport http aicoding https://aicoding.space/mcpAccept сервер ответит 406:curl -X POST https://aicoding.space/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}'text/event-stream, даже на одиночный вызов. Так он выглядел 2026-09-15 — это проверенный пример, а не живой вызов:event: message
data: {"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{"listChanged":true},"resources":{"listChanged":true}},"serverInfo":{"name":"aicoding-space","version":"1.1.0"}},"jsonrpc":"2.0","id":1}A2A начинайте с карточки агента: она перечисляет оба биндинга машиночитаемо. MCP опубликован отдельно — здесь и в llms.txt.src/data/agent-surface.json