LangChain и MCP: подключаем MCP-инструменты к агенту на LangGraph
MCP-серверы дают агенту готовые инструменты, а адаптеры превращают их в инструменты LangChain. Показываем актуальный способ и запуск на моделях через OpenAI-совместимый шлюз.
5 мин · · агенты · разработка
Если вы строите агента на LangChain или LangGraph, то рано или поздно захотите подключить к нему готовые MCP-серверы: GitHub, базы данных, файловую систему, собственные утилиты. Для этого нужны адаптеры, превращающие инструменты MCP в инструменты LangChain. Ниже разбираем, как сделать langchain mcp сегодня, что поменялось в библиотеках и как запустить такого агента на моделях через OpenAI-совместимый шлюз.
Информация о библиотеках сверена с README langchain-mcp-adapters и руководством по миграции в документации LangChain на 18 октября 2026. Разработка идёт быстро, поэтому имена классов и версии проверяйте по актуальной документации.
MCP и адаптеры в двух словах
MCP (Model Context Protocol) — протокол, по которому сервер объявляет инструменты, а клиент их вызывает. Агенту не нужно знать, как устроен GitHub или база данных: он видит список инструментов с описаниями и параметрами. Адаптер LangChain подключается к MCP-серверу, получает список инструментов и оборачивает каждый так, чтобы агент мог вызвать его как обычный инструмент LangChain. Что такое MCP-сервер и как их подключают в других программах, описано в статье MCP-сервер: что это.
Что изменилось: langchain-mcp-adapters и langchain.mcp
Это важно, если вы читаете старые примеры. Репозиторий langchain-mcp-adapters, по его README, больше не поддерживается активно: поддержку MCP перенесли внутрь LangChain, в пространство имён langchain.mcp. По руководству по миграции:
- новый код требует
langchain[mcp]версии 1.4.0 или новее и находится в бете (импорт даёт предупреждениеLangChainBetaWarning, API может измениться); - вместо
MultiServerMCPClientиспользуется классMCPAdapter, а конфигурация серверов задаётся в стандартной формеmcpServers; - у серверов, объявленных в одном конфиге, имена инструментов получают префикс
{сервер}_{инструмент}.
Старые проекты на langchain-mcp-adapters продолжат работать, но для нового кода разумнее брать новый вариант. Ниже оба.
Подготовка
Сначала пример MCP-сервера, который умеет складывать и умножать (взят из README адаптеров):
Файл math_server.py:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Math")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return a * b
if __name__ == "__main__":
mcp.run(transport="stdio")Установка для нового варианта:
pip install "langchain[mcp]" langchain-openai langgraphКлюч fetch_... создайте в кабинете и положите в переменную окружения ZUKKO_API_KEY.
Агент LangChain с MCP-инструментами
Модель подключается как обычный ChatOpenAI, у которого вместо адреса OpenAI указан шлюз: https://api.zukko.pro/v1. Менять модель можно одной строкой.
import asyncio
import os
from langchain.agents import create_agent
from langchain.mcp import MCPAdapter
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-6.1-sol",
base_url="https://api.zukko.pro/v1",
api_key=os.environ["ZUKKO_API_KEY"],
)
config = {Транспорт определяется по записи: у сервера с command и args это процесс на вашей машине (stdio), у записи с url — HTTP-сервер. Для одного сервера можно передать адрес или путь к скрипту напрямую.
То же на langchain-mcp-adapters
Если в проекте уже стоит langchain-mcp-adapters, код по README выглядит так:
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient(
{
"math": {
"command": "python",
"args": ["/полный/путь/math_server.py"],
"transport": "stdio",
},
"weather": {
"url": "http://localhost:8000/mcp",
"transport": "http",
},
}
)
tools = await client.get_tools() # внутри async-функции
agent = create_agent(llm, tools)Остальное (модель, вызов ainvoke) не меняется. Если MCP-инструмент вернул ошибку выполнения, по умолчанию она попадает к модели как ToolMessage со статусом ошибки, и агент может поправить вызов сам.
LangGraph и MCP
Если нужен собственный граф вместо готового агента, инструменты подключаются так же, а модель привязывается через bind_tools. Схема по README адаптеров:
from langgraph.graph import StateGraph, MessagesState, START
from langgraph.prebuilt import ToolNode, tools_condition
model = llm.bind_tools(tools) # tools получены через adapter.list_tools() или client.get_tools()
def call_model(state: MessagesState):
return {"messages": model.invoke(state["messages"])}
builder = StateGraph(MessagesState)
builder.add_node(call_model)
builder.add_node(ToolNode(tools))
builder.add_edge(START, "call_model")
builder.add_conditional_edges("call_model", tools_condition)
builder.add_edge("tools", "call_model")
graph = builder.compile()Здесь call_model вызывает модель, tools_condition решает, нужен ли вызов инструмента, а ToolNode его выполняет. Цикл повторяется, пока модель не ответит текстом. Для llamaindex mcp схема та же по смыслу: в LlamaIndex есть своя интеграция с MCP-серверами (пакет ищите в документации LlamaIndex), которая превращает инструменты в инструменты LlamaIndex. Названия классов там мы не проверяли, сверяйтесь с документацией. Общий подход к LlamaIndex на шлюзе: LlamaIndex: подключение.
Какую модель брать для агента с инструментами
Инструменты вызывает сама модель, и справляются с этим модели по-разному, поэтому проверьте выбранную на своих задачах. По цене и индексу силы (Intelligence Index) на 18 октября 2026 есть из чего выбирать:
| Модель | Вход / выход, $ за 1M | Контекст | Индекс |
|---|---|---|---|
claude-sonnet-5-5 | 0.4 / 2 | 1M | 48 |
gpt-6.1-sol | 0.27 / 1.32 | 1M | 52 |
deepseek-v4.1-flash | 0.013 / 0.038 | 1M | 39 |
Агент отправляет модели всю историю на каждом шаге, поэтому расход растёт с числом шагов. Пример: 8 шагов, на каждом в среднем 6K токенов входа и 300 токенов выхода. Итого 48K входа и 2.4K выхода.
deepseek-v4.1-flash: 0.048 × 0.013 + 0.0024 × 0.038 = 0.000624 + 0.0000912 ≈ $0.0007;claude-sonnet-5-5: 0.048 × 0.4 + 0.0024 × 2 = 0.0192 + 0.0048 = $0.024.
Кэш тарифицируется отдельно. Для Claude скидку за кэш даёт только Anthropic-формат, поэтому при ChatOpenAI весь вход идёт по цене входа. Если нужен Claude с кэшем, используйте клиент Anthropic для LangChain с адресом https://api.zukko.pro без /v1 (имя параметра адреса сверьте с документацией пакета). Для GPT чтение кэша видно в обоих форматах. Подробнее: чтение и запись кэша.
Описания всех инструментов MCP попадают в запрос и считаются как входные токены. Подключайте только те серверы и инструменты, которые нужны. Чтобы агент в цикле не потратил лишнего, заведите ключ с дневным лимитом.
Типичные проблемы
- stdio в веб-сервере. README адаптеров предупреждает: stdio задуман для приложений на машине пользователя. Для серверного приложения лучше HTTP-транспорт.
- Абсолютные пути. Для stdio-серверов указывайте полный путь к скрипту.
- 404
model_not_found. Неверное имя модели. Список —GET /v1/models. - 401. Неверный ключ. 402: не хватает баланса. 403
model_not_allowed_for_key: модели нет в списке ключа. - Модель не вызывает инструмент. Улучшите описание инструмента или попробуйте другую модель.
Доступ из России — через шлюз, оплата СБП (платёжная страница добавляет 8,5% сверху), картой MasterCard или криптой.
Частые вопросы
Нужен ли langchain-mcp-adapters, если есть langchain.mcp?
Для нового кода можно брать langchain.mcp, но он в бете. Проекты на старом пакете продолжают работать, однако сам репозиторий больше не поддерживается активно.
Какой base URL указывать в LangChain?
Для ChatOpenAI: https://api.zukko.pro/v1. Для клиента Anthropic: https://api.zukko.pro без /v1.
Можно ли использовать не-OpenAI модели в ChatOpenAI?
Да. Шлюз принимает любую модель в OpenAI-формате: меняйте строку model (например, на claude-sonnet-5-5 или deepseek-v4.1-flash).
Как ограничить расход агента?
Создайте отдельный ключ, задайте дневной и месячный лимит и список разрешённых моделей: лимиты ключа и кэш.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Промпт-инъекция: что это и как защитить бота и агентаОбъясняем, как работает промпт-инъекция через пользовательский ввод и чужие документы, и какие меры снижают ущерб: изоляция данных, права инструментов, лимиты ключа.
- Claude Code YOLO: режимы разрешений и работа без подтвержденийОтдельного режима YOLO в Claude Code нет, зато есть шесть режимов разрешений и гибкие правила. Разбираем, как перестать нажимать «Да» и не лишиться файлов.
- Claude Code: чек-лист лучших практик для ежедневной работыПривычки, которые делают работу с Claude Code предсказуемой: короткий CLAUDE.md, план перед правками, мелкие задачи, проверка результата и контроль расхода.
- MCP-сервер на Java: минимальный пример с одним инструментомПишем минимальный MCP-сервер на Java с одним инструментом, регистрируем его в Claude Code и учимся находить причину, если агент его не видит.