Post

Model Context Protocol (MCP): що це таке, як влаштований «USB-C для штучного інтелекту» та як підняти свій перший сервер

Model Context Protocol (MCP): що це таке, як влаштований «USB-C для штучного інтелекту» та як підняти свій перший сервер

🇬🇧 Read this article in English


Згадайте комп’ютери кінця 1990-х років: щоб підключити мишу, потрібен був порт PS/2. Для клавіатури — інший DIN-роз’єм. Для принтера — важкий паралельний порт LPT, для модема — послідовний COM-порт, а для джойстика — гігантський Game Port. Кожен виробник заліза мав власні драйвери, кабелі та протоколи.

Справжня революція відбулася тоді, коли індустрія домовилася про єдиний універсальний стандарт — USB, який згодом еволюціонував у компактний USB-C.

До кінця 2024 року світ штучного інтелекту перебував у точнісінько такому ж первісному хаосі.

Уявіть ситуацію: у вас є десятки мовних моделей (Claude від Anthropic, GPT-4 від OpenAI, локальні LLM через Ollama/Llama.cpp) і сотні джерел даних та інструментів (бази даних PostgreSQL/MySQL, репозиторії GitHub, консольні утиліти, файлова система, Slack, Jira). Щоб подружити $M$ моделей з $N$ інструментами, інженерам доводилося створювати $M \times N$ індивідуальних інтеграцій! Кожен фреймворк (LangChain, LlamaIndex, AutoGen) винаходив свій власний формат опису функцій (Function Calling).

Усе змінилося, коли компанія Anthropic представила Model Context Protocol (MCP) — відкритий відкритий стандарт, який миттєво охрестили «USB-C для штучного інтелекту».

Сьогодні детально розберемося, як влаштований протокол MCP під капотом, чому його підтримали всі лідери ринку (від Cursor і Claude Desktop до локальних агентів), як він перетворює текстову нейромережу на повноцінного автономного інженера і як за 5 хвилин створити свій перший MCP-сервер на Python.

Архітектура Model Context Protocol Мал. 1. Архітектура екосистеми MCP: клієнтський додаток взаємодіє з ізольованими серверами через уніфікований протокол JSON-RPC


Чому саме MCP? Концепція проблеми $M \times N$

До появи протоколу підключення інструментів виглядало як заплутаний клубок спагеті-коду:

flowchart TD
    subgraph OldWay["Старий підхід: Хаос індивідуальних інтеграцій"]
        LLM1[Claude] --> API1[PostgreSQL Connector]
        LLM1 --> API2[GitHub API Script]
        LLM2[OpenAI / GPT] --> API3[LangChain Tool]
        LLM2 --> API4[Custom Slack Bot]
        LLM3[Local Ollama] --> API5[Bash Execution Wrapper]
    end

Якщо оновлювалося API бази даних чи змінювався формат виклику функцій у новій моделі — ламалися всі залежні проєкти.

З Model Context Protocol задача спрощується до $M + N$:

  • Розробник інструменту (наприклад, PostgreSQL чи GitHub) пише один єдиний MCP-сервер.
  • Розробник ШІ-додатка (наприклад, Cursor, Claude Desktop чи IDE) реалізує підтримку MCP-клієнта.
  • Будь-який клієнт отримує можливість миттєво підключати будь-який сервер без зміни жодного рядка коду!

Архітектура: Як це працює зсередини

Протокол базується на перевіреному часом форматі повідомлень JSON-RPC 2.0 та ділиться на три основні компоненти:

  1. MCP Host (Хост / Клієнт):
    Додаток, з яким взаємодіє користувач. Це може бути Claude Desktop, Cursor IDE, Zed, розширення для VS Code або ваш власний скрипт на базі локальної моделі. Хост відповідає за запуск MCP-серверів та координацію контексту.
  2. MCP Client (Клієнтська бібліотека):
    Внутрішній рушій всередині хоста, який встановлює пряме 1-до-1 з’єднання з кожним MCP-сервером.
  3. MCP Server (Сервер інструментів):
    Легковажний процес (на Node.js чи Python), який безпосередньо звертається до цільової системи (бази даних, Git, файлової системи) і надає клієнту чітко описані можливості.

Два типи транспорту (Transport Layer)

  • stdio (Стандартний ввід/вивід):
    Клієнт запускає MCP-сервер як дочірній локальний процес і обмінюється JSON-повідомленнями через стандартні потоки stdin / stdout. Це максимально швидко, безпечно і не потребує відкриття мережевих портів (ідеально для десктопних програм).
  • SSE (Server-Sent Events over HTTP):
    Сервер працює як самостійний мережевий сервіс (наприклад, у Docker на віддаленому VPS), надсилаючи повідомлення через HTTP SSE. Ідеально для корпоративних серверів баз даних та хмарних сервісів.

Три кити MCP: Tools, Resources та Prompts

Будь-який MCP-сервер може надавати моделі три типи можливостей:

ПримітивЩо це таке?Аналог у програмуванніПриклад
Tools (Дії)Функції, які модель може викликати для виконання реальних дій.POST / PUT методи або RPC-функціїВиконати SQL-запит SELECT, створити issue в GitHub, перезапустити Docker-контейнер
Resources (Дані)Контекстна інформація тільки для читання, схожа на файли.GET методи або статикаСхема бази даних, системний лог /var/log/nginx/error.log, документація API
Prompts (Шаблони)Готові інтерактивні сценарії та інструкції, зашиті в сервер.Шаблонізатор / MacrosПромпт «Проаналізуй інцидент за останню годину» з автоматичним підтягуванням логів

Практика: Підключаємо готові MCP-сервери за 2 хвилини

Екосистема MCP вже налічує сотні готових офіційних та ком’юніті-серверів.

Покажемо, як підключити готові сервери до Claude Desktop або сумісного клієнта. Усі налаштування зберігаються в простому JSON-файлі:

  • У Windows: %APPDATA%\Claude\claude_desktop_config.json
  • У macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • У Linux: ~/.config/Claude/claude_desktop_config.json

Приклад конфігурації: Робота з файлами, Git та PostgreSQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:\\Users\\Username\\Projects"
      ]
    },
    "postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://postgres:secretpassword@localhost:5432/mydb"
      ]
    },
    "github": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_yourTokenHere"
      }
    }
  }
}

Що відбувається після перезапуску клієнта?
У вікні чату з ШІ з’являється піктограма інструментів (молоточок). Тепер ви можете написати:

«Подивись на схему таблиці users у PostgreSQL, напиши міграцію для додавання колонки is_verified і створи під це пулреквест у моєму репозиторії GitHub».

Модель сама зробить SQL-запит до вашої локальної бази, створить гілку в Git і відправить PR, використовуючи стандартизовані виклики MCP!


Створюємо власний MCP-сервер на Python за 5 хвилин

Хочете дати нейромережі доступ до специфічної внутрішньої системи чи моніторингу вашого сервера? Завдяки бібліотеці FastMCP від команди mcp, написати свій сервер простіше, ніж Flask-додаток!

1. Встановлюємо SDK:

1
pip install mcp

2. Пишемо файл server.py:

Створимо сервер, який дозволить ШІ перевіряти навантаження сервера (RAM/CPU) та перевіряти статус інфраструктури:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import psutil
from mcp.server.fastmcp import FastMCP

# Ініціалізуємо MCP-сервер з назвою "system-monitor"
mcp = FastMCP("System Monitor")

@mcp.tool()
def get_system_metrics() -> str:
    """Повертає поточне завантаження процесора (CPU) та використання оперативної пам'яті (RAM)."""
    cpu_percent = psutil.cpu_percent(interval=1)
    ram = psutil.virtual_memory()
    
    return (
        f"CPU Load: {cpu_percent}%\n"
        f"RAM Used: {ram.used / (1024**3):.2f} GB / {ram.total / (1024**3):.2f} GB ({ram.percent}%)"
    )

@mcp.tool()
def check_disk_space(path: str = "/") -> str:
    """Перевіряє вільне та зайняте місце на вказаному диску."""
    disk = psutil.disk_usage(path)
    return (
        f"Disk '{path}': Free {disk.free / (1024**3):.2f} GB of {disk.total / (1024**3):.2f} GB "
        f"({disk.percent}% used)"
    )

if __name__ == "__main__":
    # Запускаємо через стандартний транспорт stdio
    mcp.run(transport="stdio")

3. Додаємо свій сервер у конфігурацію клієнта:

1
2
3
4
5
6
7
8
{
  "mcpServers": {
    "my-system-monitor": {
      "command": "python",
      "args": ["/path/to/server.py"]
    }
  }
}

Усе! Завдяки декоратору @mcp.tool() FastMCP автоматично згенерував схему валідації JSON Schema з docstring функцій і типів Python. Модель розуміє, які параметри приймати і що саме повертає функція.


Безпека: Чому MCP безпечніший за прямий доступ до Bash?

Багато розробників запитують: «А хіба не можна було просто дати моделі доступ до виконання довільних команд у терміналі eval() / bash?».

Можна, але це величезна загроза безпеці. Надавши моделі сліпий доступ до терміналу, ви ризикуєте отримати виконану галюцинацію на кшталт rm -rf / або витік ключів через curl на підозрілі сайти.

Переваги безпеки моделі MCP:

  1. Принцип найменших привілеїв (PoLP): Сервер експонує лише чітко регламентовані функції. Якщо сервер вміє тільки get_user_by_id, модель фізично не зможе дропнути таблицю чи вийти за межі контракту.
  2. Контроль користувача (Human-in-the-Loop): Клієнт показує користувачеві спливаюче вікно з точними аргументами виклику і вимагає натиснути кнопку «Approve» перед кожною небезпечною дією (записом файлу чи відправкою транзакції).
  3. Ізоляція процесів: Сервер може крутитися всередині безпечного контейнера Docker або пісочниці, не маючи прямого доступу до вашої операційної системи.

Підсумки: нова ера агентного ШІ

Model Context Protocol — це не просто чергова модна бібліотека, це індустріальний стандарт, який вирішив фундаментальну проблему зв’язку між інтелектом нейромереж та реальними даними.

Завдяки MCP:

  • ШІ-асистенти перестали бути ізольованими «чатами в браузері» і перетворилися на реальних цифрових колег, які бачать ваш код, бази даних та сервери.
  • Інструменти пишуться один раз і працюють у будь-якому клієнті сьогодні, завтра і через 5 років.

Якщо ви плануєте інтегрувати ШІ у свої робочі процеси чи сервіси — створення власного MCP-сервера є найкращою і найбільш далекоглядною інвестицією в сучасний DevOps та бекенд.

This post is licensed under CC BY 4.0 by the author.