Протокол начинается с сообщения, а не с SDK
SDK удобен, но он же и прячет протокол. Пока всё работает, разница незаметна; как только начинается отладка, вам нужно видеть то, что реально уходит по проводу: method, params, идентификатор, version metadata, HTTP-заголовки и ответ. Оба протокола используют один и тот же конверт - JSON-RPC 2.0, - и именно из-за этого сходства их легко перепутать. Поэтому полезно один раз посмотреть на сырые сообщения обоих.
Вот как MCP адресует конкретную возможность - вызывает инструмент по имени с аргументами и modern-метаданными редакции 2026-07-28.
{
"jsonrpc": "2.0",
"id": "req-42",
"method": "tools/call",
"params": {
"name": "review_release",
"arguments": {
"service": "web-portal",
"version": "2.4.0"
},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "release-host",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}А вот как A2A передаёт цель исполнителю - отправляет Message с ролью и частями, не называя ни функции, ни её аргументов.
{
"jsonrpc": "2.0",
"id": "req-43",
"method": "SendMessage",
"params": {
"message": {
"messageId": "msg-1",
"role": "ROLE_USER",
"parts": [
{
"text": "Проверь релиз web-portal@2.4.0"
}
]
},
"configuration": {
"acceptedOutputModes": [
"text/markdown",
"application/json"
]
}
}
}Общего у них действительно много: корреляция запроса и ответа по id, структурированные ошибки, транспорт поверх HTTP и возможность streaming. Но различие принципиальное и лежит не в конверте, а в семантике метода. MCP-метод адресует capability - "вызови вот этот инструмент вот с такими аргументами". A2A-операция меняет или читает состояние агентной задачи - "вот цель, веди её жизненный цикл". Один и тот же JSON-RPC описывает два разных мира.
JSON-RPC не делает протоколы взаимозаменяемыми. Одинаковая оболочка не означает одинаковые методы, capability negotiation, ошибки или жизненный цикл. Нельзя отправитьtools/callA2A-агенту илиSendMessageMCP-серверу.
Умение читать эти сообщения окупается сразу: почти любую проблему интеграции - не тот протокол, потерянные метаданные, неверный формат ответа - видно на wire-уровне раньше, чем в логах приложения. Дальше мы проследим, как из таких сообщений складывается один сквозной запрос через обе границы.