Toolkien

io.github.epavanelloPublished by GitHub account epavanellov0.0.1Updated Nov 14, 2026

One MCP server for all your MCP servers: code mode, per-tool permissions, approvals and audit.

VerifiedStreamable HTTPWeb executableDeveloper ToolsSecurity & Monitoring

Overview

AI-generated overview

An MCP gateway that connects one client to every remote MCP server in a workspace, exposing them through searchable tools and sandboxed TypeScript scripts.

What you can do
  • Search and describe the tools of all MCP servers configured in a workspace, with generated TypeScript declarations
  • Run a TypeScript script in a Deno sandbox that calls those tools, instead of loading hundreds of tool definitions
  • Apply per-tool permission levels (allow, ask, block) and pause writes for human approval, resuming without repeating calls
  • Record audit metadata for each call and keep credentials encrypted
  • Manage connectors, permissions and executions through a web UI with OAuth sign-in
When to use it
Useful when an assistant needs to work across several remote MCP servers at once and you want one connection, fewer tool definitions in context, and explicit control over which calls are allowed or need approval.
Requirements
A remote Streamable HTTP endpoint; the hosted service is at the provider's domain, and self-hosting runs a Docker Compose stack (app, OpenBao, egress proxy, runner). Clients authenticate via OAuth 2.1 with passwordless email sign-in. Local development needs Node 22+, pnpm 10 and Deno 2.
Before you install
It acts as a gateway holding credentials for your upstream MCP servers, so it can reach everything those servers can; writes can be gated by approval, but permission settings decide what runs unattended. Upstream calls leave through its egress proxy, and audit records metadata only. Self-hosting requires secrets such as BETTER_AUTH_SECRET and TOOLKIEN_DEV_MASTER_KEY, plus an email provider key for sign-in.

Installation

In SourceWeft

  1. Open Toolkien in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.epavanello%2Ftoolkien/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "toolkien": {
      "type": "http",
      "url": "https://toolkien.emadev.co/mcp"
    }
  }
}

README

Toolkien

One MCP to rule them all. Toolkien is an MCP gateway in "code mode": connect one MCP server to your clients (Claude, Codex, Cursor…) and use every remote MCP server configured in your workspace. Instead of hundreds of tool definitions, the agent searches tools, reads their TypeScript declarations and runs one TypeScript script in a Deno sandbox. Every call is checked against explicit permissions; writes can pause for a human approval and resume without repeating calls. Tokens are encrypted, content is never logged.

Open source (AGPL-3.0) and available as a managed service. Product spec: docs/spec.md (Italian) · Decisions: DECISIONS.md · Conventions: docs/conventions.md · Client compatibility: docs/compatibility.md.

Architecture

PartWhat it does
App (SvelteKit 3)Web UI, /mcp (Streamable HTTP, MCP 2026-07-28 and 2025-11-25), OAuth 2.1 authorization server for MCP clients (Better Auth), connectors, permissions, executions
Database (libSQL)Turso in production, a local file in development; Drizzle migrations in drizzle/
OpenBaoTransit key that wraps one data key per workspace (envelope encryption of credentials and paused executions)
Runner (runner/)Deno supervisor: type-checks scripts in a sandboxed TypeScript compiler, runs each one in a permission-less Deno process; tool calls come back to the app's bridge
Egress proxy (egress/)The only way out to upstream MCP servers and the email provider (CONNECT, port 443, SSRF rules)
Email (Resend)Passwordless sign-in (code + link) and workspace invitations

Flow: the agent calls tools_search → tools_describe → execute. The app resolves the workspace and the visible tools, generates .d.ts declarations, and sends the script to the runner over a WebSocket. Each tool call goes through the bridge: kill switches, permission level (allow / ask / block), approval gate, encrypted credential, upstream call, sealed result for durable replay, audit (metadata only).

Local development

Requirements: Node 22+, pnpm 10 (corepack enable picks the pinned version), Deno 2.

sh
pnpm installcp .env.example .env    # then fill:#   BETTER_AUTH_SECRET=$(openssl rand -base64 32)#   TOOLKIEN_DEV_MASTER_KEY=$(openssl rand -base64 32)# Leave RUNNER_URL empty: the app starts a local runner with your `deno`.# Leave RESEND_API_KEY empty: sign-in codes and links are printed to the server console.pnpm db:migrate         # creates local.db from the migrationspnpm dev                # http://localhost:5173 — sign up with any email, you land in your personal workspace

Connect a client: add http://localhost:5173/mcp as a remote MCP server (Streamable HTTP). It discovers OAuth, opens the consent page and asks which workspace to start in. For a local MCP server to connect to, development (only) accepts http://localhost… connector URLs.

Useful commands:

sh
pnpm check                  # svelte-checkpnpm lint                   # prettier --check + eslintpnpm test                   # vitest: server (node) + component (browser) projectspnpm build                  # production build (adapter-node)pnpm db:generate            # migration from schema changes (src/lib/server/db/schema/*)pnpm auth:schema            # regenerate Better Auth tables after changing auth pluginspnpm directory:validate     # check directory/servers/*.jsoncd runner && deno task test # runner (sandbox, checker, escape attempts)cd egress && deno task test # egress proxypnpm exec playwright install chromium   # once, for component tests

Every environment variable is declared and documented in src/env.ts.

Self-hosting

One docker compose project (app, OpenBao, egress proxy, runner): see docs/self-hosting.md, and docs/deploy-coolify.md for Coolify. Migrations run when the app container starts.

Contributing to the directory

The curated server directory is data: one JSON file per server in directory/servers/. Read directory/CONTRIBUTING.md, add or edit a file, run pnpm directory:validate, open a pull request.

Before launch

Placeholders that need real values:

The repository URL is REPOSITORY_URL in src/lib/brand.ts.

  • Legal drafts in legal/*.md: operator legal name and address, privacy / DPO / security / contact emails, VPS provider and region, Resend legal entity, transfer mechanism and sending region, liability cap, governing law, notice periods. All drafts need review by a lawyer or DPO.
  • Resend: verified sender domain (EU region), EMAIL_FROM, an API key with sending access only.
  • VPS provider (EU) for the compose stack; Turso database in an EU region.
  • OG image endpoint (not implemented).

License

AGPL-3.0. If you run a modified Toolkien as a network service, you must offer its source to its users.

Source: README.md at commit 8510bd7

Tools

0
SourceWeft has not read this server's tools yet.

Version history

1
  1. v0.0.1LatestNov 14, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declaredRequired10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts