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:

bash
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")

Установка для нового варианта:

bash
pip install "langchain[mcp]" langchain-openai langgraph

Ключ fetch_... создайте в кабинете и положите в переменную окружения ZUKKO_API_KEY.

Агент LangChain с MCP-инструментами

Модель подключается как обычный ChatOpenAI, у которого вместо адреса OpenAI указан шлюз: https://api.zukko.pro/v1. Менять модель можно одной строкой.

bash
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 выглядит так:

bash
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 адаптеров:

bash
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-50.4 / 21M48
gpt-6.1-sol0.27 / 1.321M52
deepseek-v4.1-flash0.013 / 0.0381M39

Агент отправляет модели всю историю на каждом шаге, поэтому расход растёт с числом шагов. Пример: 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.