Skip to main content
Glama
DunkelCloud

ToolMesh

Official
by DunkelCloud

ToolMesh: permite que los agentes de IA interactúen con sistemas reales. De forma segura.

La capa de control que faltaba entre los agentes de IA y los sistemas empresariales. ToolMesh convierte las llamadas a herramientas de IA no controladas en un proceso gobernado y auditable, y conecta cualquier API REST o servidor MCP en minutos, no en meses.

Go License CI Go Report Card

30 líneas de YAML. Sin servidores que construir.

En la práctica, los servidores MCP solo exponen una fracción de la API REST que envuelven, y pronto te encontrarás con limitaciones. ToolMesh te permite reemplazar la capa envoltorio con archivos .dadl, un formato YAML declarativo que describe cualquier API REST como herramientas MCP. No hay servidor envoltorio que construir, desplegar o mantener.

Current:    Claude → ToolMesh → MCP Server → REST API
With DADL:  Claude → ToolMesh → REST API (via .dadl file)

No escribes el YAML a mano. Se lo pides a un LLM. Claude, GPT, Gemini: cualquier modelo que conozca la especificación DADL genera un archivo .dadl funcional en segundos. Describe lo que necesitas, suelta el archivo en config/dadl/ y listo.

"Crea un DADL para la API de GitHub: listar repositorios, abrir incidencias y crear solicitudes de extracción (pull requests)."

10 segundos. Funciona con cualquier LLM que conozca el formato.

Y a diferencia de las puertas de enlace MCP que simplemente pasan las llamadas a las herramientas, ToolMesh añade lo que los despliegues en producción realmente necesitan:

  • Seguridad de credenciales: secretos inyectados en el momento de la ejecución, nunca en prompts o configuraciones de clientes LLM.

  • Autorización: control detallado de usuario → plan → herramienta (OpenFGA).

  • Control de entrada y salida: las políticas JS bloquean datos confidenciales y filtran respuestas.

  • Pista de auditoría: cada llamada a herramienta registrada con logs estructurados o SQLite consultable.

Related MCP server: MCPGate

Los seis pilares

Pilar

Qué hace

Respaldado por

Cualquier Backend

30 líneas de DADL reemplazan todo un servidor MCP. También actúa como proxy de servidores MCP existentes.

Go MCP SDK + DADL (archivos .dadl)

Modo Código

¿15 servidores MCP a la vez? Sin ToolMesh, imposible. El Modo Código reduce más de 50,000 tokens a ~1,000.

Llamadas a herramientas analizadas por AST

Almacén de credenciales

Secretos inyectados en el momento de la ejecución: nunca en prompts, nunca en configuraciones de clientes LLM

Inyección por solicitud a través de la tubería del Ejecutor

OpenFGA

Autorización detallada (usuario → plan → herramienta). Ejemplo: los usuarios gratuitos tienen acceso de solo lectura, los pro tienen acceso total.

OpenFGA

Puerta (Gate)

Bloquea datos confidenciales antes de la ejecución, redacta PII en las respuestas

goja

Auditoría

Cada llamada a herramienta registrada y consultable: responde a "¿qué hizo ese agente?" con SQL

slog / SQLite

Prueba la demo

¿Quieres probar ToolMesh antes de instalarlo? Conéctate a nuestra instancia de demostración pública: sin Docker, sin configuración, sin claves API:

demo.toolmesh.io: APIs de Hacker News a través de ToolMesh. Funciona con Claude Desktop, Claude Code y ChatGPT. Inicio de sesión: dadl / toolmesh.

Inicio rápido

# Clone
git clone https://github.com/DunkelCloud/ToolMesh.git
cd ToolMesh

# Configure
cp .env.example .env
# IMPORTANT: Set a password — without it, all requests are rejected:
#   TOOLMESH_AUTH_PASSWORD=my-secret-password
# Or set an API key for programmatic access:
#   TOOLMESH_API_KEY=my-api-key

# Optional: local overrides (build locally, enable OpenFGA, HTTPS proxy, ...)
# cp docker-compose.override.yml.example docker-compose.override.yml
# # then edit docker-compose.override.yml — picked up automatically by Docker Compose

# Start (runs in bypass mode by default — no authz required)
docker compose up -d

# Verify it's running (default port: 8123)
curl http://localhost:8123/health

# MCP endpoint: http://localhost:8123/mcp
# Note: Most MCP clients require HTTPS — see TLS section below

TLS (importante)

ToolMesh por sí mismo sirve HTTP plano. La mayoría de los clientes MCP, incluido Claude Desktop, requieren HTTPS y rechazarán las URLs http://. Necesitas un proxy inverso que termine TLS frente a ToolMesh:

Opción

Cuándo usar

Caddy

Autoalojado con un dominio público: certificados automáticos de Let's Encrypt

Cloudflare Tunnel

No se necesitan puertos abiertos, TLS sin configuración

nginx / Traefik

Ya presente en tu stack

Solo para desarrollo local, puedes omitir TLS editando claude_desktop_config.json manualmente (la interfaz gráfica impone https://).

Conectar a Claude Desktop

Añade esto a tu configuración MCP de Claude Desktop:

{
  "mcpServers": {
    "toolmesh": {
      "url": "https://toolmesh.example.com/mcp"
    }
  }
}

Para desarrollo local sin proxy TLS:

{
  "mcpServers": {
    "toolmesh": {
      "url": "http://localhost:8123/mcp"
    }
  }
}

Conectar a Claude.ai (Conector personalizado)

ToolMesh admite OAuth 2.1 con PKCE S256 para acceso remoto. Configura los usuarios en config/users.yaml y utiliza la URL HTTPS pública como punto de conexión MCP.

Autenticación

ToolMesh admite dos métodos de autenticación que pueden usarse de forma independiente o conjunta. Todo el estado de OAuth (tokens, códigos de autenticación, clientes) se persiste en Redis y sobrevive a los reinicios del servidor.

OAuth 2.1 (Inicio de sesión interactivo)

Define usuarios en config/users.yaml con contraseñas cifradas con bcrypt:

users:
  - username: admin
    password_hash: "$2a$10$..."
    company: dunkelcloud
    plan: pro
    roles: [admin]

Genera hashes de contraseña con cualquier utilidad compatible con bcrypt:

htpasswd -nbBC 10 "" "my-password" | cut -d: -f2

Para configuraciones de un solo usuario, TOOLMESH_AUTH_PASSWORD sigue funcionando como respaldo. Configura la identidad con TOOLMESH_AUTH_USER, TOOLMESH_AUTH_PLAN y TOOLMESH_AUTH_ROLES (valores predeterminados: owner, pro, admin).

Claves API (Acceso programático)

Define claves API en config/apikeys.yaml con claves cifradas con bcrypt:

keys:
  - key_hash: "$2a$10$..."
    user_id: claude-code-user
    company_id: dunkelcloud
    plan: pro
    roles: [tool-executor]

Cada clave se asigna a una identidad de usuario distinta con su propio plan y roles, que fluyen hacia la autorización de OpenFGA.

Para configuraciones de una sola clave, TOOLMESH_API_KEY sigue funcionando como respaldo. Las mismas variables TOOLMESH_AUTH_USER, TOOLMESH_AUTH_PLAN y TOOLMESH_AUTH_ROLES controlan la identidad.

Límite de tasa DCR

El registro dinámico de clientes (Dynamic Client Registration) tiene un límite de 5 registros por hora por IP para evitar abusos.

Modo de autorización

OPENFGA_MODE controla si se aplica la autorización de OpenFGA:

Modo

Comportamiento

bypass (predeterminado)

Todas las llamadas a herramientas están permitidas sin comprobaciones de autorización

restrict

OpenFGA aplica la autorización de usuario → plan → herramienta (requiere OPENFGA_STORE_ID)

Comienza con bypass para empezar rápidamente, luego cambia a restrict después de configurar OpenFGA.

Configuración

Consulta docs/configuration.md para ver todas las variables de entorno.

Ajuste de tiempos de espera (timeouts)

Variable

Predeterminado

Descripción

TOOLMESH_MCP_TIMEOUT

120

Tiempo de espera del cliente HTTP (segundos) para llamadas a servidores MCP descendentes

TOOLMESH_EXEC_TIMEOUT

120

Tiempo de espera de ejecución de la herramienta (segundos): límite de contexto para llamadas al backend

Aumenta estos valores para backends que necesiten más tiempo (por ejemplo, buscadores web basados en navegador):

TOOLMESH_MCP_TIMEOUT=180
TOOLMESH_EXEC_TIMEOUT=180

Registro (Logging)

ToolMesh utiliza registro estructurado a través de slog. El nivel predeterminado es debug para una trazabilidad MCP completa desde el primer momento; establece LOG_LEVEL=info o superior para producción, ya que los registros de depuración incluyen cargas útiles completas de solicitud/respuesta. Los archivos de depuración por backend, los formatos de registro y todas las variables de registro están documentados en docs/configuration.md.

Arquitectura

Consulta docs/architecture.md para ver la documentación completa de la arquitectura.

                          ┌─────────────────────────────────┐
                          │          ToolMesh               │
                          │                                 │
                          │  Redis · OpenFGA · Audit        │
                          │  Credential Store · JS Gate     │
                          │                                 │
AI Agent ──MCP──────────▶ │   AuthZ ▸ Creds ▸ Gate ▸ Exec  │
                          │                                 │
                          └──┬──────┬───────┬───────┬───────┘
                             │      │       │       │
                          MCP Client  .dadl   .dadl   .dadl
                             │      │       │       │
                             ▼      ▼       ▼       ▼
                          MCP     Stripe  GitHub  Vikunja
                          Server   API     API     API

Añadir un servidor MCP externo

Crea o edita config/backends.yaml:

backends:
  - name: memorizer
    transport: http
    url: "https://memorizer.example.com/mcp"
    api_key_env: "MEMORIZER_API_KEY"

Establece la credencial como una variable de entorno:

CREDENTIAL_MEMORIZER_API_KEY=sk-mem-xxxxx

Las herramientas de cada backend se exponen con un prefijo (por ejemplo, memorizer_retrieve_knowledge). Las credenciales son inyectadas por el Ejecutor en tiempo de ejecución a través del CredentialStore: el LLM nunca ve las claves API.

Modo Proxy REST (DADL)

Cuando un servidor MCP no expone un punto de conexión que necesitas, descríbelo en un archivo .dadl y ToolMesh llamará a la API REST directamente; no se necesita servidor envoltorio. Ambos modos se ejecutan en paralelo.

Añade un backend REST a config/backends.yaml:

backends:
  - name: vikunja
    transport: rest
    dadl: /app/dadl/vikunja.dadl
    url: "https://vikunja.example.com/api/v1"

Para servicios internos con IPs privadas o certificados autofirmados:

backends:
  - name: internal-api
    transport: rest
    dadl: internal.dadl
    url: "https://192.168.1.50:8443/api"
    allow_private_url: true    # allow private/loopback addresses (default: true)
    tls_skip_verify: true      # accept self-signed certificates (default: false)

¿Quieres que Claude liste las incidencias de GitHub? Esto es todo lo que se necesita:

tools:
  list_issues:
    method: GET
    path: /repos/{owner}/{repo}/issues
    description: "List issues for a repository"
    params:
      owner: { type: string, in: path, required: true }
      repo:  { type: string, in: path, required: true }
      state: { type: string, in: query }

ToolMesh maneja la autenticación, paginación, reintentos y mapeo de errores. DADL admite tokens de portador (bearer tokens), OAuth2, autenticación de sesión, claves API, paginación automática, reintento con retroceso exponencial, transformación de respuestas, herramientas compuestas y más.

Para ver la especificación completa, ejemplos y el registro de la comunidad, visita dadl.ai. La forma más rápida de crear un archivo .dadl es preguntárselo a cualquier LLM que conozca el formato.

Modo Código

¿Conectar 15 servidores MCP a un solo agente de IA? Sin ToolMesh, eso simplemente no funciona: la ventana de contexto se llena, el cliente se bloquea. El Modo Código lo hace posible.

En lugar de exponer cientos de definiciones de herramientas individuales (más de 50,000 tokens), ToolMesh expone dos meta-herramientas: list_tools y execute_code. El LLM obtiene interfaces TypeScript compactas (~1,000 tokens) y escribe JavaScript sobre ellas:

const repos = await toolmesh.github_list_repos({ sort: "updated" });
const issues = await toolmesh.github_list_issues({
  owner: repos[0].owner.login,
  repo: repos[0].name,
  state: "open"
});

Múltiples llamadas a la API en un solo viaje de ida y vuelta. ToolMesh analiza el código, extrae las llamadas a las herramientas y las enruta a través de la tubería de ejecución completa.

Modelo de extensión

ToolMesh utiliza un modelo de extensión basado en registro inspirado en el patrón de controlador database/sql de Go. Tres tipos de componentes son extensibles mediante el registro init():

Componente

Integrado

Configuración

Almacén de credenciales

embedded

CREDENTIAL_STORE=<nombre>

Backend de herramientas

mcp, rest (DADL), echo

config/backends.yaml

Evaluador de puertas

goja

GATE_EVALUATORS=<lista>

Las extensiones empresariales (InfisicalStore, VaultStore, Compliance-LLM, etc.) están planificadas y se incluirán mediante etiquetas de compilación de Go: go build -tags enterprise ./cmd/toolmesh.

Consulta docs/architecture.md para obtener más detalles.

Contribución

Consulta CONTRIBUTING.md.

Licencia

Apache 2.0: Copyright 2025–2026 Dunkel Cloud GmbH

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Open-source MCP proxy that enforces security policies, content scanning, and audit logging between AI agents and tool servers
    25
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCPGate aggregates multiple MCP servers into a single unified endpoint, enabling centralized tool management with granular filtering, automatic namespacing, and observability. Features a real-time web dashboard and optional PostgreSQL-backed audit trails for monitoring and controlling AI tool access across local and remote deployments.
    6 npm
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A secure tool-execution plane for agentic AI that enforces JWT authentication, rate limiting, prompt-injection inspection, and audit logging, while ingesting downstream OpenAPI endpoints as MCP tools.
    MIT