The problem
Adding a tool means running a server.
Claude connects to any MCP server, and that server is yours to run: hosting, auth in front of it, limits on what it can reach.
The problem
Claude connects to any MCP server, and that server is yours to run: hosting, auth in front of it, limits on what it can reach.
The solution
Run tools from your server, inside a framework built for exactly that. Use what's included here, or add more. Each gated as tightly or loosely as you decide.
The arsenal
A cloud browser, watched live
headed Chromium · noVNC takeover · any web UI
The full Playwright surface driving a cloud Chromium session. Anything with a web UI, navigated for you, with a live noVNC page to watch or grab the wheel. It keeps you logged in and reaches the open web.
Your Google account, as tools
Gmail · Drive · Calendar · Docs · Sheets · Slides · Tasks · Apps Script
121 tools across your entire Google account. It reads and sends the mail, manages files and sharing in Drive, books the calendar, works Docs and Sheets, and runs Apps Script: real code, as you.
Your Telegram account as tools
read + write · DMs · groups · channels
The full Telegram surface, acting as you. It reads chats, groups, and channels, searches your history, manages contacts, and sends messages from your number.
The control plane
per-tool permissions · in-chat panel · approvals
Server-side moderation of every tool's access. Each tool runs in one of three modes (always_allow / needs_approval / blocked). All managed from a chat with Claude, no redeploy.
The incubator
Experiments live in a separate overlay repo and run on the same stack.
data
Crypto market data pulled into a local parquet lake, exportable to the backtester.
OpenBB ↗lean
Self-hosted backtests of agent-written algorithms over the lake's data.
QuantConnect/Lean ↗New tools are stamped from a template that arrives already wired into the substrate. Add your own: a built-in Claude Code skill guides each new tool into the framework.
.claude/skills/new-toolArm it
git clone https://github.com/wnkinc/claude-custom-connector-server.git mcp-tools && cd mcp-tools && claude then say: "deploy this" — local or cloud, Claude walks the setup.
Best-effort guarding
These tools act with your accounts, and the model driving them can be misled by what it reads. Three things can go wrong: hostile content can turn the agent against you, the agent can make a mistake all on its own, and the server itself can be attacked. Below, each concern with the controls that answer it.
Hostile content — a web page, an email, a message — can carry instructions the model follows. This is model behavior, so nothing here is proof: these are best-effort screens that filter what the agent reads, cut what a hijacked call can reach, and put a human before anything irreversible.
fails closed
A sidecar screens tool output for prompt injection before it reaches the agent. GUARDRAIL_PROVIDER picks the engine (llamafirewall locally, Bedrock Guardrails on AWS) behind a fixed contract. At startup a canonical injection must block, or the container refuses to report healthy.
the strongest single control
Each tool sits on an internal Docker network whose only route off-box is a squid sidecar enforcing a per-tool domain allowlist. A tool reaches the handful of hosts it needs; everything else returns TCP_DENIED/403, logged to a central audit. Verified behavior: allowlisted hosts succeed, the rest are denied, and a proxy-bypass attempt is dropped.
written by humans only
Gated actions raise an Approve/Deny card right in the chat, with the option to route it to a channel you own instead: Slack, Discord, or Telegram. Either way your decision travels straight to the approval sidecar, never through the model, so a compromised tool can't approve itself.
your part of the job
Every workflow you hand the agent carries a risk you should be able to name. Watch the early runs live, where a wrong file, a page that steers the agent, or a write you would rather hold shows up, and let it run on its own once it has earned your confidence.
The model can simply get it wrong: a wrong recipient, an overbroad action, a scheduled run compounding a mistake. Model behavior again — it can't be patched, only contained. These controls narrow what each task can touch and hold writes for review, so a wrong call stays small.
enforced server side
Every tool runs as always_allow, needs_approval, or blocked: set from chat, enforced by the gatekeeper sidecar. A task gets the tools it needs and nothing else, and a blocked tool disappears from the agent's list.
your part of the job
A task set to run on its own runs while you are away. Hand it only the connectors that task needs: a booking flow wants the browser, a digest wants read-only mail. A narrow set is a small blast radius.
An endpoint on the public internet and a tree of vendored dependencies are an attack surface before any agent is involved. This is the one classical problem here, and it has known answers: tunnels, auth, lockfiles — deterministic controls that hold on their own, with no model in the loop and nothing for you to watch.
travels with the image
Each MCP server runs its own Google OAuth with a verified-email allowlist, and starts only once an allowlist and credentials are present. Because auth lives in the image, the same container authenticates the same way on a laptop or a cloud VM, across Claude desktop, web, and mobile.
the tunnel dials out
A Cloudflare Tunnel sidecar dials outbound to serve each tool's subdomain: TLS at the edge, home IP hidden, the box listening on nothing. The tunnel is transport only; auth stays in the server, so there's a single identity layer.
a bug stays one box
Every tool is its own image with its own secrets and its own subdomain, on a sealed network. When two must cooperate they exchange artifacts through a shared volume, with exactly one writer and the format as the contract, so no tool ever holds another's credentials or network access.
CI holds the line
Every tool's dependencies are hash-locked, and CI installs in require-hashes mode, so an unlocked or tampered dependency stays out of main. Dependabot watches each tool's directory, and test_stack.py fails any PR that skips a wiring step, naming the missing piece.
Field notes
Engineering notes from building and running hardened tools — the patterns that hold up, the ones that quietly fail, and how to tell them apart.
The strongest single control in agent infrastructure isn't auth or sandboxing — it's refusing to let a tool talk to any host you didn't explicitly allow. Here's why, and how to verify it's real.
read →Putting OAuth at the edge feels tidy until the same tool needs to run locally, in the cloud, and across three Claude apps. Auth that travels with the image is simpler and fails safer.
read →One tool per container, cooperating through artifacts — never through calls, networks, or shared credentials. Production systems like ToolHive converge on the same shape; a personal server can run a flattened version of it.
read →