MCP: когда инструментов много, а протокол один
Вы строили AI-агента. Подключали его к базе данных, к API погоды, к файловой системе. Писали обертку за оберткой. Каждый инструмент требовал свой формат запроса, свою обработку ошибок, свою логику. В итоге получался монстр из кода, который только вы могли понять. Знакомо?
Anthropic посмотрела на этот хаос и сказала: «Хватит». Так появился Model Context Protocol (MCP). Не очередной фреймворк, а стандарт. Как USB для инструментов ИИ. Если ваша модель — это компьютер, то MCP — это разъем, в который вы подключаете мышь, клавиатуру и внешний жесткий диск.
Из чего сделан 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-сервер, который умеет читать логи и искать в них ошибки.
@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. Увидите, как модель вызывает ваш инструмент. Это момент «вау». После него вы уже не сможете работать по-старому.