Введение: от простых цепочек к агентам, которые действуют
Ещё пару лет назад типичное LLM-приложение представляло собой линейную цепочку: промпт, контекст из векторной базы, вызов модели, ответ. LangChain популяризировал эту модель — chains, retrievers, memory — и она работала для простых задач вроде ответов на вопросы по документации.
Но реальные бизнес-задачи редко укладываются в линейный пайплайн. Пользователь хочет, чтобы система не просто ответила, а что-то сделала: создала тикет, отправила письмо, запросила данные из CRM или проверила погоду перед тем, как сформулировать ответ.
Здесь на сцену выходят AI-агенты — системы, способные автономно решать, какой инструмент использовать, в каком порядке и как интерпретировать результат.
Раньше подключение каждого инструмента требовало написания «клея» — кастомных функций с декоратором @tool в LangChain, ручной аутентификацией, обработкой ошибок и сериализацией. В продакшене это быстро превращалось в неуправляемый зоопарк интеграций.
Model Context Protocol (MCP) от Anthropic решает эту проблему. Это единый стандарт для подключения инструментов и источников данных к LLM-приложениям. Вместо написания адаптеров для каждого API вы запускаете MCP-сервер, который предоставляет инструменты по стандартизированному протоколу. Агент подключается к нему через MCP-клиент и получает доступ ко всем инструментам без лишнего кода.
В этой статье мы создадим агента, который:
- Взаимодействует с внешним миром через MCP (погода, GitHub Issues);
- Доступ к внутренней документации через RAG;
- Принимает решения по ReAct-подходу с помощью LangGraph.
Теоретический минимум: что нужно знать перед погружением в код
AI-агент и ReAct-подход
AI-агент — это система, работающая по циклу: Мысль → Действие → Наблюдение. Этот паттерн называется ReAct (Reasoning + Acting).
- Агент получает задачу от пользователя.
- Модель решает, какой инструмент вызвать и с какими параметрами.
- Агент вызывает инструмент и получает результат («наблюдение»).
- Цикл повторяется, пока модель не сочтёт информацию достаточной для ответа.
Ключевое отличие от обычной цепочки — модель сама решает, когда и какие инструменты использовать, а не следует жёсткому сценарию.
RAG (Retrieval-Augmented Generation)
RAG — это подход, при котором перед генерацией ответа модель извлекает релевантные документы из векторной базы и использует их как контекст.
Для агента RAG — это просто ещё один инструмент. Когда нужна информация из внутренней документации, он вызывает search_documentation, а не полагается на память модели и не галлюцинирует.
Model Context Protocol (MCP)
MCP — открытый протокол на основе JSON-RPC, стандартизирующий взаимодействие между AI-приложениями и внешними инструментами.
Архитектура включает три компонента:
- MCP Host — AI-приложение (например, Claude Desktop или наш Python-агент);
- MCP Client — компонент внутри хоста, управляющий подключением к MCP-серверу;
- MCP Server — программа, предоставляющая инструменты по стандартизированному протоколу.
MCP делает для AI-агентов то же, что REST API сделал для веб-сервисов — универсальный способ взаимодействия, независимый от реализации.
Обзор стека: что и почему мы будем использовать
Мы используем следующие технологии:
- Python — поддержка asyncio, современный синтаксис, стабильность;
- LangGraph + LangChain — LangGraph даёт контроль над циклом ReAct и состоянием, LangChain предоставляет удобные абстракции;
- FastMCP — высокоуровневая библиотека для создания MCP-серверов через декораторы функций. Версия 2.0 активно развивается и включает клиентские возможности;
- langchain-mcp-adapters — официальная библиотека, конвертирующая MCP-инструменты в формат LangChain;
- Chroma — лёгкая, встраиваемая векторная база, идеальна для прототипов;
- OpenAI text-embedding-3-small — качественные и недорогие эмбеддинги;
- Claude или GPT-4 — любая модель с поддержкой function calling.
Практическая часть: пишем код
Часть 1. Создание MCP-сервера для работы с внешним миром
Создадим MCP-сервер с двумя инструментами: получение погоды и создание GitHub Issue.
Установим FastMCP и создадим файл tools_server.py.
Что происходит:
- Создаём экземпляр FastMCP и декорируем функции
@mcp.tool(). Библиотека автоматически генерирует JSON-схему на основе сигнатуры и docstring. get_weatherиспользует бесплатный API Open-Meteo (без ключа).create_github_issueтребует токен GitHub с правамиrepo.- Сервер использует транспорт stdio — общение через стандартный ввод/вывод в формате JSON-RPC.
Запуск сервера (для теста):
Для проверки можно использовать MCP Inspector, но мы сразу интегрируем его с агентом.
Часть 2. Настройка RAG-модуля
Создадим RAG-систему, индексирующую PDF-документы и предоставляющую инструмент поиска.
Установим зависимости и создадим файл rag_tool.py.
Ключевые моменты:
- Используем PyPDFLoader для загрузки PDF и RecursiveCharacterTextSplitter для разбивки на чанки с перекрытием.
- Векторное хранилище сохраняется в папке
chroma_db/— при повторных запусках не нужно переиндексировать. - Инструмент
search_documentationобёрнут в декоратор@toolиз LangChain — это делает его совместимым с LangGraph. - Docstring инструмента — часть промпта для модели. Чем точнее он описан, тем лучше агент выбирает, когда и зачем его использовать.
Часть 3. Сборка агента с доступом к MCP
Соберём агента на LangGraph, объединив MCP и RAG.
Установим зависимости и создадим файл agent.py.
Разбор ключевых элементов:
- MultiServerMCPClient — центральный компонент для подключения к MCP-серверам. Принимает конфигурацию с транспортом (stdio или http) и параметрами подключения.
- Транспорт stdio означает, что клиент запускает скрипт как подпроцесс. Удобно для разработки. В продакшене — лучше использовать HTTP.
- create_react_agent из LangGraph — готовая реализация ReAct-агента. Под капотом работает граф с двумя узлами: вызов LLM и выполнение инструментов.
- Агент работает асинхронно (async/await), что критично для эффективной работы с внешними API.
Часть 4. Демонстрация работы
Поместим PDF-документ в папку data/ и запустим агента.
Ваш запрос: Узнай погоду в Москве и создай тикет в репозитории myorg/docs с отчётом о погоде. Перед этим проверь в документации, как правильно оформлять такие тикеты.
[AGENT LOG] Thought: Мне нужно выполнить три действия: проверить документацию, узнать погоду, создать тикет.
Action: search_documentation
Action Input: {“query”: “как оформлять тикеты о погоде”}
Observation: [Фрагмент 1 из docs/internal-guide.pdf] Все отчёты о погоде должны содержать: город и дату, температуру и скорость ветра, рекомендации на основе погодных условий…
Thought: Теперь я знаю формат. Получу погоду в Москве.
Action: get_weather
Action Input: {“city”: “Moscow”}
Observation: Погода в Moscow: Температура: 18.5°C, Скорость ветра: 12 км/ч…
Thought: Теперь создам тикет с отчётом.
Action: create_github_issue
Action Input: { “repo”: “myorg/docs”, “title”: “Ежедневный отчёт о погоде в Москве”, “body”: “## Погода в Москве\n- Температура: 18.5°C\n- Ветер: 12 км/ч\n- Рекомендации: комфортная погода для прогулок”, “labels”: [“weather-report”, “automated”] }
Observation: Issue успешно создан.
Ответ: Я выполнил все запрошенные действия: проверил документацию, узнал погоду, создал тикет.
Что произошло:
- Агент самостоятельно спланировал последовательность действий.
- Вызвал RAG-инструмент для получения правил оформления.
- Использовал MCP-инструмент для получения погоды.
- Вызвал MCP-инструмент для создания Issue.
- Сформировал финальный ответ.
Сравнение с альтернативами и выводы
| Критерий | Классический подход (@tool) | Подход с MCP |
|---|---|---|
| Интеграция нового API | Писать функцию-обёртку, декорировать @tool, управлять ошибками вручную | Запустить готовый MCP-сервер или написать свой с FastMCP |
| Переиспользование | Инструмент жёстко привязан к коду агента | Один MCP-сервер могут использовать несколько агентов и приложений |
| Безопасность | Ключи API в коде или окружении агента | MCP-сервер работает в изолированном окружении со своими секретами |
| Стандартизация | Каждый инструмент — уникальная реализация | Единый протокол JSON-RPC, понятная структура |
| Сложность для простых задач | Минимальная | Требуется запуск отдельного процесса или сервера |
Преимущества MCP
- Масштабируемость: Экосистема MCP-серверов растёт — уже есть готовые решения для GitHub, Slack, Google Drive, PostgreSQL и других сервисов.
- Разделение ответственности: Команда интеграций может независимо разрабатывать MCP-серверы, а команда агентов — использовать их.
- Единый стандарт: MCP поддерживается Anthropic, OpenAI (через Agents SDK) и другими крупными игроками.
Минусы MCP
- Дополнительная прослойка: Для простых прототипов запуск MCP-сервера может быть избыточным.
- Молодость протокола: Спецификация ещё эволюционирует, возможны breaking changes.
- Отладка: Взаимодействие через JSON-RPC сложнее, чем прямой вызов функции (хотя MCP Inspector помогает).
Заключение
MCP — это не просто фреймворк, а стандарт взаимодействия, меняющий подход к построению AI-агентов. Вместо изобретения велосипеда для каждого API мы можем использовать готовые MCP-серверы или быстро создавать свои с FastMCP.
Мы построили агента, который:
- Использует внешние инструменты через стандартизированный MCP-протокол;
- Имеет доступ к внутренней базе знаний через RAG;
- Принимает решения автономно, следуя ReAct-паттерну.
Это архитектура, легко масштабируемая: добавить сервис — значит подключить ещё один MCP-сервер. Добавить документы — положить PDF в папку data/.
Будущее за модульными AI-системами. MCP — один из ключевых кирпичиков в этом фундаменте. Пора внедрять.