Начните с актуального MCP TypeScript SDK v2
SDK экономит время ровно до тех пор, пока вы берёте актуальную его версию. В stable v2 клиент и сервер разделены на отдельные пакеты, а для runtime-валидации и генерации JSON Schema используется Zod 4. Главная ошибка на старте - перенести импорты и initialization flow из туториала 2025 года: API SDK меняется быстрее, чем идея протокола, и старый код молча соберётся, но будет говорить на другой редакции.
Для нового проекта установка выглядит так - именно раздельными пакетами.
npm install @modelcontextprotocol/server@2 zod@4
npm install @modelcontextprotocol/client@2
npm install -D typescript tsx @types/nodeА создание серверного объекта - так: имя, версия и краткие instructions, которые задают серверу его узкую роль.
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/server";
import { serveStdio } from "@modelcontextprotocol/server/stdio";
import * as z from "zod/v4";
import {
getReleaseSnapshot,
getRunbook,
listReleaseSnapshots,
reviewRelease,
searchRunbooks
} from "../domain/release-knowledge.js";
export function createDeveloperMcpServer(): McpServer {
const server = new McpServer(
{ name: "developer-release-mcp", version: "1.0.0" },
{ instructions: "Use release resources as evidence. Never invent a release snapshot." }
);Чтобы не тащить старые рефлексы, полезно держать перед глазами, что именно поменялось и почему это важно.
Старый рефлекс · Текущий подход · Почему важно
- Один пакет
@modelcontextprotocol/sdk- Раздельные@modelcontextprotocol/serverи/client; Меньше поверхность и яснее зависимости - Код из произвольного блога - Official examples той же major version; API SDK меняется быстрее идеи протокола
- Считать initialize вечной схемой - Явно проверить modern/legacy era; Редакция 2026-07-28 изменила lifecycle
anyвокруг handlers - Zod schema и строгие inferred types; Wire input является недоверенным
Каждая строка таблицы - это ловушка, в которую легко попасть по инерции. Один пакет @modelcontextprotocol/sdk превратился в раздельные server и client - меньше поверхность и яснее зависимости. Код из случайного блога стоит заменить официальными примерами той же мажорной версии. А привычку считать initialize вечной схемой придётся оставить: редакция 2026-07-28 изменила сам lifecycle, и это мы разберём отдельной главой.
В книге показана modern era. Companion-клиент включает versionNegotiation: { mode: "auto" }, а stdio-сервер запускается через helper, который умеет обслуживать и современных, и legacy-пиров. Проверяйте согласованную редакцию прямо в integration-тесте - это дешёвая страховка от "тихой" несовместимости.Инструменты на месте - пишем первый сервер. И начнём с того, что делает сервер узким и предсказуемым: с домена.