Блог и новости

Оптимизация контекстного окна: фильтрация инструментов в Pingera MCP Server

AI Блог Новости
Фильтрация инструментов в Model Context Protocol
В Pingera мы понимаем, что ИИ и агенты меняют правила игры во всех сферах нашей жизни. Именно поэтому мы продолжаем улучшать наш Model Context Protocol (MCP) сервер, который служит для интеграции AI-агентов с нашей платформой. С ростом экосистемы количество доступных инструментов (tools, в контексте MCP) в нашем сервере достигло 79. Когда языковая модель (LLM) получает описание каждого из них, контекстное окно забивается лишними данными, что ведет к росту задержек и стоимости запросов.
Сегодня мы представляем обновление, которое позволяет гибко управлять набором доступных инструментов через фильтрацию. Это критически важно для экономии ресурсов контекстного окна и повышения точности работы моделей.

Зачем фильтровать инструменты?

Передача полного списка из 79 инструментов в модель — это неэффективно. Опыт показывает, что для решения конкретной задачи агенту обычно требуется от 3 до 10 специализированных инструментов.
Ограничение набора инструментов дает два ключевых преимущества:
  1. Экономия токенов: уменьшение объема системного промпта на 60–90%.
  2. Качество ответов: модели проще выбрать нужный инструмент, когда она не отвлекается на десятки нерелевантных описаний. Это снижает вероятность галлюцинаций при вызове функций.

Реализация через Middleware

Мы реализовали механизм фильтрации на базе функционала FastMCP Middleware. Это позволяет динамически ограничивать список инструментов как при локальном запуске (через STDIO), так и при работе по сети (через HTTP/SSE).
Подробнее ознакомиться с нашей реализацией логики фильтрации можно в файле middleware.py нашего репозитория.
1. Локальный режим (STDIO)
Если вы используете сервер локально, достаточно передать флаг --tools при запуске. Это полезно для отладки или работы с узкоспециализированными агентами.
Пример конфигурации:
python main.py --transport-mode=stdio --tools=list_pages,get_page_details,list_checks
2. Сетевой режим (HTTP/SSE)

Для многопользовательского режима, где авторизация и контекст изолированы для каждого запроса, мы добавили поддержку кастомного заголовка X-MCP-Tools. Это позволяет каждому клиенту определять свой набор инструментов «на лету» без перезагрузки сервера.

Пример настройки клиента в LangGraph (можно посмотреть в mcp_client_lg.py):
client = MultiServerMCPClient(
    {
        "pingera": {
            "url": SERVER_URL,
            "transport": "streamable_http",
            "headers": {
                "Authorization": PINGERA_API_KEY,
                "X-MCP-Tools": "list_pages,get_page_details,list_checks"
            },
        }
    }
)

Изоляция и авторизация

Напомним, что в сетевом режиме наш сервер использует утилиту extract_auth_from_request() для извлечения JWT или API-ключа из заголовка Authorization. Теперь, вместе с авторизацией, сервер считывает X-MCP-Tools и через middleware подменяет список доступных методов. Это гарантирует, что пользователь получит доступ только к тем инструментам, которые необходимы для текущей сессии.

Итоги

Фильтрация инструментов — это шаг к созданию более эффективного и дешевого AI-агента. Вместо того чтобы «кормить» модель всем списком из 79 инструментов, вы даете ей только то, что нужно здесь и сейчас.