Запустите проверочный проект без API-ключей
Дальше вся книга опирается на один запускаемый проект, поэтому имеет смысл собрать его до того, как мы полезем в детали. Это строгий ESM-проект на TypeScript: он поднимает настоящий MCP stdio-процесс и локальный A2A HTTP-сервер, выполняет discovery и возвращает одинаковое решение по одному снимку релиза. Никакой магии и никаких заглушек - ровно та система, которую мы разбираем.
Запускается всё несколькими командами, и это стоит проделать прямо сейчас.
npm ci --ignore-scripts
npm run check
# Отдельно
npm run demo:mcp
npm run demo:a2aСостав зависимостей зафиксирован, чтобы поведение воспроизводилось у всех одинаково - вот package.json целиком.
{
"name": "mcp-a2a-protocols-2026-project",
"version": "1.0.0",
"private": true,
"type": "module",
"engines": {
"node": ">=24.0.0"
},
"scripts": {
"build": "tsc -p tsconfig.json",
"typecheck": "tsc -p tsconfig.json --noEmit",
"test": "node --import tsx --test tests/*.test.ts",
"demo:mcp": "node --import tsx src/mcp/client.ts",
"demo:a2a": "node --import tsx src/a2a/demo.ts",
"demo": "npm run demo:mcp && npm run demo:a2a",
"check": "npm run typecheck && npm test && npm run demo"
},
"dependencies": {
"@a2a-js/sdk": "1.0.1",
"@modelcontextprotocol/client": "2.0.0",
"@modelcontextprotocol/server": "2.0.0",
"express": "5.2.1",
"zod": "4.4.3"
},
"devDependencies": {
"@types/express": "5.0.6",
"@types/node": "26.1.2",
"tsx": "4.23.1",
"typescript": "7.0.2"
}
}Файлы разложены по границам, которые мы уже обсудили: домен отдельно, MCP-слой отдельно, A2A-слой отдельно, тесты рядом.
src/
domain/release-knowledge.ts
mcp/server.ts
mcp/client.ts
a2a/release-agent.ts
a2a/server.ts
a2a/demo.ts
tests/
domain.test.ts
mcp.integration.test.ts
a2a.integration.test.ts
package-lock.jsonЗа этой раскладкой стоят три сознательных решения. Первое: 14 контрактных тестов проверяют домен, discovery, метаданные schema, MCP-вызовы, Agent Card и оба исхода Task - input-required и completed. Второе: два E2E гоняют настоящие транспорты - дочерний stdio-процесс MCP и временный HTTP-порт A2A, а не вызовы функций в памяти; только так проверяется framing и завершение соединения. Третье: ноль ключей - модель не нужна, поэтому тест доказывает протокол и код, а не случайное качество LLM.
Почему здесь нет облачной модели. MCP и A2A - это контракты между программами. LLM можно добавить в host или AgentExecutor, не меняя transport и публичные типы. Сначала полезно доказать protocol plumbing отдельно от reasoning: так вы точно знаете, что ломается - протокол или модель.
И честная оговорка про версии, без которой книга по живым протоколам быстро устареет.
Версии - снимок на 01.08.2026.@modelcontextprotocol/server2.0.0,@modelcontextprotocol/client2.0.0,@a2a-js/sdk1.0.1, TypeScript 7.0.2. Перед новым production-релизом обновляйте осознанно и повторяйте contract tests.
Проект запускается - теперь разберём его по частям, начиная с того, как устроена сторона MCP.