Собираем AI-агента нового поколения: Python, RAG и внешние инструменты через MCP

Собираем AI-агента нового поколения: Python, RAG и внешние инструменты через MCP

Введение: от простых цепочек к агентам, которые действуют

Ещё пару лет назад типичное 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).

  1. Агент получает задачу от пользователя.
  2. Модель решает, какой инструмент вызвать и с какими параметрами.
  3. Агент вызывает инструмент и получает результат («наблюдение»).
  4. Цикл повторяется, пока модель не сочтёт информацию достаточной для ответа.

Ключевое отличие от обычной цепочки — модель сама решает, когда и какие инструменты использовать, а не следует жёсткому сценарию.

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 — один из ключевых кирпичиков в этом фундаменте. Пора внедрять.

Читать оригинал