Skip to main content
Glama
SantoshpHiremath

rag-tool-agent

RAG Tool Agent — MCP-сервер

Предоставляет два инструмента, лежащие в основе проекта rag-tool-agent-demo (Q&A с опорой на поиск по заметкам набора данных FordA и безопасный арифметический калькулятор), как полноценный сервер Model Context Protocol, так что любой MCP-совместимый клиент — Claude Desktop, MCP-совместимая агентная обвязка или собственный хост — может вызывать их напрямую, а не только через собственный CLI этого проекта или через Flask HTTP-обёртку в rag-tool-api-docker.

Создан, чтобы закрыть конкретный, явно обозначенный пробел: несколько актуальных вакансий в сфере AI-инженерии/агентных приложений явно требуют практического опыта работы с MCP (и смежных протоколов agent-to-agent/agent-to-UI). Это небольшая, реальная, протестированная реализация, а не заявление об опыте работы с протоколом без доказательств.

Почему это так устроено

Оригинальный агент выполняет собственную маршрутизацию внутри: самодельный if/else, который для каждого входящего вопроса решает: «калькулятор» против «поиска» против «прямого ответа». MCP переворачивает это: клиент (хост LLM/агента) выполняет маршрутизацию, читая имя, описание и параметры JSON-schema каждого инструмента и решая, какой из них вызвать. Поэтому этот сервер не воссоздаёт исходную логику маршрутизации — он предоставляет две базовые возможности как автономные, независимо вызываемые MCP-инструменты и позволяет любому MCP-клиенту самому направлять к ним запросы. В этом и заключается суть протокола: инструменты становятся независимыми от хоста, а не жёстко встроенными в диспетчерскую логику одного агента.

  • search_notes(query: str) -> str — поиск по небольшому встроенному корпусу заметок о наборе данных FordA; результат возвращается с тем же суффиксом происхождения [Grounded in N retrieved chunk(s) from ...], который использует оригинальный агент, так что клиент может отличить обоснованный ответ от необоснованного. Используется небольшой ранжировщик по пересечению ключевых слов, а не пересоздаётся индекс FAISS/embeddings исходного проекта — суть этого проекта в слое предоставления через MCP, а не в дублировании той работы.

  • calculate(expression: str) -> str — арифметический инструмент, ограниченный + - * / () и числовыми литералами через безопасный вычислитель на основе ast (а не голый eval() для произвольного ввода). Проверено, что он отклоняет как неарифметический ввод, так и попытки инъекций, например __import__('os').system(...).

  • Создан с использованием официального Python SDK mcp (FastMCP) — того же SDK, который Anthropic публикует для создания MCP-серверов.

Related MCP server: rag-mcp

Запуск

pip install -r requirements.txt
python server.py

Работает через stdio — стандартный локальный транспорт, который MCP-клиенты, такие как Claude Desktop, используют для запуска сервера и общения с ним как с подпроцессом. Чтобы подключить Claude Desktop к нему, добавьте в его конфигурацию MCP-сервера:

{
  "mcpServers": {
    "rag-tool-agent": {
      "command": "python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}

Запуск тестов

pytest tests/ -v

11 тестов, все проходят — вызываются функции инструментов напрямую (для модульного покрытия самой логики инструментов транспорт MCP не нужен): обоснованные ответы на поисковые запросы, контракт на количество обоснований, корректность арифметики (включая пример деления, совпадающий с документированным примером самого оригинального агента), отклонение неарифметического и инъекционного ввода, обработка деления на ноль и самостоятельная регистрация инструментов с описаниями.

Проверено как настоящий MCP-сервер, а не просто как функции

Помимо модульных тестов, проведена сквозная проверка с использованием настоящего клиентского SDK mcp (ClientSession + stdio_client): запуск server.py как реального подпроцесса, выполнение рукопожатия MCP initialize, вызов list_tools() и вызов обоих инструментов по реальному протоколу:

TOOLS: ['search_notes', 'calculate']
calculate -> 1320 / (3601 + 1320) = 0.2682381629750051
search_notes -> The FordA dataset is a univariate time-series
  classification dataset... [Grounded in 3 retrieved chunk(s) from
  forda_dataset_notes.md]
calculate(injection) -> Error: could not evaluate "__import__('os')" ...

Это подтверждает, что сервер поддерживает настоящий MCP (рукопожатие, обнаружение инструментов, вызов инструментов), а не только то, что лежащие в основе функции Python работают по отдельности.

Связь с двумя другими проектами

  • rag-tool-agent-demo — оригинальный CLI-агент: LangChain, FAISS, Ollama, поисковая цепочка LCEL, инструмент-калькулятор, маршрутизация на основе LLM.

  • rag-tool-api-docker — тот агент, обёрнутый в Flask HTTP API, контейнеризированный (Docker, многоступенчатая сборка, пользователь без root-прав, проверка состояния), проверенный реальными HTTP-запросами к запущенному контейнеру.

  • Этот проект — те же базовые возможности (поиск, калькулятор), предоставляемые через MCP вместо HTTP, так что их может вызывать любой MCP-хост, а не только REST-клиент.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables document search, read-only SQL querying, arithmetic calculation, and corpus introspection through MCP tools, allowing Claude to dynamically discover and chain these tools together to answer multi-step questions.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables querying local documents via retrieval-augmented generation, along with current UTC datetime and safe arithmetic evaluation through MCP tools over HTTP.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Provides a document store, web search, and safe calculator as MCP tools, enabling both offline and LLM-driven clients to discover and call them over the Model Context Protocol.
    6
    MIT