Галоўная / Артыкулы

MCP для пачаткоўцаў: сервер і кліент, а потым — карпаратыўны ўзровень

MCP для пачаткоўцаў: праблема N × M, асноўныя ідэі простымі словамі, сервер і кліент службы падтрымкі на TypeScript у Node.js і крок да бяспечнага разгортвання па HTTP.

Выдавец: REACTAPP.TOP14 хв чытання3185 слоў

Крыніцы: MCP Tools Inside Enterprise Applications: A Beginner-Friendly Deep Dive

Кожны, хто неяк дзеўна працаваў з агентамі AI, стаў сацвяржаны з MCP — Model Context Protocol. Ён выкорыстоўваецца ў Claude Desktop, у плагінах IDE, у внутрасоцейных праектах „AI portal“ і, ўсё чым большай меры, у прымэтнай корпаратыўнай програмнай апаратнай сяродзе.

Этае ўводнае выясненне для пачаткуюцых, дзе не выклікаецца наявнасць практычнага дазвілу на MCP. У яму спачатку розглядаецца проблема, якую рашае протакол, пасля чаго аналізуецца яго архітэктура, ствараюцца рэальны сервер і кліент на TypeScript у сяродзе Node.js, а потым розглядаюцца аспекты безпекі, керавання і стварэння можлівасцяў аналізу, якія корпарацыі прыменяюць да всіх эых элементаў. Дыяграмы выкладзеныя у фармаце простага тэксту ASCII, таму іх можна без проблем скопіраваць у нотаткі або дакументацыю да коду.

1. Проблема, якую рашае MCP

Даўнае раней MCP, каб агент могаў выконваць рэальныя задачы, такія як чытанне запісаў у CRM, адкрыванне заявкі ў ITSM чы адзыскванне даных у складзе, гэта значыла адно: пісаць спецыяльны, ексклюзыўны код для інтэграціі як для таго агента, так і для таго сістэмы.

Гэта было прыемна, пакуль існавала толькі калькі агентоў (бот для падтрымкі, асістэнт для кодавання, внутрашній помачнік з ведамасцямі) і калькі сістэм (Salesforce, Jira, база дадзеных для кадраў, склад). У выніку стварвалася велічазная колькасць ручна створаных канектараў.

BEFORE MCP — the N x M integration problem

  ┌───────────┐        ┌─────────────┐
  │  Agent A  │───────▶│  CRM API    │  (custom connector #1)
  └───────────┘        └─────────────┘
  ┌───────────┐        ┌─────────────┐
  │  Agent A  │───────▶│  Ticketing  │  (custom connector #2)
  └───────────┘        └─────────────┘
  ┌───────────┐        ┌─────────────┐
  │  Agent B  │───────▶│  CRM API    │  (custom connector #3 -
  └───────────┘        └─────────────┘   yes, AGAIN, for a different agent)
  ┌───────────┐        ┌─────────────┐
  │  Agent B  │───────▶│  Data       │  (custom connector #4)
  └───────────┘        │  Warehouse  │
                       └─────────────┘
  N agents x M systems = N x M custom, non-reusable integrations.
  Every new agent re-implements auth, retries, schemas, error handling.

USB раскіяў аднаковыя проблемы з апаратнымі перыферыямі, а ODBC і JDBC — з базамі дадзеных: занадта многа спецыяльных канектараў і жадання ў спільным стандарцы. MCP — гэта адпаведзь Anthropic, выданая як атворы протакол, а не толькі функцыя для Claude; такім чынам будзь-якае AI-зялёжнасць і будзь-які бэкенд можа вікорыстоўваць спільную мову.

AFTER MCP — one protocol, many servers, many clients

  ┌───────────┐                          ┌───────────────────┐
  │  Agent A  │──┐                   ┌─▶│  MCP Server: CRM   │
  └───────────┘  │    ┌───────────┐  │   └───────────────────┘
                 ├───▶│    MCP   │───┤  ┌───────────────────┐
  ┌───────────┐  │    │  (shared  │  ├─▶│ MCP Server: Ticket │
  │  Agent B  │──┘    │  protocol)│  │   └───────────────────┘
  └───────────┘       └───────────┘  │  ┌──────────────────┐
                                     └─▶│ MCP Server: DW   │
                                        └──────────────────┘
  Any MCP-compatible agent can now talk to any MCP server.
  Build the connector once, reuse it everywhere.

Усе можна выразыць ў адной фразе. MCP дае прыкладненням AI аднаковы спосаб разысквання інструментаў, вызывання іх, чытання дадзэнняў і вікорыстання шаблонаў запытаў, таму інтэграцыю пішуць раз і яе можа перыскорыстаць будзь-яны кліент, які выпанавляе ўсія вакалідазы.

2. Основныя паняціі простымі словамі

Чатыры тэрміна вжываюцца нечыста, таму яны уточнююцца перад напісаннем будзь-якога коду.

  • Хост. Прыкладненне на базе AI, з якім фактычна працуе канечны корыстнік, напрыклад, внутрашній асістэнт для чату, плагін для IDE або копілат для падтрымкі, і ў яму знаходзіцца LLM.
  • Klient MCP. Компанента ўнутры хоста, якая керуе адной з’яўленнем з аднім серверам MCP. Хост, які вяршыць зв’язак з трыма бэкендамі, зазвычай запускае троха кліентаў — по аднаму на кожны сервер.
  • Сервер MCP. Легкі прыграма, якая адкрывае можлівасці звярнення да адной сістэмы (інструменты, даны, запыты) са адпаведнасцю да спецыфікацыі MCP. Як распрацоўшчык падпрыемства, зазвычай вы ствараеце самэўсёльва такі сервер.
  • Транспорт. Чынны канал для абмену мэседжамі между кліентам і серверам. Два основных варыянты: stdio — кліент запускае сервер як локальны дзеціны процэс і абмেняецца мэседжамі праз стандартны ввод і вывод (падходзіць для локальнага разработкі і дэсктопных прыграм); і Streamable HTTP — сервер знаходзіцца на даляжыні за прыманком HTTPS (звычны выбар для сэрвэраў, якія працуюць централізавана і ўдзельнікі могу да яго з’явіцца).
  • У самай ніжнай частцы ўсі запыты выкарыстоўваюць JSON-RPC 2.0 — просты і добра апрацаваны фармат для запытоў, адпаведзей і паведамленняў. SDK запішае яго за вас, але разуменне гэтага фармата паяснюе, чаму інструменты дыбаггіну MCP супадаюць з інструментамі API, якія вы ужо вжываеце: ў іх ёсць ID запыту, назва методу, параметры, а таксама рэзультат або памылка.

    Што можа запростаць сервер: тры прымітывы

    • Інструменты — цэлком вызываемыя функцыі, якія дазволяюць модэлю дзеяць або запрашваць вырахаваныя рэзультаты; модэль сам выбірае, калі іх вызваць, залежна ад таго, пра шта пытаецца корыстнік. Прыклады: create_support_ticket, get_employee_details.
    • Рэсурсы — цэлком для чытання даныя, якія хост можа дадаць як кантэкст, напрыклад, файлы або запісі. Аплікацыя або корыстнік выбірае, што дадаць. Прыклады: артыкул з базы знання, PDF з правіламі, файл журналу.
  • Прыгісткі — гэта повторная адпрацоўваная шаблонная інструкцыя з параметрамі, якую выбірае корыстнік, падобна до команды з слэшам. Прыклад: "Падсумаваць гэты інцыдэнт для аналізу пасля яго наступлення."
  • У большасці інтэграцый у корпоратыўных сістэмах інструменты віконваюць апошнія 90% важлівай працы, таму іх ствараюць першымі.

    3. Архітэктура: тры шары разам

    ┌─────────────────────────── HOST APPLICATION ───────────────────────────┐
    │   e.g. an internal AI assistant, IDE plugin, support copilot           │
    │                                                                        │
    │   ┌───────────────┐        ┌───────────────┐       ┌───────────────┐   │
    │   │  MCP Client 1 │        │  MCP Client 2 │       │  MCP Client 3 │   │
    │   └───────┬───────┘        └───────┬───────┘       └───────┬───────┘   │
    └───────────┼────────────────────────┼───────────────────────┼───────────┘
                │ JSON-RPC over          │ JSON-RPC over         │ JSON-RPC over
                │ stdio / HTTPS          │ stdio / HTTPS         │ stdio / HTTPS
                ▼                        ▼                       ▼
       ┌──────────────────┐     ┌──────────────────┐     ┌─────────────────┐
       │   MCP Server     │     │   MCP Server     │     │   MCP Server    │
       │  wraps HR system │     │  wraps Ticketing │     │  wraps Data     │
       │  (tools: lookup, │     │  (tools: create, │     │  Warehouse      │
       │   update)        │     │   status, close) │     │  (tools: query) │
       └──────────────────┘     └──────────────────┘     └─────────────────┘
    

    Кожны сервер MCP павінен быць малым і спецыялізаваным — існавае околічны сервер для кожной сістэмы на заднім канцэле, і няма жаднага велікага сервера, які б крыў усё. Гэты падход запознаны з мікросервісамі: малы радыус дзейна, незалежная разгрузка, незалежна масштабавання і адпаведная адпаведальнасць тыма, якае керуе той самым заднім канцэле.

    4. Стварэнне першага сервера MCP (Node.js і TypeScript)

    Працоўны прыклад — сервер MCP для службы тэхнічнай падтрымкі, які включае два інструменты: адны для стварэння заявкі на падтрымку і другі для перагляду статусу заявкі. Ён відпаведае дужа популярнаму патэрну ў корпоратыўных сістэмах, які включае внутрашню API для керування заявкамі або ITSM.

    4.1 Наладжэнне праекта

    mkdir helpdesk-mcp-server && cd helpdesk-mcp-server
    npm init -y
    npm install @modelcontextprotocol/sdk zod
    npm install -D typescript tsx @types/node
    npx tsc --init
    

    @modelcontextprotocol/sdk — гэта афіцыйны пакет. Ён адзначаецца за апрацоўку дадзенняў у фармаце JSON-RPC па каналу звязку, а таксама за транспорты і прымітывы, таму самы JSON-RPC ніколі не обрабоўваецца вручную. zod — гэта бібліятэка для верыфікацыі схем. Вхідныя даны інструментаў MCP перакантролююцца за дапамогою схемы прытаму, прычым код апрацоўшчыка нават не запускаецца, што мае вельмі важлівое значэнне ў корпаратыўных сетках, адтолькі што некарэктныя або злонамерныя запыты зупіняюцца на самым входзе.

    4.2 Код сервера

    // src/server.ts
    import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
    import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
    import { z } from "zod";
    
    // --- A stand-in for a real internal ticketing API client ---
    // In a real enterprise server this would call your ITSM system
    // (ServiceNow, Jira Service Management, Zendesk, an internal API, etc.)
    const ticketStore = new Map<string, { status: string; subject: string }>();
    let nextId = 1000;
    // 1. Create the server instance.
    //    "name" and "version" identify this server to any client that connects.
    const server = new McpServer({
      name: "helpdesk-mcp-server",
      version: "1.0.0",
    });
    // 2. Register a tool: create_support_ticket
    server.registerTool(
      "create_support_ticket",
      {
        title: "Create Support Ticket",
        description:
          "Creates a new IT helpdesk ticket for the requesting employee.",
        inputSchema: {
          subject: z.string().describe("Short summary of the issue"),
          priority: z.enum(["low", "medium", "high", "urgent"]),
          employeeId: z.string().describe("Requesting employee's ID"),
        },
        outputSchema: {
          ticketId: z.string(),
          status: z.string(),
        },
      },
      async ({ subject, priority, employeeId }) => {
        const ticketId = `TCK-${nextId++}`;
        ticketStore.set(ticketId, { status: "open", subject });
        const output = { ticketId, status: "open" };
        // MCP tool results return a "content" array (what a human/LLM reads)
        // and, optionally, "structuredContent" (typed data other code can use).
        return {
          content: [
            {
              type: "text",
              text: `Created ticket ${ticketId} (priority: ${priority}) for employee ${employeeId}.`,
            },
          ],
          structuredContent: output,
        };
      }
    );
    // 3. Register a second tool: get_ticket_status
    server.registerTool(
      "get_ticket_status",
      {
        title: "Get Ticket Status",
        description: "Looks up the current status of an existing support ticket.",
        inputSchema: {
          ticketId: z.string(),
        },
        outputSchema: {
          status: z.string(),
        },
      },
      async ({ ticketId }) => {
        const ticket = ticketStore.get(ticketId);
        if (!ticket) {
          // Returning isError lets the model know the call failed
          // WITHOUT crashing the whole conversation.
          return {
            content: [{ type: "text", text: `No ticket found with ID ${ticketId}.` }],
            isError: true,
          };
        }
        return {
          content: [{ type: "text", text: `Ticket ${ticketId} is currently "${ticket.status}".` }],
          structuredContent: { status: ticket.status },
        };
      }
    );
    // 4. Wire the server to a transport and start listening.
    //    stdio is perfect for local development and desktop-hosted tools.
    const transport = new StdioServerTransport();
    await server.connect(transport);
    

    4.3 Каліквотна роля кожнага элемента

    • Экзанпляр McpServer. Гэты об’ект являецца серцам сэрвера. Ён сочыць за кожным зарэгістраваным інструментам, рэсурсам і запытам, а таксама керуе процэсам MCP handshake (дагаворае па можлівасцях) калі падключаецца кліент. Спіс інструментаў ніколі не запісваецца вручную, адтуды SDK стварае яго на адной з вызоваў registerTool.
    • inputSchema з Zod. Гэта не проста дакументацыя. SDK выкарыстоўвае яго для стварэння JSON Schema, які паведамляе кліенту і LLM, якія аргументы ўзьямліць, а таксама для пераканання кожнага вызову праз яго. Кліент, які пасылае priority: "banana", адхіляецца яшчэ перш чым досягае працоўніка апрацоўкі. Для падпрыемства такая пераканання на аснове шымату ёсць справжнім мерам безпекі, а не проста додатковай функцыяй.
  • outputSchema і structuredContent. Адказчык можа вернуць тэкст, чытальны для чалавека (content), а таксама об’ект, чытальны для апарата (structuredContent). Тэкст практыкуецца ў транскрыпцыі чату, а аплікацыя-заказчык можа аналізаваць структураваныя даны, каб запрацаваць інтэрфейс адказчыка або выконваць дальнейшую логіку.
  • isError: true. У MCP існуе явісна концэпція памылкі на рэвэлі адказчыка, якая адрозніцца ад памылкі на рэвэлі пратаку. Гэта означае, што аперацыя зазнала няўспэху, але размова должна продавацца, таму модэль можа прачытаць памылку і адначыцца, чы робіць пракату, запытаць карыстальніка чы спробаваць іншы адказчык. Вы не хачаце, каб уся сесія агента зламалася праз тое, што не існаваў адпаведны ID заявкі.
  • Транспорт (StdioServerTransport). Элемент, які перадае байты. Для локальных інструментаў, такіх як IDE для распрацоўшчыкаў або падказчык на рабочым столе, стандартны спосаб — іспользованне stdio, калі хост стварае сервер як дочырні працэс. Усе, што працуе централізавана ў корпорацыі, вікорыстоўвае транспорт на базе HTTP, пра які йдзе мова ў раздзеле 6.
  • 4.4 Запуск

    npx tsx src/server.ts
    

    Сама сервера нічога не паказвае, таму што яна чакае, калі кліент з’яўіцца і з’яўіцца на звязак праз stdin і stdout. Далей йдзе кліент.

    5. Кліент унутрь корпаратывнага прыемніка

    Пачатківцы часта ствараюць сервер, а потым цікавяцца, што на самай працэ ўзаемадзейнае з яным. Ёсць мінімальны кліент, які можна уявіць як частку внутранняга сервера на базе Node.js, які працуе з ШЫ-асістэнтам компаніі.

    // src/client.ts
    import { Client } from "@modelcontextprotocol/sdk/client/index.js";
    import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
    
    async function main() {
      // 1. Describe how to launch the server. Here we spawn it as a
      //    local subprocess - in production you'd more commonly point
      //    this at a remote HTTP-based server instead (see Section 6).
      const transport = new StdioClientTransport({
        command: "npx",
        args: ["tsx", "src/server.ts"],
      });
      // 2. Create a client and connect. This performs the MCP
      //    handshake and capability negotiation automatically.
      const client = new Client({ name: "internal-ai-assistant", version: "1.0.0" });
      await client.connect(transport);
      // 3. Discover what tools this server offers - this is the same
      //    mechanism an LLM uses to "learn" what it can do.
      const { tools } = await client.listTools();
      console.log("Available tools:", tools.map((t) => t.name));
      // 4. Call a tool, just like the LLM would.
      const result = await client.callTool({
        name: "create_support_ticket",
        arguments: {
          subject: "VPN keeps disconnecting",
          priority: "high",
          employeeId: "E-4821",
        },
      });
      console.log(result.content);
      await client.close();
    }
    main();
    

    Парадыганальна значымасць гэтага

    Цэнтральная ідэя — адкрыцце. Кліент вызывае listTools() і атрымлеўвае каталог, чытальны для апарата, з усім, што прысутнае на серверы, пры чым кожны інструмент супроводжваецца сваім шымой. Самэ гэта робіць MCP дынамічным: хост, які працуе на аснове LLM, не патрабуе, каб інструменты былі вбудованы ў яго запіт. У момент падключэння ён запытае сервера, што той можа зрабіць, і адказ стае часткай таго, што модэлю паведамляецца як можлівасці ў гэтай розмове.

    Управлінне падпрыемствамі базуецца самэ на гэтым механізме. Калі які-небудзь інструмент не павінен быць доступным для певнага корыстніка або асяроддзя, найболей чысты спосаб контролю — не включаць яго ў тое, што вяртае listTools(), а не спадзявацца, што модэль сама не будзе яго вызываць.

    6. Пераход з локальнага пратотыпа да розгортання ў компаніі

    Настройка stdio падае па выучэнне і местныя інструменты распрацоўшчыка, але яна не адпавядае спосабу, як большасць падпрыемства адмаўляюць інфраструктуру: яна розмешчаецца цэнтралізавана, захавана праз аўтэнтыфікацыю, логуецца, і да яе можна дасягнуць адразу з багацькох прыемных прыкладненняў. Самэлькі выкорыстоўваецца транспорт Streamable HTTP і API-шлюз.

    Ёсць прыклад таго ж сервера дапамогі, прыстосаванага для працы праз HTTP і розмешчанага за простым прыкладненням Express:

    // src/httpServer.ts
    import express from "express";
    import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
    import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
    
    const app = express();
    app.use(express.json());
    app.post("/mcp", async (req, res) => {
      // In a real enterprise deployment, authentication middleware would
      // run BEFORE this point - verifying a bearer token, checking scopes,
      // and attaching the caller's identity to the request.
      const server = buildHelpdeskServer(); // same registerTool calls as before
      const transport = new StreamableHTTPServerTransport({
        sessionIdGenerator: undefined, // stateless mode: simplest to scale horizontally
      });
      res.on("close", () => transport.close());
      await server.connect(transport);
      await transport.handleRequest(req, res, req.body);
    });
    app.listen(3000, () => console.log("MCP server listening on :3000"));
    

    Сур’ёзныя змены стосуюцца не столь самога коду, сколь таго, дзе знаходзіцца адпаведна адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная адпаведная

    7. Спісак пунктав для анаізу для падчорганоў

    Запуск сервера MCP — гэта проста пята частка задачы. Рэшта чатыры пятыя — гэта стварэнне абэрнай сістэмы для ўжыцця ў працоўных супэрмашынах, якія зберагаюць рэальныя даны пра спаведамленнікаў чы кліентаў, і гэта выглядае так.

    • Аўтэнтыфікацыя і автарызацыя. На входзе выкорыстоўваюце OAuth2 чы OIDC. Спаяваеце ідэнтыфікат вызываючага спаведамленніка чы адказвальнага акаунта з конкрэтнымі правамі, так што не кожны інструмент будзе доступны для кожнага вызываючага.
    • Праектаванне інструментаў з мінімальнымі правамі. Валіце вузкія інструменты, такія як get_ticket_status, замест шырокіх, такіх як run_sql_query. Інструмент, які выкананае адно чыста апісанае заведамчэ, значна лёгкій да аналізу і аўдыту.
  • Параболіка вводу. Спрытва схемы, як і ў прыкладзе з Zod, трэба спрыяць як сапраўднай межы безпекі, а не проста як зручнасці для перагляду тыпаў.
  • Участка чалавека для разрушальных дзеянняў. Для всіх незворачных дзеянняў, такіх як выдаленне запісу, адправка зовнішньага пісьма чы аправарэнне платэжа, неабходна атрымаць явную параболіку ад корыстніка пры выкананні інструмента.
  • Логаванне аўдыту. Фіксаваць, хто вызваў кожны інструмент, з якімі аргументамі і з якім рэзультатам. Гэта дазволяе пазней адказаць на пытанні пра дзеяння, выкананае за дапамогою AI, што ёсць строгай патрабованнем у рэгулююцых сферах, такіх як охорона здароў’я і фінансы.
  • Ліміты частоты і таймауты. Застаўляць тыя ж правілы кантролю, што і для іншага внутрашньаго трафіку API, каб агент, застраглы ў цыкле, не могаў засыпаць бэкенд.
  • Ідэмпотэнцыя. Зрабіце інструменты з парадоксальнымі наследкамі безпечнымі для двойнага вызыву з тым самым вхідным дадзеннем, адколькі агенты іноды прабуюць зноў.
  • Версіяванне. Калі змінююцца схемы інструментаў, намерна ствараюце ўсе версіі, каб старэйшыя прыстроі не перэстала працаваць без супакомлення.
  • 8. Дзе гэта выкорыстоўваецца ў рэальных падпрыемствах

    • IT і внутршняя падтрымка. Прыклад службы падтрымкі: стварэнне і запыт пра заявкі, скасаванне пароляў, перакананне статусу сістэмы.
    • Памочнікі для продажоў і CRM. Збір історыі рахункоў і стварэнне праектаў післяположных пісьмаў, апаручаных на рэальных дадзеннях CRM, а не на прыпусках модэлю.
    • Памочнікі для дадзенняў і аналітыкі. Нярэдагавальны, загадзя затверджаны набор інструментаў для запытоў над храніцай дадзенняў, у замен на безмежны SQL.
    • Працэсы ў сфэрэ охоры здароў’я. Адзінкі, якія шукаюць вільныя часы для прыемаў, пераканальваюцца ў наявнасці страховага пакрыцья або выяўляюць прычыны сутычак у коордынацыі дапамогі, завжды працуюць пад строгым контролем прав на доступ і логамі аўдыту, адказна за чутлівасць дакументацыі. У гэтым случае прынцыпы вікорыстання спецыялізаваных адзінкаў, удзеле чалавека і повнага логу аўдыту з Раздзела 7 часта ёсць выкананнем трэбаванняў па салідарнасці.
    • Інструменты для распрацоўшчыкаў. Асістэнты IDE, якія запытваюць внутрашню дакументацыю, запускаюць працэсы CI або пераканальваюцца, хто знаходзіцца на дзвоне для адпаведнага сервісу.

    Што ўсе гэта мае спакойнае: MCP не робіць мадэль болей розумнай. Зміняецца тое, што AI атрымлеў контрольаваны, аўдытаваны доступ да рэальных сістэм і больш не павінен выдумваць правдопадобна звучацьяя адпаведзі.

    9. Перашкоды, з якімі сталкаюцца пачатківцы

    • Адзін вялікі сервер „дзеўсё“. Ён раздзеляецца па сістэмах адзынчака або домэнах. Гэта адпавядае прыемным прынцыпам мікросервісаў і зменшае абсяг уражэння.
    • Ігнараванне полей description. Модэль значна паслужаецца апісаннямі інструментаў і параметраў, каб вырашыць, калі і як чыгнуць да чаго-небудзь. Нечыстыя апісанні прыводзяць да выбору няправільнага інструмента або правільнага інструмента з неправімі аргументамі.
    • Забыванне пра isError. Неапранутая асупэкцыя, якая выклікаецца з апрацоўшчыка інструмента, можа знішчыць усе з’яўлення кліента, тады як модэлю трэба было бы сказаць, што ўсё зрабілася неяк, і прабавіць іншае.
    • Вывод стандартнага вводу-выводу ў працэс вырабніцтва. Стандартны ввод-вывод падходзіць для локальнага розвіцця і настольных сэрвераў. У працэсе вырабніцтва з калькуляцыяй кількох кліентаў патрэбны HTTP-транспорт за рэальным шлюзам.
  • Няма летаку аўдыту. Калі вы не можэце сказаць, хто прабаваў кераваць ШЫ і што ён зрабіў, трэба трывогваць яго ад дадзэнняў, якія вікорыстоўваюцца у працоўнай асяроддзі.
  • 10. Короткая версія

    Калі адмахнуцца ад усіх модных тэрмінаў, галоўная ідэя MCP выглядае проста: адна спяльная метода для прыкладнэй супэрвізора ШЫ, якая дазволяе ям знаходзіць і запускаць інструменты, запрашаць дадзеныя і перадаўаць шаблоны запытанняў, што значыць, што праца з інтэграцыяй, адрабатаная адной раз, будзе корыстна для всіх кліянтаў, якія салідарныя з правіламі. Для падпрыемств самэ гэта стандартызаванне дапамагае перацягнуць агенты ШЫ з простых дэманстрацый у інструменты, якія можна кераваць, захаваць і выкорыстоўваць у працоўнай асяроддзі разам з усім іншым.

    Для тых, хто толькі пачынае, разумны паходжыць ёсць такі:

    1. Створыць маленькі сервер MCP локальна за дапамогою stdio, як у прыкладзе сапорабочага пункту.
    2. Дадаць кліента, які запытае гэтыя інструменты, каб весь працэс быў відны.
    3. Размясціце сервер за прыемнікам HTTP з аутантыкацыёй або прыемнікам перад яго.
    4. Толькі пасля чаго перэйдзіце да логавання дзеянняў, обмежэння па частоце запытоў і людскай апраўды для усяго разрушальнага.

    Пачніце з малага і локальных рашэнняў, а праблемы корпаратыўнага масштабу внесіце поступова. Прабава стварыць ідэальны сервер для працы з першага дня — гораздзе небяспечнейшы спосаб дасягнуць ціялі.

    Супаўзвязаныя матэрыялы