Skip to main content
Glama
lapaduga

MCP Tools Hub

by lapaduga

MCP Tools Hub

Веб-интерфейс для просмотра и вызова MCP-инструментов с чат-агентом, планировщиком и оркестрацией цепочек вызовов.

Быстрый старт

# Установка зависимостей
npm install

# Настройка окружения
cp .env.example .env
# Отредактировать CHAT_API_KEY в .env

# Запуск
npm start
# → http://localhost:3000

Related MCP server: Swagger MCP Server

Тестирование

# Только локальные инструменты
npm test

# Все тесты (локальные + внешние)
npm run test:all

# Только E2E-тест оркестрации
npm run test:orch

Архитектура

src/
├── api/            # REST-роуты (tools, scheduler, admin)
├── mcp/
│   ├── tools/      # Локальные инструменты + registry
│   ├── server.js   # MCP-сервер (SSE transport)
│   └── client-manager.js  # Подключение к внешним MCP-серверам
├── public/         # Фронтенд (app.js, chat.js, styles.css, index.html)
├── scheduler/      # Планировщик (reminder + periodic)
└── shared/         # Config, Logger, AppContext

Длинный флоу (Orchestration)

Чат-агент умеет выполнять цепочки из нескольких инструментов, где LLM сама решает, какой инструмент вызвать следующим, на основе результатов предыдущих шагов.

Пример цепочки из 4 шагов

Запрос пользователя:

Получи пользователя #1, сохрани его имя в заметку,
создай напоминание через 2 секунды о заметке, и покажи сводку задач.

Ожидаемая цепочка вызовов:

┌─────────────────────────────────────────────────┐
│  Шаг 1: get_user(userId: 1)                    │
│  → "Leanne Graham, Gwenborough"                │
├─────────────────────────────────────────────────┤
│  Шаг 2: save_note(title: "Leanne Graham",      │
│                   content: "Пользователь #1")  │
│  → "Заметка сохранена: notes/Leanne Graham.md" │
├─────────────────────────────────────────────────┤
│  Шаг 3: create_reminder(message: "Напомни о     │
│          заметке Leanne Graham", delaySeconds:2)│
│  → "Напоминание создано через 2 сек"           │
├─────────────────────────────────────────────────┤
│  Шаг 4: get_summary()                          │
│  → "Всего заметок: 5, задач в scheduler: 2..." │
├─────────────────────────────────────────────────┤
│  Ответ LLM: "Готово. Пользователь Leanne Graham │
│  сохранён, напоминание создано. Вот сводка..."  │
└─────────────────────────────────────────────────┘

Механизм:

  1. LLM получает запрос → анализирует → решает какие инструменты нужны

  2. Вызывает get_user через TOOL_CALL

  3. Сервер выполняет инструмент, возвращает результат LLM

  4. LLM анализирует результат → решает вызвать save_note

  5. Повторяет пока не выполнит все шаги (макс 5)

  6. После выполнения всех шагов — отвечает пользователю

Ветвление: LLM может принимать разные решения на основе данных:

  • Если get_weather вернул t > 15°C → save_note("Тепло")

  • Если t <= 15°C → save_note("Холодно")

Параллельные вызовы: Если LLM возвращает несколько TOOL_CALL на одной строке, они выполняются через Promise.all.

Отложенные задачи: create_reminder c callback.messages — планировщик запускает LLM-цепочку через N секунд и пушит результат через SSE.

SSE-события

Тип

Назначение

tool_step

Промежуточный шаг цепочки (real-time обновление UI)

tool_chain_result

Результат цепочки от планировщика (scheduler callback)

Формат TOOL_CALL

TOOL_CALL: {"tool": "имя_инструмента", "arguments": {}}
  • Строго одной строкой

  • JSON без дополнительного текста внутри

  • Несколько TOOL_CALL через \n — параллельное выполнение

Источники инструментов

  • локальный — встроенные инструменты (src/mcp/tools/*.js)

  • внешний:everything — @modelcontextprotocol/server-everything

  • внешний:math — второй экземпляр server-everything (для демонстрации multi-сервера)

Переменные окружения (.env)

PORT=3000                # Порт сервера
LOG_LEVEL=info           # Уровень логирования
MCP_EXTERNAL_ENABLED=true # Включить внешние MCP-серверы
MCP_EXTERNAL_SERVERS=...  # Список серверов (id,command,args;...)
CHAT_API_KEY=sk-...      # API-ключ DeepSeek
CHAT_MODEL=deepseek-chat # Модель для чата

Related MCP Connectors

Related MCP Servers