The Tool Runtime for AI Agents — One MCP Endpoint. Infinite Tools.
A Claude Code plugin that connects Claude to BLLE Dynamic MCP — a hosted Model Context Protocol server that lets your agents discover, run, and write their own tools, with an encrypted secret vault and persistent file storage built in. Connect in one line; sign in with OAuth.
Every AI-agent project rebuilds the same plumbing: a code-execution sandbox, a secret store, file persistence between runs, OAuth flows, a tool registry — one MCP server per vendor. Three months in, half of it has drifted and nobody remembers which cron does what.
Dynamic MCP is that plumbing, built once and run in production — so every agent gets it for free. It's a complete tool runtime, not a library you bolt on.
- Agent-authored tools — your agent writes a tool in JS/TS (
esm.shimports, globalfetch); it's live the second it's saved. No SDK, no deploy, no restart. A tool is just code: write it, save it, run it. - Sandboxed execution — Deno runtime, TypeScript-native, no FFI / shell / ambient writes. 60s default, 5-min hard cap, streaming logs.
- Encrypted secret vault — AES-256-GCM at rest, PBKDF2 100k iterations. Tools
read decrypted values as
context.secrets.NAME; never ciphertext, never keys. - Persistent
/workspace— per-user, S3-backed filesystem via idiomaticDeno.*APIs.writeTextFilenow, it's there next run. 10 MB writes, no setup. - Real-time streaming — every
console.logarrives over MCP as an SSE notification. Agents see progress as it happens, not an opaque "running…". - Progressive-discovery docs — slug-addressable
docs://resources (support/policies/refunds). Agents pull only the leaf they need — token- efficient by design, a tree instead of a megaprompt. - Standard MCP + OAuth 2.0 + PKCE — Streamable HTTP transport. Works with Claude Code, Claude Desktop, Cursor, n8n, the AI SDK, or your own client.
- Per-user isolation — every tool, secret, and file is scoped to your account. Stateless server, horizontally scalable.
Eight built-in meta-tools (Search_Tools, Run_tool, Create_Tool,
Update_Tool, Delete_Tool, Get_Tools, Execute_Code, Manage_Secrets)
plus every custom tool you've written show up the moment you connect.
.mcp.json— registers theDynamicMCPHTTP server (OAuth, no token in the repo).skills/dynamic-mcp/— a skill teaching how to work with the runtime: moving files/code in and out of/workspaceand/lib, authoring tools as code, the shim-over-/libpattern, sandbox gotchas, secrets, and background jobs.
This repo is also a plugin marketplace, so add it once then install:
/plugin marketplace add bookatechie/plugin
/plugin install dynamic-mcp@bookatechie
Works in the terminal CLI, the IDE extensions, and the Claude Desktop app (local/SSH sessions — the desktop plugin browser is under the + button).
Cloud sessions don't have the interactive /plugin UI — declare the plugin in
the repo's .claude/settings.json instead, and it installs at session start:
{
"extraKnownMarketplaces": {
"bookatechie": { "source": { "source": "github", "repo": "bookatechie/plugin" } }
},
"enabledPlugins": { "dynamic-mcp@bookatechie": true }
}The server authenticates via OAuth 2.0 (authorization code + PKCE) — the flow
Claude Desktop and Claude Code use natively. There is no token to configure:
the .mcp.json ships only the URL, and on first connect Claude detects the 401
and runs the sign-in flow for you.
- After installing, run
/mcp(or just trigger a DynamicMCP tool). - Claude opens a browser to
https://api.blle.co/authorize. - Sign in with Google / GitHub or your BLLE email + password.
- Claude stores the resulting token securely (system keychain) and reconnects.
Because auth is OAuth, this works identically across the terminal CLI, IDE extensions, and the Claude Desktop app (local/SSH sessions) — no shell env var required, and no secret is ever committed to this repo.
Do not add a static
Authorizationheader to.mcp.json. If a header is present and the server rejects it, Claude reports a failed connection instead of falling back to the OAuth flow.
The DynamicMCP tools are deferred. In a session:
ToolSearch: query="select:mcp__DynamicMCP__Run_tool,mcp__DynamicMCP__Search_Tools,mcp__DynamicMCP__Get_Tools,mcp__DynamicMCP__Execute_Code,mcp__DynamicMCP__Update_Tool,mcp__DynamicMCP__Create_Tool,mcp__DynamicMCP__Manage_Secrets"
See the bundled skill for the full workflow.
This plugin sets an explicit version in plugin.json, so installed users only
pick up changes when the version is bumped — pushing new commits alone won't
propagate (Claude caches the same version string). Bump version (semver) and
add a CHANGELOG.md entry per release; users then run
/plugin update dynamic-mcp@bookatechie (restart to apply). See
CHANGELOG.md.
MIT — see LICENSE.