Skip to main content
Glama
DunkelCloud

ToolMesh

Official
by DunkelCloud

ToolMesh — AI 에이전트가 실제 시스템을 안전하게 제어하도록 하세요.

AI 에이전트와 엔터프라이즈 시스템 사이의 누락된 제어 계층입니다. ToolMesh는 제어되지 않는 AI 도구 호출을 관리 가능하고 감사 가능한 프로세스로 전환하며, 몇 달이 아닌 몇 분 만에 모든 REST API 또는 MCP 서버를 연결합니다.

Go License CI Go Report Card

30줄의 YAML. 구축할 서버가 없습니다.

실제로 MCP 서버는 래핑하는 REST API의 일부만 노출하며, 곧 한계에 부딪히게 됩니다. ToolMesh를 사용하면 래퍼 계층을 .dadl 파일로 대체할 수 있습니다. 이는 모든 REST API를 MCP 도구로 설명하는 선언적 YAML 형식입니다. 구축, 배포 또는 유지 관리할 래퍼 서버가 필요 없습니다.

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

YAML을 직접 작성할 필요가 없습니다. LLM에게 요청하세요. DADL 사양을 알고 있는 Claude, GPT, Gemini 등 모든 모델이 몇 초 만에 작동하는 .dadl 파일을 생성합니다. 필요한 것을 설명하고 파일을 config/dadl/에 넣기만 하면 끝입니다.

"GitHub API용 DADL을 생성하세요 — 저장소 나열, 이슈 열기, 풀 리퀘스트 생성."

10초면 충분합니다. 형식을 알고 있는 모든 LLM과 작동합니다.

단순히 도구 호출을 전달하기만 하는 다른 MCP 게이트웨이와 달리, ToolMesh는 프로덕션 배포에 실제로 필요한 기능을 추가합니다:

  • 자격 증명 보안 — 실행 시점에 비밀 정보가 주입되며, 프롬프트나 LLM 클라이언트 설정에는 절대 포함되지 않습니다.

  • 권한 부여 — 세밀한 사용자 → 플랜 → 도구 제어 (OpenFGA)

  • 입출력 게이팅 — JS 정책을 통해 기밀 데이터를 차단하고 응답을 필터링합니다.

  • 감사 추적 — 모든 도구 호출이 구조화된 로깅 또는 쿼리 가능한 SQLite로 기록됩니다.

Related MCP server: MCPGate

6가지 핵심 요소

요소

기능

기반 기술

Any Backend

30줄의 DADL로 전체 MCP 서버를 대체합니다. 기존 MCP 서버를 프록시하기도 합니다.

Go MCP SDK + DADL (.dadl 파일)

Code Mode

15개의 MCP 서버를 동시에 사용하시나요? ToolMesh 없이는 불가능합니다. Code Mode는 50,000개 이상의 토큰을 약 1,000개로 줄입니다.

AST 파싱된 도구 호출

Credential Store

실행 시점에 비밀 정보 주입 — 프롬프트나 LLM 클라이언트 설정에 절대 포함되지 않음

Executor 파이프라인을 통한 요청별 주입

OpenFGA

세밀한 권한 부여 (사용자 → 플랜 → 도구). 예: 무료 사용자는 읽기 전용, 프로 사용자는 모든 권한.

OpenFGA

Gate

실행 전 기밀 데이터 차단, 응답 내 PII 마스킹

goja

Audit

모든 도구 호출 기록 및 쿼리 가능 — 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 below

TLS (중요)

ToolMesh 자체는 일반 HTTP를 제공합니다. Claude Desktop을 포함한 대부분의 MCP 클라이언트는 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)로 ID를 구성하세요.

API 키 (프로그래밍 방식 액세스)

config/apikeys.yaml에서 bcrypt로 해싱된 키를 사용하여 API 키를 정의하세요:

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

각 키는 고유한 플랜과 역할을 가진 별도의 사용자 ID에 매핑되며, 이는 OpenFGA 권한 부여로 이어집니다.

단일 키 설정의 경우, TOOLMESH_API_KEY가 여전히 대체 수단으로 작동합니다. 동일한 TOOLMESH_AUTH_USER, TOOLMESH_AUTH_PLAN, TOOLMESH_AUTH_ROLES 변수가 ID를 제어합니다.

DCR 속도 제한

동적 클라이언트 등록(DCR)은 남용 방지를 위해 IP당 시간당 5회로 제한됩니다.

권한 부여 모드

OPENFGA_MODE는 OpenFGA 권한 부여 적용 여부를 제어합니다:

모드

동작

bypass (기본값)

모든 도구 호출이 권한 확인 없이 허용됨

restrict

OpenFGA가 사용자 → 플랜 → 도구 권한 부여를 강제함 (OPENFGA_STORE_ID 필요)

빠르게 시작하려면 bypass로 시작하고, OpenFGA 부트스트래핑 후 restrict로 전환하세요.

구성

모든 환경 변수는 docs/configuration.md를 참조하세요.

타임아웃 조정

변수

기본값

설명

TOOLMESH_MCP_TIMEOUT

120

다운스트림 MCP 서버 호출을 위한 HTTP 클라이언트 타임아웃 (초)

TOOLMESH_EXEC_TIMEOUT

120

도구 실행 타임아웃 (초) — 백엔드 호출을 위한 컨텍스트 마감 시간

더 많은 시간이 필요한 백엔드(예: 브라우저 기반 웹 페처)의 경우 이 값을 늘리세요:

TOOLMESH_MCP_TIMEOUT=180
TOOLMESH_EXEC_TIMEOUT=180

로깅

ToolMesh는 slog를 통한 구조화된 로깅을 사용합니다. 기본 레벨은 즉시 사용 가능한 전체 MCP 추적성을 위해 debug로 설정되어 있습니다. 프로덕션 환경에서는 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를 통해 Executor에 의해 주입되므로, LLM은 API 키를 절대 볼 수 없습니다.

REST 프록시 모드 (DADL)

MCP 서버가 필요한 엔드포인트를 노출하지 않는 경우, .dadl 파일에 설명하면 ToolMesh가 REST API를 직접 호출합니다. 래퍼 서버가 필요 없습니다. 두 모드 모두 병렬로 실행됩니다.

config/backends.yaml에 REST 백엔드를 추가하세요:

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은 베어러 토큰, OAuth2, 세션 인증, API 키, 자동 페이징, 백오프 재시도, 응답 변환, 복합 도구 등을 지원합니다.

전체 사양, 예제 및 커뮤니티 레지스트리는 dadl.ai를 참조하세요. .dadl 파일을 만드는 가장 빠른 방법은 형식을 알고 있는 LLM에게 요청하는 것입니다.

Code Mode

15개의 MCP 서버를 단일 AI 에이전트에 연결하시나요? ToolMesh 없이는 불가능합니다. 컨텍스트 창이 가득 차고 클라이언트가 멈춥니다. Code Mode는 이를 가능하게 합니다.

수백 개의 개별 도구 정의(50,000개 이상의 토큰)를 노출하는 대신, ToolMesh는 list_toolsexecute_code라는 두 가지 메타 도구를 노출합니다. LLM은 간결한 TypeScript 인터페이스(약 1,000개 토큰)를 제공받고 이를 사용하여 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() 등록을 통해 확장 가능합니다:

구성 요소

내장

구성

Credential Store

embedded

CREDENTIAL_STORE=<name>

Tool Backend

mcp, rest (DADL), echo

config/backends.yaml

Gate Evaluator

goja

GATE_EVALUATORS=<list>

엔터프라이즈 확장(InfisicalStore, VaultStore, Compliance-LLM 등)은 계획되어 있으며 Go 빌드 태그를 통해 포함될 예정입니다: go build -tags enterprise ./cmd/toolmesh.

자세한 내용은 docs/architecture.md를 참조하세요.

기여

CONTRIBUTING.md를 참조하세요.

라이선스

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