mcp-tool-hub
MCP Tool Hub
Модульный, расширяемый мультисерверный хаб Model Context Protocol, созданный на TypeScript для команд автоматизации ИТ.
Предоставьте вашей LLM доступ к реальным инструментам: файлам, Git, веб-контенту и постоянной памяти. Развертывайте на любое количество клиентских машин одновременно с помощью Ansible.
Архитектура
mcp-tool-hub/
├── packages/
│ ├── core/ ← Shared types + BaseMCPServer abstract class
│ ├── server-filesystem/ ← Sandboxed local file access (read/write/list/delete)
│ ├── server-git/ ← Git log, diff, file contents, branches, status
│ ├── server-fetch/ ← Web fetching: HTML, JSON APIs, URL health checks
│ └── server-memory/ ← Persistent JSON knowledge base (survives restarts)
├── host/ ← Orchestrator: registry + CLI + stdio JSON interface
├── ansible/ ← Playbook, inventory, systemd service templates
└── docs/ ← How to add new servers (with template)Архитектура следует шаблону Model Context Protocol:
Каждый сервер полностью независим — свой пакет, своя сборка
Реестр в хосте сопоставляет
toolName → serverво время выполненияCLI предоставляет интерфейс stdio JSON — любая интеграция с LLM отправляет
{"toolName":"...", "arguments":{...}}в stdin и считывает результат из stdoutДобавление нового сервера = создание пакета, расширение
BaseMCPServer, регистрация вcli.ts
Быстрый старт
1. Установка и сборка
git clone https://github.com/your-org/mcp-tool-hub.git
cd mcp-tool-hub
npm install
npm run build2. Настройка
cp .env.example .env
# Edit .env with your paths and settings3. Запуск
# Via npm
npm run start --workspace=host
# Or directly
node host/dist/cli.js4. Вызов инструмента
Отправьте JSON в stdin, получите JSON из stdout:
echo '{"toolName":"read_file","arguments":{"path":"hello.txt"}}' | node host/dist/cli.jsДоступные инструменты
📁 Сервер файловой системы
Все операции ограничены песочницей MCP_FS_ROOT. Обход путей (../) заблокирован.
Инструмент | Описание |
| Чтение содержимого файла (utf8 или base64) |
| Запись или добавление в файл |
| Список содержимого директории (опционально рекурсивно) |
| Удаление файла |
| Перемещение или переименование файла |
| Получение размера, дат и типа пути |
🔀 Сервер Git
Только для чтения. Операции записи отсутствуют.
Инструмент | Описание |
| История коммитов для репозитория или файла |
| Содержимое файла в конкретном коммите/ветке |
| Разница между двумя ссылками (refs) |
| Статус рабочего дерева |
| Список веток (локальные + опционально удаленные) |
| Полные детали коммита и diff |
🌐 Сервер Fetch
Поддерживает опциональный список разрешенных доменов через MCP_FETCH_ALLOWED_DOMAINS.
Инструмент | Описание |
| Получение HTML или текста по URL |
| Получение и разбор ответа JSON API |
| Проверка доступности URL (HEAD-запрос) |
🧠 Сервер памяти
Постоянная память между перезапусками. Работает на основе JSON-файла.
Инструмент | Описание |
| Сохранение значения с ключом, пространством имен и тегами |
| Получение значения по ключу |
| Полнотекстовый поиск по всем записям |
| Удаление записи |
| Список всех пространств имен с количеством записей |
| Удаление всех записей в пространстве имен |
Развертывание через Ansible
Развертывание на все клиентские машины одновременно:
cd ansible
# First time
ansible-playbook -i inventory.yml deploy-mcp-hub.yml
# Update only (rebuild + restart)
ansible-playbook -i inventory.yml deploy-mcp-hub.yml --tags update
# Deploy to specific group
ansible-playbook -i inventory.yml deploy-mcp-hub.yml --limit serversПлейбук:
Устанавливает Node.js 20 (если отсутствует)
Создает выделенного системного пользователя
mcp-hubКопирует и собирает проект
Записывает конфигурацию
.envиз ваших переменных AnsibleУстанавливает и запускает systemd-службу (автоматический перезапуск при сбое)
Переменные для каждого хоста в inventory.yml позволяют настраивать разные разрешенные домены, уровни логирования и пути для каждой группы машин.
Добавление нового сервера
См. docs/adding-a-new-server.template.ts для получения полного шаблона с комментариями.
Вкратце:
// 1. Create packages/server-myservice/src/my-server.ts
export class MyServer extends BaseMCPServer {
constructor(options: MyOptions) {
super(SERVER_INFO, options);
this.registerTool("my_tool", this.handleMyTool.bind(this));
}
private async handleMyTool(args) {
return this.ok({ result: "done" });
}
}
// 2. Register in host/src/cli.ts
hub.use(new MyServer({ apiKey: process.env.MY_API_KEY! }));Идеи: server-slack, server-postgres, server-docker, server-ansible, server-ssh, server-jira
Переменные окружения
Переменная | По умолчанию | Описание |
|
| Корневая директория для всех данных хаба |
|
| Корень песочницы файловой системы |
|
| Базовый путь для репозиториев Git |
|
| Файл хранилища памяти |
| (пусто = все) | Список разрешенных доменов через запятую |
|
|
|
Примечания по безопасности
Файловая система: Строго ограничена песочницей. Атаки обхода путей возвращают ошибку, а не данные.
Git: Только чтение. Операции
commit,pushилиcloneне предоставляются.Fetch: Опциональный список разрешенных доменов предотвращает SSRF к внутренним сервисам.
Systemd-служба: Запускается от имени пользователя без прав root с параметрами
PrivateTmp=trueиNoNewPrivileges=true.
Требования
Node.js ≥ 18 (для нативного API
fetch)Git (для
server-git)Linux с systemd (для развертывания через Ansible)
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TOMJARA/mcp-tool-hub'
If you have feedback or need assistance with the MCP directory API, please join our Discord server