К 2026 году Model Context Protocol (MCP) тихо стал стандартным способом подключать Claude к остальному стеку. Если вы до сих пор описываете инструменты вручную в каждом агенте, пишете JSON-схемы и вставляете документацию в system prompt, вы делаете двойную работу ради половины результата. Ниже по порядку: что такое MCP на деле, как написать рабочий сервер, как его выложить и как он уживается со шлюзом вроде codexkey.
Что такое MCP: коротко
MCP это открытый протокол Anthropic. Он определяет, как AI-приложение (клиент: Claude Desktop, Claude Code, OpenCode или ваш агент) общается с поставщиком возможностей (сервер: файловая система, Postgres, GitHub, внутренний API компании). Сервер выставляет три типа примитивов: tools (функции, которые можно вызвать), resources (данные для чтения) и prompts (шаблоны с параметрами). Клиент находит их во время работы и передаёт модели. Отдельной обвязки на каждую интеграцию и своей схемы под каждый проект не требуется.
Чем MCP лучше ручных описаний инструментов
Параметр 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:
- Авторизация на каждого клиента. Выдавайте токены с ограниченными правами. Один мастер-ключ на всех потребителей не годится. Ротируйте ключи.
- Права инструмента по вызывающему. Инструмент, который выводит все тикеты, опасен. Инструмент, который выводит тикеты аутентифицированного пользователя, нет. Передавайте identity в каждый вызов.
- Rate limit на уровне транспорта. Сломанный агент способен гонять инструмент в тугом цикле. Ограничьте число запросов в минуту на токен.
- Проверка каждого аргумента. Схемы Zod обязательны. Аргументы инструмента это недоверенный ввод, ведь модель можно джейлбрейком заставить выдать произвольный JSON.
- Лог каждого вызова. MCP это граница аудита между моделью и вашими данными. Пишите имя инструмента, аргументы, вызывающего и результат.
- Секреты не в ресурсах. Ресурсы читает модель, а всё, что выставлено ресурсом, может попасть в её ответ.
Готовые серверы, у которых стоит поучиться
Официальные серверы Anthropic и сообщества быстрее всего знакомят с идиомами:
- filesystem. Чтение и запись в изолированной директории. Эталон проверки путей.
- postgres. SQL только для чтения, схема базы отдаётся ресурсом.
- github. Issues, PR, поиск по коду. Хороший пример пагинации внутри ответов инструментов.
- stripe. Платежи и клиенты. Отлично показывает ограниченную авторизацию и идемпотентные операции.
- sentry. Issues и events. Показывает, как отдавать данные с временным окном именно инструментами, а не ресурсами.
Читайте их исходники: паттерны переиспользуются.
Как MCP работает через codexkey
Частый вопрос: нужно ли что-то особенное на стороне шлюза, чтобы пользоваться MCP-серверами? Нет, MCP целиком живёт на стороне клиента. Порядок такой:
- Ваш клиент (Claude Desktop, Claude Code, OpenCode или свой агент) подключается к одному или нескольким MCP-серверам.
- Клиент запрашивает у них список инструментов и ресурсов.
- Когда пользователь пишет сообщение, клиент отправляет обычный запрос
/v1/messagesв codexkey, а полеtools: [...]заполняет из MCP-серверов. - codexkey направляет запрос к Claude по нашему стандартному прайсу за токены (pay-per-token).
- Claude возвращает блок
tool_use. Вызов к MCP-серверу выполняет клиент, а не шлюз, и он же возвращает результат.
Иначе говоря, codexkey стоит на стороне модели, MCP на стороне harness, и друг другу они не мешают. Направьте MCP-клиент на Anthropic-совместимый base URL codexkey, наполните инструменты из любого MCP-сервера, и цена за токен останется предсказуемой.
Итог
В 2026 году MCP остаётся правильной абстракцией для подключения инструментов. Пишите серверы один раз, подключайте откуда угодно, а обвязку оставьте harness. Для локального сценария начните со stdio-сервера, а когда понадобится несколько пользователей, переезжайте на HTTP. Авторизацию, права и rate limits держите на сервере, там им место. После этого можно перестать изобретать схемы инструментов и выпускать продукт.