MCP от Anthropic: интеграция инструментов в AI-агентов | AiManual
AiManual Logo Ai / Manual.
06 Янв 2026 Инструмент

Model Context Protocol (MCP) от Anthropic: полное руководство по интеграции инструментов в агентские пайплайны

Обзор Model Context Protocol (MCP) от Anthropic: архитектура, сравнение с function calling, примеры кода на Python и рекомендации по использованию в агентских п

MCP: когда инструментов много, а протокол один

Вы строили AI-агента. Подключали его к базе данных, к API погоды, к файловой системе. Писали обертку за оберткой. Каждый инструмент требовал свой формат запроса, свою обработку ошибок, свою логику. В итоге получался монстр из кода, который только вы могли понять. Знакомо?

Anthropic посмотрела на этот хаос и сказала: «Хватит». Так появился Model Context Protocol (MCP). Не очередной фреймворк, а стандарт. Как USB для инструментов ИИ. Если ваша модель — это компьютер, то MCP — это разъем, в который вы подключаете мышь, клавиатуру и внешний жесткий диск.

💡
MCP — это открытый протокол, который позволяет LLM (например, Claude) безопасно взаимодействовать с внешними ресурсами: базами данных, API, файлами. Он стандартизирует способ объявления инструментов (tools) и предоставления контекста (context).

Из чего сделан MCP? Разбираем по косточкам

Представьте MCP как трехсторонний договор между клиентом, сервером и моделью. Каждая сторона знает свои обязанности.

  • MCP-сервер — это ваш код. Он объявляет, какие инструменты доступны («прочитать файл», «выполнить SQL-запрос»). И предоставляет контекст по запросу.
  • MCP-клиент — это приложение, которое работает с моделью (например, Claude Desktop, LM Studio или OpenWebUI). Он подключается к серверу и передает модели список инструментов.
  • Модель (Claude) — решает, когда и какой инструмент вызвать. Она не исполняет код. Она только просит клиента: «Эй, вызови-ка инструмент „search_products“ с параметром query=„яблоки“».

Клиент получает запрос от модели, передает его серверу, получает результат и отдает обратно модели. Модель продолжает думать. Вся эта коммуникация идет через стандартизированный JSON-RPC протокол. Никакой магии.

Важное отличие от function calling: модель НЕ получает код инструментов. Только их описание (имя, параметры). Исполнение происходит на стороне сервера, который вы контролируете. Это безопаснее.

MCP против всех: зачем он, если есть LangChain и function calling?

Откроем секрет. MCP не заменяет LangChain, LlamaIndex или встроенный function calling у GPT. Он решает другую проблему — проблему поставки инструментов.

ПодходЧто делает?Где исполняется инструмент?Главная боль
Function Calling (OpenAI)Модель выбирает функцию из списка, которую должен вызвать разработчик.На вашем сервере, после получения ответа от API.Жесткая привязка к модели OpenAI. Нет стандарта для описания функций.
LangChain ToolsФреймворк предоставляет обертки для тысяч инструментов, цепочки вызовов.В процессе работы вашего Python-скрипта.Вес. Сложность кастомизации. Вы зависите от обновлений фреймворка.
MCP (Anthropic)Стандартный протокол для объявления инструментов и поставки контекста.На отдельном MCP-сервере, который вы запускаете.Нужно писать свой сервер (хотя это проще, чем кажется).

MCP — это протокол, а не фреймворк. Вы можете написать сервер на Python, TypeScript, Go, Rust. Подключить его к Claude Desktop, и все инструменты появятся в интерфейсе. Без дополнительного кода. Это как написать драйвер для принтера — после этого любая программа может печатать.

Пишем свой MCP-сервер за 5 минут

Хватит теории. Давайте создадим сервер, который умеет искать файлы в системе и читать их. Тот самый «внешний жесткий диск» для Claude.

1 Устанавливаем SDK

pip install mcp

2 Код сервера (server.py)

import anyio
from mcp.server import Server, NotificationOptions
import mcp.server.models as models
from pathlib import Path

# Создаем сервер
server = Server("filesystem-server")

# Объявляем инструмент для поиска файлов
@server.list_tools()
async def list_tools() -> list[models.Tool]:
    return [
        models.Tool(
            name="find_files",
            description="Ищет файлы по названию в указанной директории",
            inputSchema={
                "type": "object",
                "properties": {
                    "directory": {"type": "string", "description": "Путь для поиска"},
                    "pattern": {"type": "string", "description": "Шаблон имени файла (например, *.txt)"}
                },
                "required": ["directory", "pattern"]
            }
        ),
        models.Tool(
            name="read_file",
            description="Читает содержимое текстового файла",
            inputSchema={
                "type": "object",
                "properties": {
                    "path": {"type": "string", "description": "Полный путь к файлу"}
                },
                "required": ["path"]
            }
        )
    ]

# Реализуем инструмент find_files
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[models.TextContent]:
    if name == "find_files":
        directory = Path(arguments["directory"])
        pattern = arguments["pattern"]
        if not directory.exists():
            return [models.TextContent(type="text", text=f"Директория {directory} не найдена")]
        files = list(directory.rglob(pattern))
        if not files:
            return [models.TextContent(type="text", text="Файлы не найдены")]
        file_list = "\n".join(str(f) for f in files[:10])  # Ограничим вывод
        return [models.TextContent(type="text", text=file_list)]
    elif name == "read_file":
        file_path = Path(arguments["path"])
        if not file_path.exists():
            return [models.TextContent(type="text", text=f"Файл {file_path} не найден")]
        content = file_path.read_text(encoding="utf-8", errors="ignore")
        return [models.TextContent(type="text", text=content[:5000])]  # Первые 5000 символов
    else:
        raise ValueError(f"Неизвестный инструмент: {name}")

async def main():
    async with server.run_stdio() as transport:
        await transport.wait_closed()

if __name__ == "__main__":
    anyio.run(main)

Запускаем сервер:

python server.py

Теперь в Claude Desktop заходим в настройки → Developer → Configure MCP Servers. Добавляем новый сервер типа «stdio» и указываем команду для запуска нашего Python-скрипта. Перезапускаем Claude. Готово. В чате у Claude появятся новые инструменты find_files и read_file.

💡
Для отладки MCP-серверов используйте Syrin — первый дебаггер для MCP. Он покажет все вызовы и ответы в реальном времени.

Реальный пример: агент для анализа логов

Представьте, что вам нужно анализировать логи сервера. Вручную это скучно. Напишем MCP-сервер, который умеет читать логи и искать в них ошибки.

@server.list_tools()
async def list_tools() -> list[models.Tool]:
    return [
        models.Tool(
            name="fetch_logs",
            description="Получает логи за последние N часов",
            inputSchema={
                "type": "object",
                "properties": {
                    "hours": {"type": "integer", "description": "Количество часов"},
                    "service": {"type": "string", "description": "Имя сервиса (опционально)"}
                },
                "required": ["hours"]
            }
        ),
        models.Tool(
            name="analyze_errors",
            description="Анализирует логи и возвращает статистику по ошибкам",
            inputSchema={
                "type": "object",
                "properties": {
                    "log_text": {"type": "string", "description": "Текст логов для анализа"}
                },
                "required": ["log_text"]
            }
        )
    ]

Реализация fetch_logs может подключаться к вашей системе мониторинга (например, через Elasticsearch API). analyze_errors может использовать простую эвристику или даже вызывать другую модель для классификации. Ключевой момент: Claude видит эти два инструмента и может построить цепочку: «Сначала получи логи за 24 часа, затем проанализируй ошибки». Вы не пишете скрипт для этой цепочки. Вы просто даете инструменты, а модель сама решает, как их комбинировать.

Будьте осторожны с безопасностью. MCP-сервер исполняется на вашей машине с вашими правами. Не давайте инструмент «выполнить произвольную команду в shell». Прочтите статью о скрытых угрозах MCP в продакшене.

Кому нужен MCP прямо сейчас?

MCP — не панацея. Он блестяще решает конкретные задачи.

  • Разработчики внутренних инструментов для компании. У вас есть база данных сотрудников, API биллинга, система тикетов. Вы хотите дать менеджерам возможность задавать вопросы естественным языком («Сколько клиентов привлек отдел маркетинга в прошлом квартале?»). MCP позволяет быстро подключить эти источники к Claude без написания отдельного фронтенда.
  • Создатели кастомных AI-агентов для автоматизации. Агент, который мониторит почту, извлекает задачи, создает тикеты в Jira. Каждый шаг — инструмент MCP. Вы получаете стандартный способ расширения функциональности.
  • Энтузиасты, которые хотят подключить Claude к своим данным. Ваша локальная коллекция документов, заметок в Obsidian, база рецептов. MCP-сервер превращает их в контекст для модели.

Если же вам нужна разовая интеграция с одним API, возможно, проще использовать function calling OpenAI. Если вы строите сложную многошаговую оркестрацию с условиями и циклами, возможно, Ray или LangChain подойдут лучше.

Что будет дальше с MCP?

Anthropic сделала MCP открытым. Уже появляются инструменты вокруг него. MCP Chat Studio v2 — это Postman для тестирования MCP-серверов. MCP Tool Registry помогает управлять инструментами. Экосистема растет.

Мой прогноз: MCP станет стандартом де-факто для подключения инструментов к LLM в корпоративной среде. Потому что он простой, безопасный и независимый от модели. Через год мы будем скачивать MCP-серверы для Salesforce, GitHub, Slack как плагины. И подключать их к любой модели, которая поддерживает протокол.

Совет напоследок: начните с одного инструмента. Не пытайтесь охватить все ваши API. Напишите сервер, который отвечает на вопрос «Какая погода в Москве?». Подключите его к Claude Desktop. Увидите, как модель вызывает ваш инструмент. Это момент «вау». После него вы уже не сможете работать по-старому.