К 2026 году Model Context Protocol (MCP) тихо стал стандартом подключения Claude ко всему остальному стеку. Если вы до сих пор прописываете кастомные определения инструментов в каждом агенте, руками пишете JSON-схемы и вставляете документацию в system prompt — вы делаете двойную работу за половину результата. Этот гайд разбирает, что такое MCP на самом деле, как написать рабочий сервер, как его задеплоить и как он сочетается с гейтвеем вроде Claudexia.
Что такое MCP в одном абзаце
MCP — открытый протокол от Anthropic, который стандартизирует, как AI-приложение (клиент: Claude Desktop, Claude Code, OpenCode, ваш собственный агент) общается с внешним поставщиком возможностей (сервер: файловая система, Postgres, GitHub, ваш внутренний API). Сервер выставляет три типа примитивов — tools (вызываемые функции), resources (читаемые данные) и prompts (параметризованные шаблоны) — поверх транспорта. Клиент находит их в рантайме и передаёт модели. Всё. Никакой кастомной обвязки на каждую интеграцию и никаких схем под каждый проект.
Почему это лучше, чем сырые tool definitions
Можно совершенно спокойно вызывать параметр tools у Claude напрямую,
с вручную написанными JSON-схемами. Так делали два года. Работает. Но
оно не масштабируется в рамках организации:
- Каждое приложение пишет одни и те же пять инструментов. Файловая система, поиск, БД, тикеты, календарь — каждая команда делает свою версию с чуть разными параметрами и своим набором багов.
- Схемы инструментов лежат внутри кода приложения. Поменять параметр — передеплоить всех потребителей.
- Нет discovery. Новый агент не знает, какие инструменты в организации уже есть. С MCP он просто запрашивает их у сервера.
- Аутентификация и rate limits размазаны по приложениям. С MCP они живут на сервере.
MCP превращает интеграцию в сервис. Написал один раз — подключай откуда угодно.
Архитектура
MCP-сервер — это процесс (локальный или удалённый), который говорит на проводном протоколе MCP поверх транспорта. Два транспорта, которые имеют значение в 2026:
- stdio — сервер является дочерним процессом клиента. Используется для локальных серверов (файловая система, локальный git, данные десктопного приложения). Никакой сети, никакой аутентификации, максимально быстрый старт.
- Streamable HTTP — сервер является долгоживущим HTTP-сервисом. Используется для всего, что многопользовательское или хостится (ваш SaaS, общий внутренний API, сторонние интеграции). Поддерживает заголовки авторизации, SSE-стриминг и горизонтальное масштабирование как любой веб-сервис.
Клиент держит сессию, перечисляет возможности (tools/list,
resources/list, prompts/list) и вызывает их по необходимости. Сама
модель не говорит на MCP — этим занимается harness. С точки зрения
модели это обычные инструменты.
Минимальный MCP-сервер на TypeScript
Ставим официальный SDK:
npm install @modelcontextprotocol/sdk zod
Сервер с одним инструментом (add) и одним ресурсом (config://app):
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "demo-server",
version: "1.0.0",
});
server.tool(
"add",
"Сложить два числа и вернуть сумму.",
{ a: z.number(), b: z.number() },
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }],
}),
);
server.resource(
"config",
"config://app",
async (uri) => ({
contents: [{
uri: uri.href,
text: JSON.stringify({ env: "prod", region: "eu" }),
}],
}),
);
const transport = new StdioServerTransport();
await server.connect(transport);
Это полностью соответствующий спецификации MCP-сервер. Сохраняем как
server.ts, компилируем — и его можно подключать к любому
MCP-совместимому клиенту.
Как протестировать
Три клиента, три конфига:
Claude Desktop — правим claude_desktop_config.json:
{
"mcpServers": {
"demo": {
"command": "node",
"args": ["/abs/path/to/server.js"]
}
}
}
Перезапускаем Claude Desktop. Инструмент появляется в меню.
Claude Code — claude mcp add demo node /abs/path/to/server.js.
Внутри сессии /mcp показывает подключённые серверы.
OpenCode — добавляем в opencode.json:
{
"mcp": {
"demo": {
"type": "local",
"command": ["node", "/abs/path/to/server.js"]
}
}
}
Во всех трёх спрашиваем модель "сколько будет 2 + 3?" — она вызовет
ваш add. Добро пожаловать в MCP.
Деплой как удалённый HTTP MCP-сервер
Для всего многопользовательского переключаемся на Streamable HTTP. Меняем транспорт:
import express from "express";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
const app = express();
app.use(express.json());
app.post("/mcp", async (req, res) => {
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: () => crypto.randomUUID(),
});
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
});
app.listen(3000);
Ставим за обычный балансировщик, терминируем TLS, добавляем auth-middleware, который валидирует bearer-токен на каждого тенанта — и получаем продакшн MCP-сервер. Клиенты подключаются так:
{
"mcpServers": {
"demo": {
"url": "https://mcp.example.com/mcp",
"headers": { "Authorization": "Bearer ..." }
}
}
}
Безопасность: то, о чём все забывают
MCP-серверы выполняются с вашими учётными данными. Относитесь к ним как к любой другой API:
- Авторизация на клиента. Выдавайте scoped-токены. Не используйте один мастер-ключ для всех потребителей. Ротируйте.
- Скоупьте инструменты по вызывающей стороне. Инструмент, выводящий все тикеты, опасен; инструмент, выводящий тикеты аутентифицированного пользователя, — нет. Прокидывайте identity через каждый вызов.
- Rate limit на транспорте. Сломанный агент может молотить инструмент в тугом цикле. Ограничивайте RPM на токен.
- Валидируйте каждый аргумент. Zod-схемы не опциональны. Относитесь к аргументам инструмента как к недоверенному вводу — по сути это так и есть, модель можно заджейлбрейкнуть на произвольный JSON.
- Логируйте каждый вызов. MCP — это audit boundary между моделью и вашими данными. Логируйте имя инструмента, аргументы, вызывающего и результат.
- Никаких секретов в ресурсах. Ресурсы читает модель. Всё, что вы выставили как ресурс, может оказаться в ответе.
Реальные примеры, у которых стоит подсмотреть
Официальные серверы Anthropic и сообщества — самый быстрый способ освоить идиомы:
- filesystem — sandbox-чтение/запись в директории. Эталон по валидации путей.
- postgres — read-only SQL с интроспекцией схемы как ресурсом.
- github — issues, PR, code search. Хороший пример пагинации внутри ответов инструментов.
- stripe — платежи и клиенты. Отличный пример scoped auth и идемпотентных операций.
- sentry — issues и events. Показывает, как выставлять данные с временным окном именно как tools, а не resources.
Читайте их исходники. Паттерны переиспользуемы.
Как это работает через Claudexia
Частый вопрос: нужно ли что-то особенное на стороне гейтвея, чтобы использовать MCP-серверы? Нет. MCP — это клиентская история. Поток такой:
- Ваш клиент (Claude Desktop, Claude Code, OpenCode, ваш агент) подключается к одному или нескольким MCP-серверам.
- Клиент перечисляет их инструменты и ресурсы.
- Когда пользователь шлёт сообщение, клиент отправляет обычный
/v1/messagesв Claudexia сtools: [...], наполненным из MCP-серверов. - Claudexia маршрутизирует запрос к Claude по нашему стандартному pay-per-token прайсу.
- Claude возвращает блок
tool_use. Клиент — не гейтвей — выполняет вызов против MCP-сервера и возвращает результат.
Иначе говоря, Claudexia стоит на стороне модели, а MCP — на стороне harness. Они композируются чисто. Направьте MCP-совместимый клиент на Anthropic-совместимый base URL Claudexia, наполните инструменты из любого MCP-сервера — и цена остаётся предсказуемой за токен.
Итог
MCP — правильная абстракция для интеграции инструментов в 2026. Пишите серверы один раз, подключайте откуда угодно, дайте harness заниматься обвязкой. Начните со stdio-сервера для локального воркфлоу, переезжайте на HTTP, когда нужны несколько пользователей, и держите авторизацию, скоупы и rate limits на сервере, где им и место. После этого перестаньте переизобретать схемы инструментов и шипите.