Назад до журналу
6 хв читання

Стандартизація інтеграції ШІ за допомогою протоколу Model Context Protocol (MCP)

Практичний посібник зі створення та захисту користувацьких серверів MCP для безпечного підключення корпоративних даних до агентів-розробників ШІ.

AI AgentsMCPNode.jsEnterprise ArchitectureAPI Security
Стандартизація інтеграції ШІ за допомогою протоколу Model Context Protocol (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: Легковажний процес або служба, що надає три основні примітиви:
    1. Prompts: Шаблони багаторазового використання для керування взаємодією з моделлю.
    2. Resources: Джерела даних тільки для читання (вміст файлів, рядки бази даних, відповіді API).
    3. 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 --init

2. Реалізація сервера

Нижче наведено код для безпечного сервера 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, консольний помічник або автономний агент розгортання) зможе безпечно, передбачувано і без витрат на інтеграцію взаємодіяти з вашою бізнес-логикою.

Share this article