ToolMesh
OfficialToolMesh — 让 AI 智能体安全地接触真实系统。
AI 智能体与企业系统之间缺失的控制层。ToolMesh 将不受控制的 AI 工具调用转变为受治理、可审计的流程,并能在几分钟(而非几个月)内连接任何 REST API 或 MCP 服务器。
30 行 YAML。无需构建服务器。
实际上,MCP 服务器仅暴露了它们所包装的 REST API 的一小部分,您很快就会遇到功能缺失的问题。ToolMesh 让您可以用 .dadl 文件替换包装层——这是一种声明式 YAML 格式,将任何 REST API 描述为 MCP 工具。无需构建、部署或维护包装服务器。
Current: Claude → ToolMesh → MCP Server → REST API
With DADL: Claude → ToolMesh → REST API (via .dadl file)您无需手动编写 YAML。您可以询问 LLM。Claude、GPT、Gemini——任何了解 DADL 规范的模型都能在几秒钟内生成有效的 .dadl 文件。描述您的需求,将文件放入 config/dadl/,搞定。
“为 GitHub API 创建一个 DADL——列出仓库、打开议题并创建拉取请求。”
10 秒钟。适用于任何了解该格式的 LLM。
与仅仅传递工具调用的 MCP 网关不同,ToolMesh 增加了生产部署真正需要的功能:
凭据安全 — 凭据在执行时注入,绝不会出现在提示词或 LLM 客户端配置中
授权 — 细粒度的用户 → 计划 → 工具控制 (OpenFGA)
输入与输出门控 — JS 策略可拦截机密数据并过滤响应
审计追踪 — 每次工具调用都通过结构化日志或可查询的 SQLite 进行记录
Related MCP server: MCPGate
六大支柱
支柱 | 功能 | 支持技术 |
任意后端 | 30 行 DADL 即可替代整个 MCP 服务器。同时也代理现有的 MCP 服务器。 | Go MCP SDK + DADL (.dadl 文件) |
代码模式 | 同时连接 15 个 MCP 服务器?没有 ToolMesh 是不可能的。代码模式将 50,000+ token 缩减至约 1,000。 | AST 解析的工具调用 |
凭据存储 | 凭据在执行时注入——绝不出现在提示词中,绝不出现在 LLM 客户端配置中 | 通过执行器管道进行按请求注入 |
OpenFGA | 细粒度授权(用户 → 计划 → 工具)。例如:免费用户仅限只读,专业用户拥有所有权限。 | OpenFGA |
门控 (Gate) | 在执行前拦截机密数据,在响应中脱敏 PII | goja |
审计 | 每次工具调用均可记录并查询——用 SQL 回答“那个智能体做了什么?” | slog / SQLite |
尝试演示
想在安装前试用 ToolMesh?连接到我们的公共演示实例——无需 Docker,无需配置,无需 API 密钥:
demo.toolmesh.io — 通过 ToolMesh 使用 Hacker News API。适用于 Claude Desktop、Claude Code 和 ChatGPT。登录名:dadl / toolmesh。
快速入门
# 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 belowTLS (重要)
ToolMesh 本身提供纯 HTTP 服务。大多数 MCP 客户端(包括 Claude Desktop)要求 HTTPS,并会拒绝 http:// URL。您需要在 ToolMesh 前面放置一个 TLS 终止反向代理:
选项 | 使用场景 |
Caddy | 自托管且拥有公共域名——自动获取 Let's Encrypt 证书 |
Cloudflare Tunnel | 无需开放端口,零配置 TLS |
nginx / Traefik | 您的技术栈中已存在 |
仅针对本地开发,您可以通过手动编辑 claude_desktop_config.json 来绕过 TLS(GUI 会强制要求 https://)。
连接到 Claude Desktop
添加到您的 Claude Desktop MCP 配置中:
{
"mcpServers": {
"toolmesh": {
"url": "https://toolmesh.example.com/mcp"
}
}
}对于没有 TLS 代理的本地开发:
{
"mcpServers": {
"toolmesh": {
"url": "http://localhost:8123/mcp"
}
}
}连接到 Claude.ai (自定义连接器)
ToolMesh 支持带有 PKCE S256 的 OAuth 2.1 以实现远程访问。在 config/users.yaml 中配置用户,并使用公共 HTTPS URL 作为 MCP 端点。
身份验证
ToolMesh 支持两种可以独立或组合使用的身份验证方法。所有 OAuth 状态(令牌、授权码、客户端)均持久化在 Redis 中,并在服务器重启后保留。
OAuth 2.1 (交互式登录)
在 config/users.yaml 中定义用户,并使用 bcrypt 哈希密码:
users:
- username: admin
password_hash: "$2a$10$..."
company: dunkelcloud
plan: pro
roles: [admin]使用任何支持 bcrypt 的工具生成密码哈希:
htpasswd -nbBC 10 "" "my-password" | cut -d: -f2对于单用户设置,TOOLMESH_AUTH_PASSWORD 仍可作为后备方案。使用 TOOLMESH_AUTH_USER、TOOLMESH_AUTH_PLAN 和 TOOLMESH_AUTH_ROLES(默认值:owner、pro、admin)配置身份。
API 密钥 (程序化访问)
在 config/apikeys.yaml 中定义 API 密钥,并使用 bcrypt 哈希密钥:
keys:
- key_hash: "$2a$10$..."
user_id: claude-code-user
company_id: dunkelcloud
plan: pro
roles: [tool-executor]每个密钥映射到一个具有特定计划和角色的不同用户身份,这些身份会流向 OpenFGA 授权。
对于单密钥设置,TOOLMESH_API_KEY 仍可作为后备方案。相同的 TOOLMESH_AUTH_USER、TOOLMESH_AUTH_PLAN 和 TOOLMESH_AUTH_ROLES 变量控制身份。
DCR 速率限制
动态客户端注册 (DCR) 的速率限制为每 IP 每小时 5 次注册,以防止滥用。
授权模式
OPENFGA_MODE 控制是否强制执行 OpenFGA 授权:
模式 | 行为 |
| 所有工具调用均无需授权检查即可执行 |
| OpenFGA 强制执行用户 → 计划 → 工具授权(需要 |
先使用 bypass 快速运行,在引导 OpenFGA 后切换到 restrict。
配置
查看 docs/configuration.md 获取所有环境变量。
超时调整
变量 | 默认值 | 描述 |
|
| 调用下游 MCP 服务器的 HTTP 客户端超时(秒) |
|
| 工具执行超时(秒)——后端调用的上下文截止时间 |
对于需要更多时间的后端(例如基于浏览器的网页抓取工具),请增加这些值:
TOOLMESH_MCP_TIMEOUT=180
TOOLMESH_EXEC_TIMEOUT=180日志记录
ToolMesh 通过 slog 使用结构化日志记录。默认级别为 debug,以便开箱即用实现完整的 MCP 可追溯性——生产环境请设置 LOG_LEVEL=info 或更高,因为调试日志包含完整的请求/响应负载。每个后端的调试文件、日志格式和所有日志变量均记录在 docs/configuration.md 中。
架构
查看 docs/architecture.md 获取完整的架构文档。
┌─────────────────────────────────┐
│ 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添加外部 MCP 服务器
创建或编辑 config/backends.yaml:
backends:
- name: memorizer
transport: http
url: "https://memorizer.example.com/mcp"
api_key_env: "MEMORIZER_API_KEY"将凭据设置为环境变量:
CREDENTIAL_MEMORIZER_API_KEY=sk-mem-xxxxx来自每个后端的工具都带有前缀(例如 memorizer_retrieve_knowledge)。凭据由执行器在运行时通过 CredentialStore 注入——LLM 永远看不到 API 密钥。
REST 代理模式 (DADL)
当 MCP 服务器没有暴露您需要的端点时,在 .dadl 文件中描述它,ToolMesh 将直接调用 REST API——无需包装服务器。两种模式并行运行。
将 REST 后端添加到 config/backends.yaml:
backends:
- name: vikunja
transport: rest
dadl: /app/dadl/vikunja.dadl
url: "https://vikunja.example.com/api/v1"对于具有私有 IP 或自签名证书的内部服务:
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)想让 Claude 列出 GitHub 议题?只需这样做:
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 处理身份验证、分页、重试和错误映射。DADL 支持 Bearer 令牌、OAuth2、会话认证、API 密钥、自动分页、带退避的重试、响应转换、复合工具等。
有关完整规范、示例和社区注册表,请参阅 dadl.ai。创建 .dadl 文件的最快方法是询问任何了解该格式的 LLM。
代码模式
将 15 个 MCP 服务器连接到单个 AI 智能体?没有 ToolMesh,这根本行不通——上下文窗口会填满,客户端会卡死。代码模式使之成为可能。
ToolMesh 不会暴露数百个单独的工具定义(50,000+ token),而是暴露两个元工具:list_tools 和 execute_code。LLM 获得紧凑的 TypeScript 接口(约 1,000 token)并针对它们编写 JavaScript:
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"
});单次往返中的多次 API 调用。ToolMesh 解析代码,提取工具调用,并通过完整的执行管道进行路由。
扩展模型
ToolMesh 使用受 Go 的 database/sql 驱动模式启发的基于注册表的扩展模型。三种组件类型可通过 init() 注册进行扩展:
组件 | 内置 | 配置 |
凭据存储 |
|
|
工具后端 |
|
|
门控评估器 |
|
|
企业级扩展(InfisicalStore、VaultStore、Compliance-LLM 等)已在计划中,并将通过 Go 构建标签包含:go build -tags enterprise ./cmd/toolmesh。
详情请参阅 docs/architecture.md。
贡献
请参阅 CONTRIBUTING.md。
许可证
Apache 2.0 — 版权所有 2025–2026 Dunkel Cloud GmbH
This server cannot be deployed
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
- gatewayOAuthai.sealgate
MCP gateway with runtime security policy, tool-call-level control, and audit of agent actions.
AgentGuard — 20-tool AI safety MCP: policy preflight, risk scoring, audit logging, rate limits.
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
Related MCP Servers
AlicenseNot gradedqualityAmaintenanceOpen-source MCP proxy that enforces security policies, content scanning, and audit logging between AI agents and tool servers25AGPL 3.0- AlicenseNot gradedqualityDmaintenanceMCPGate 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 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceA 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
- FlicenseNot gradedqualityBmaintenanceA production-style MCP gateway that aggregates multiple tool servers into one surface with semantic tool search, RBAC, audit logging, and rate limiting, enabling efficient tool selection for AI agents.-