Стандартизация интеграции ИИ с помощью протокола Model Context Protocol (MCP)
Практическое руководство по созданию и защите пользовательских серверов MCP для безопасного подключения корпоративных данных к агентам-разработчикам ИИ.

Подключение больших языковых моделей (LLM) к внутренним источникам данных и системам исторически было фрагментированной и хаотичной задачей. Каждый инженерный проект в области ИИ обычно начинается с написания пользовательских оболочек API (wrappers), сопоставления схем JSON или создания проприетарного связующего кода в средах выполнения оркестратора для обработки вызовов инструментов.
Если вы переходите с OpenAI на Anthropic или ваши разработчики переходят с одной IDE с поддержкой ИИ на другую, вам часто приходится переписывать уровень интеграции с нуля.
Именно поэтому протокол Model Context Protocol (MCP), открытый стандарт, разработанный под руководством Anthropic, быстро набирает популярность. Подобно тому, как протокол Language Server Protocol (LSP) стандартизировал взаимодействие компиляторов с редакторами кода, MCP стандартизирует взаимодействие моделей ИИ с источниками данных и инструментами разработчика.
Перед вами практическое руководство по созданию, структурированию и защите пользовательского сервера MCP для безопасного предоставления корпоративных данных вашим ИИ-агентам.
Архитектура: разделение клиентов и серверов
Основным принципом проектирования MCP является разделение компонентов. Вместо жесткого кодирования интеграций API непосредственно в среду выполнения агента, MCP вводит клиент-серверную архитектуру:
[ AI Agent / IDE ] (MCP Client)
│
│ (JSON-RPC 2.0 over Stdio or SSE)
▼
[ Custom MCP Server ]
│
├─► Secure Database (PostgreSQL / BigQuery)
├─► Internal Microservices
└─► Local Development Tools- Клиент MCP: Координатор (например, Cursor, Windsurf или пользовательский оркестратор LangChain). Он управляет рассуждениями LLM, хранит контекст пользователя и инициирует запросы к инструментам.
- Сервер MCP: Легковесный процесс или служба, предоставляющая три основных примитива:
- Prompts: Шаблоны многократного использования для управления взаимодействием с моделью.
- Resources: Источники данных только для чтения (содержимое файлов, строки базы данных, ответы API).
- Tools: Исполняемые функции, которые могут выполнять операции или вызывать внешние API.
Создание пользовательского сервера MCP на TypeScript
Давайте создадим готовый к работе сервер MCP на Node.js с использованием официального TypeScript SDK. Этот сервер предоставит безопасный инструмент для поиска записей во внутренней базе данных (например, кандидатов или кейсов) со строгой валидацией аргументов во время выполнения.
1. Инициализация проекта
Сначала настройте проект TypeScript и установите необходимые зависимости:
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install --save-dev typescript @types/node
npx tsc --init2. Реализация сервера
Ниже приведен код для безопасного сервера MCP, работающего через stdio. Мы регистрируем инструмент поиска и используем zod для принудительной строгой валидации схем входящих запросов:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { z } from "zod";
// 1. Initialize the MCP Server
const server = new Server(
{
name: "enterprise-search-service",
version: "1.0.0",
},
{
capabilities: {
tools: {}, // Advertise tool capabilities to the client
},
}
);
// 2. Define the Search Schema using Zod
const CandidateSearchSchema = z.object({
query: z.string().min(2),
limit: z.number().optional().default(5),
department: z.enum(["Engineering", "Design", "Product", "Sales"]).optional(),
});
// 3. Register Available Tools
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "search_candidates",
description: "Search internal database for candidates matching specific skills and departments.",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "Search term or required skill" },
limit: { type: "number", description: "Maximum records to return" },
department: { type: "string", enum: ["Engineering", "Design", "Product", "Sales"] },
},
required: ["query"],
},
},
],
};
});
// Mock database resolver
async function queryDatabase(query: string, limit: number, dept?: string) {
// Real implementation would connect to Cloud SQL / BigQuery
return [
{ id: 101, name: "Sarah Connor", role: "Staff Platform Engineer", tags: ["Kubernetes", "Go", "MACH"] },
{ id: 102, name: "Marcus Wright", role: "Solutions Architect", tags: ["Next.js", "React", "AI Agents"] }
];
}
// 4. Handle Tool Executions
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name !== "search_candidates") {
throw new Error(`Tool ${request.params.name} not found`);
}
try {
// Validate the arguments at runtime
const args = CandidateSearchSchema.parse(request.params.arguments);
// Fetch secure records
const results = await queryDatabase(args.query, args.limit, args.department);
return {
content: [
{
type: "text",
text: JSON.stringify(results, null, 2),
},
],
};
} catch (error: any) {
return {
content: [
{
type: "text",
text: `Error validating arguments: ${error.message}`,
},
],
isError: true,
};
}
});
// 5. Start Server Transport (stdio is standard for local IDE integrations)
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Enterprise Search MCP Server running on stdio");Обеспечение безопасности для корпоративного использования
Хотя написание кода на TypeScript не представляет сложности, предоставление внутренних производственных данных моделям LLM требует строгих мер эксплуатационной безопасности. Модели ИИ склонны к галлюцинациям, инъекциям промптов и непреднамеренным циклам выполнения инструментов.
Вот четыре столпа корпоративной безопасности MCP:
1. Валидация схем и очистка входных данных
Никогда не доверяйте аргументам, сгенерированным LLM. Всегда проверяйте параметры с помощью библиотек, таких как Zod, и очищайте строки для предотвращения рисков баз данных:
- Используйте параметризованные запросы или ORM для предотвращения SQL-инъекций.
- Проверяйте пути к директориям для предотвращения уязвимостей обхода каталогов (directory traversal), если ваш инструмент читает локальные файлы.
2. Аутентификация и передача контекста OAuth
При работе в корпоративной сети необходимо проверять уровень авторизации пользователя, стоящего за агентом.
- Используйте транспорт Server-Sent Events (SSE) вместо stdio. Это позволяет запускать сервер MCP как независимый микросервис за шлюзом API Gateway.
- Передавайте токен идентификации пользователя (JWT) в заголовках запроса, позволяя серверу MCP применять безопасность на уровне строк (Row-Level Security - RLS) в целевой базе данных.
3. Участие человека в контуре принятия решений (Human-in-the-Loop - HITL)
Предоставление инструментов чтения (таких как search_candidates) связано с низким риском. Однако предоставление инструментов записи (таких как update_records или deploy_service) крайне опасно.
- Внедрите явные подтверждения для действий записи. Клиент MCP должен перехватывать запросы на запись и показывать разработчику diff-сравнение изменений, которые агент хочет применить.
[ Agent Tool Request ] ──► [ Security Middleware ] ──► (Diff Check / UI Popup)
│
┌──────────────────────────────────────────┘
▼
[ User Approves? ] ──(Yes)──► [ Execute Write on Server ]4. Ограничение частоты запросов и лимиты
Агенты могут входить в циклы рекурсивного рассуждения, вызывая инструмент десятки раз за несколько секунд, что приводит к огромной нагрузке на базу данных или высоким затратам на токены.
- Установите ограничение частоты запросов (rate limiting) на сессию.
- Ограничьте максимальный размер возвращаемых данных для предотвращения переполнения токенов.
Взгляд в будущее: Представление устаревших систем в виде примитивов ИИ
Сила протокола Model Context Protocol заключается в том, что он превращает устаревшие программные интерфейсы в понятные и легко обнаруживаемые возможности.
Оборачивая внутренние базы данных, сценарии развертывания и API в стандартизированный уровень MCP, вы гарантируете, что любой инструмент ИИ (будь то редактор типа Cursor, консольный помощник или автономный агент развертывания) сможет безопасно, предсказуемо и без затрат на интеграцию взаимодействовать с вашей бизнес-логикой.