Глава 5

Запустите проверочный проект без API-ключей

Дальше вся книга опирается на один запускаемый проект, поэтому имеет смысл собрать его до того, как мы полезем в детали. Это строгий ESM-проект на TypeScript: он поднимает настоящий MCP stdio-процесс и локальный A2A HTTP-сервер, выполняет discovery и возвращает одинаковое решение по одному снимку релиза. Никакой магии и никаких заглушек - ровно та система, которую мы разбираем.

Запускается всё несколькими командами, и это стоит проделать прямо сейчас.

Bash
npm ci --ignore-scripts
npm run check

# Отдельно
npm run demo:mcp
npm run demo:a2a

Состав зависимостей зафиксирован, чтобы поведение воспроизводилось у всех одинаково - вот package.json целиком.

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/server 2.0.0, @modelcontextprotocol/client 2.0.0, @a2a-js/sdk 1.0.1, TypeScript 7.0.2. Перед новым production-релизом обновляйте осознанно и повторяйте contract tests.

Проект запускается - теперь разберём его по частям, начиная с того, как устроена сторона MCP.

Ссылки