mcp-tool-hub
MCP Tool Hub
Un hub modular y extensible de servidores múltiples Model Context Protocol — construido en TypeScript para equipos de automatización de TI.
Proporciona a tu LLM acceso a herramientas del mundo real: archivos, Git, contenido web y memoria persistente. Despliega en cualquier número de máquinas cliente simultáneamente mediante Ansible.
Arquitectura
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)La arquitectura sigue el patrón del Model Context Protocol:
Cada servidor es completamente independiente: su propio paquete, su propia compilación
El registro en el host mapea
toolName → serveren tiempo de ejecuciónLa CLI expone una interfaz JSON stdio: cualquier integración de LLM envía
{"toolName":"...", "arguments":{...}}a stdin y lee el resultado desde stdoutAñadir un nuevo servidor = crear un paquete, extender
BaseMCPServer, registrar encli.ts
Inicio rápido
1. Instalar y compilar
git clone https://github.com/your-org/mcp-tool-hub.git
cd mcp-tool-hub
npm install
npm run build2. Configurar
cp .env.example .env
# Edit .env with your paths and settings3. Ejecutar
# Via npm
npm run start --workspace=host
# Or directly
node host/dist/cli.js4. Llamar a una herramienta
Envía JSON a stdin, obtén JSON desde stdout:
echo '{"toolName":"read_file","arguments":{"path":"hello.txt"}}' | node host/dist/cli.jsHerramientas disponibles
📁 Servidor de sistema de archivos
Todas las operaciones están aisladas en MCP_FS_ROOT. El recorrido de rutas (../) está bloqueado.
Herramienta | Descripción |
| Leer el contenido de un archivo (utf8 o base64) |
| Escribir o añadir contenido a un archivo |
| Listar el contenido de un directorio (opcionalmente recursivo) |
| Eliminar un archivo |
| Mover o renombrar un archivo |
| Obtener tamaño, fechas y tipo de una ruta |
🔀 Servidor Git
Solo lectura. Sin operaciones de escritura.
Herramienta | Descripción |
| Historial de commits de un repositorio o archivo |
| Contenido de un archivo en un commit/rama específico |
| Diferencias entre dos referencias |
| Estado del árbol de trabajo |
| Listar ramas (locales + remotas opcionales) |
| Detalles completos del commit y diferencias |
🌐 Servidor de obtención (Fetch)
Admite una lista blanca de dominios opcional mediante MCP_FETCH_ALLOWED_DOMAINS.
Herramienta | Descripción |
| Obtener HTML o texto de una URL |
| Obtener y analizar una respuesta de API JSON |
| Comprobar si una URL es accesible (solicitud HEAD) |
🧠 Servidor de memoria
Persistente tras reinicios. Respaldado por un archivo JSON.
Herramienta | Descripción |
| Almacenar un valor con clave, espacio de nombres y etiquetas |
| Recuperar un valor por clave |
| Búsqueda de texto completo en todas las entradas |
| Eliminar una entrada |
| Listar todos los espacios de nombres con sus conteos |
| Eliminar todas las entradas en un espacio de nombres |
Despliegue con Ansible
Despliega en todas tus máquinas cliente simultáneamente:
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 serversEl playbook:
Instala Node.js 20 (si no está presente)
Crea un usuario de sistema dedicado
mcp-hubCopia y compila el proyecto
Escribe la configuración
.envdesde tus variables de AnsibleInstala e inicia un servicio systemd (reinicio automático en caso de fallo)
Las variables por host en inventory.yml te permiten configurar diferentes dominios permitidos, niveles de registro y rutas por grupo de máquinas.
Añadir un nuevo servidor
Consulta docs/adding-a-new-server.template.ts para ver la plantilla completa con comentarios.
En resumen:
// 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! }));Ideas: server-slack, server-postgres, server-docker, server-ansible, server-ssh, server-jira
Variables de entorno
Variable | Predeterminado | Descripción | |||
|
| Raíz para todos los datos del hub | |||
|
| Raíz del entorno aislado del sistema de archivos | |||
|
| Ruta base de los repositorios Git | |||
|
| Archivo de almacenamiento de memoria | |||
| (vacío = todos) | Lista blanca de dominios separados por comas | |||
|
| `debug | info | warn | error` |
Notas de seguridad
Sistema de archivos: Estrictamente aislado. Los ataques de recorrido de rutas devuelven un error, no datos.
Git: Solo lectura. No se exponen operaciones de
commit,pushoclone.Fetch: La lista blanca de dominios opcional evita SSRF a servicios internos.
Servicio Systemd: Se ejecuta como un usuario sin privilegios de root con
PrivateTmp=trueyNoNewPrivileges=true.
Requisitos
Node.js ≥ 18 (para la API
fetchnativa)Git (para
server-git)Linux con systemd (para el despliegue con 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