ToolFunnel
ToolFunnel is an MCP gateway that hosts, curates, and governs tools through a lean, token-efficient, policy-gated interface.
List tools (
toolfunnel_list_tools): Get brief summaries (name,summary,category) of all registered tools without loading full schemas, keeping token usage low. Supports optional free-text and category filtering.Fetch full tool instructions on demand (
toolfunnel_tool_instructions): Retrieve complete usage documentation, argument shapes, and safety notes for a specific tool — only when needed.Execute tools through the policy gate (
toolfunnel_run_tool): Run any registered tool server-side by name with structured arguments. Every call passes through configurable PreToolUse/PostToolUse hooks for governance, returning{ ok, output, error? }.Get self-extension guides (
toolfunnel_howto): Access built-in how-to documentation on creating tools (create-tool), attaching upstream MCP servers (add-mcp), adding policy hooks (add-hook), and packaging your setup (package).Host and curate first-party tools: Define and serve your own tools via simple JSON registers and scripts, without an SDK.
Forward and optimize upstream MCPs: Connect to other MCP servers, forwarding their tools while presenting only lean briefs to the agent, reducing token bloat. Control which upstream tools are exposed.
Manage tool visibility: Control whether tools are
enabled(lean-visible),hot(promoted to top-level), orhiddenvia a flexible visibility matrix.Configure live: Add, update, enable, disable, or remove tools, upstream MCPs, and policy hooks dynamically via built-in management functions (
tf_tool_add,tf_mcp_add,tf_hook_add,tf_pack,tf_list,tf_log, etc.) or a web UI — no server restart required.Audit activity: Optionally enable a JSONL log to record tool runs and gate decisions.
Secure deployments: Supports optional OAuth 2.1 for authenticated, multi-user networked deployments.
Package and deploy: Package your customized setup into a portable config or publishable npm package.
ToolFunnel

A zero-dependency MCP and Local tool gateway: host your own tools in any language, forward and curate tools from other MCP servers, expose them leanly to cut agent token cost, gate every call through your own policy hooks before it runs, create your own MCP servers easily with zero code - and wrap any MCP server so it speaks both protocol eras, invisibly.
Zero code, zero dependencies: your own MCP server in 60 seconds - from three ordinary scripts to a named, packaged, policy-gated MCP server (everything on screen is real output; see demo/):

📖 Full documentation: the ToolFunnel User Manual - installation, the web UI, writing tools, attaching MCP servers, the policy gate, packaging, and troubleshooting, all illustrated with screenshots and worked examples. This README is the overview; the manual is the reference.
The problem
Toolfunnel is designed to solve multiple issues in one package :)
The Model Context Protocol (MCP) lets an AI agent call tools from many servers. But every connected server dumps all of its tool schemas into the model's context on every turn. Connect a handful of rich MCP servers and you've spent thousands of tokens describing tools the agent won't use this turn - slower, costlier, noisier.
Similarly, working with AI I found myself generating many many tools, some of which I wanted to use with different AI workflows, some I didn't, and I didn't want to keep setting them up, I also didn't wish to keep many different setups for different workflows. Therefore ToolFunnel was born so that all of my multi-use tools and common MCP servers can be in one place, with any workflow, and I can easily select which I want to use with whatever workflow and even change or add tools during a session with simple toggles in the UI. I also wanted to wire up and test MCPs live, in the running session, without resetting the CLI or restarting anything - and have their tools show up in the tools list straight away; ToolFunnel does exactly that.
Often also, there's also no consistent way to govern what an agent may run: hooks and policies live in the host (a specific CLI or otherwise), so they don't travel when you switch clients - with ToolFunnel, this is easy because your hooks travel with the tools - it can become your one swiss-army knife for many different workflows.
Additionally, I wanted an easy and consistent way to package my own tools and create new MCP servers from other tools, whatever language they were written in. FastMCP could do that, but not everything is written in python. I also didn't want to audit huge numbers of dependencies - a personal choice, yes - so I wanted something that could be audited quickly and easily.
Finally, when the MCP changes were announced as breaking changes, it became apparent this would eventually break a lot of MCP servers and/or clients out there, many of which might not be actively maintained. Not only that but changing MCP protocol generations takes time and might take considerable effort depending on the complexity of the server - therefore I added a quick, simple single command tool that allows ToolFunnel to wrap an MCP and easily translate between new and legacy protocols - quick, low effort, maximum gain.
At the time of writing, I have 14 MCP tools and 98 local tools all accessed through toolfunnel, gated as required.
Related MCP server: mcpproxy-go
What ToolFunnel does
ToolFunnel is one small MCP server that sits between your agent and everything else:
Hosts your own tools - define first-party tools in a JSON register and serve them directly. Seven demo tools ship in the box.
Forwards other MCP servers - leanly. Attach an upstream MCP and its tools appear in the same lean register as your own, runnable through the gate. Curate which appear, promote a chosen few to top-level "every-turn" tools, or leave them lean by default.
Lean register - the agent sees short tool briefs; the full instructions for a tool are fetched on demand, so context stays small. (This is the token saver.)
Server-side policy gate - every server-side execution path fires your PreToolUse / PostToolUse hooks inside the gateway, so your policy works on any client, not just hosts that support hooks. The gate travels with the gateway, and fails closed.
Configure by file, UI, or in-band - plain JSON files, an optional loopback web UI, or ten in-band management functions (
tf_*) all add / curate / toggle tools, upstreams, and hooks - live, no restart - and package the whole setup for deployment.Audit when you want it - a toggleable JSONL log (default off) records tool runs, every gate allow/deny decision, and every upstream connect / disconnect / reconnect.
Live & self-healing - attach/curate/toggle on a running gateway with no restart; if an attached MCP's process dies, the gateway detects it and reconnects in the background with backoff.
Build your own MCP server, no code, no SDK - assemble scripts and curated upstream tools, switch the meta-tools off, and ToolFunnel is your MCP server;
tf_packships it as anpx-installable npm package.Wrap any MCP server - one command turns ToolFunnel into a transparent, dual-era wrapper for a single MCP server: modern clients can use legacy servers, legacy clients can use modern servers, and neither side can tell ToolFunnel is there. (The headline of the dual-era work - see below.)
Under the hood
The reasoning behind the bigger design decisions (why no SDK, why fail-closed, why zero dependencies, where the isolation boundary sits) is in docs/design.md.
The version log is contained within the release notes; what is still open is in docs/KNOWN_BUGS.md
The security model is in SECURITY.md.
Wrap any MCP server - one command, both protocol eras, invisible
The 2026-07-28 MCP revision is a breaking protocol change: it removes the initialize handshake and sessions that every earlier server and client is built on. When clients upgrade, unmaintained legacy servers stop working with them; older clients can't talk to new-style servers at all. A lot of good tools are going to get stranded on the wrong side of that line.
toolfunnel wrap <server> un-strands them:
toolfunnel wrap my-old-serverWatch it happen (everything on screen is real output):

That's it - zero configuration. The name is an attached upstream's id (not attached yet? that's one tf_mcp_add call or UI row first). The command probes the server and tells you which protocol era(s) it speaks; if the server needs paths outside the gateway root (a filesystem server serving your documents folder, say) you get a clear security notice up front explaining exactly what that means.
toolfunnel wrap # show what's currently wrapped
toolfunnel wrap --off # undo - restore the normal ToolFunnel surface
toolfunnel wrap my-old-server --as legacy-tools # present a name of your choosingThe wrap survives restarts, and the web UI has the same controls (Wrap / Unwrap on the MCPs tab). ToolFunnel becomes that server, for both eras at once:
Any client, any server, any combination. Legacy client → modern server, modern client → legacy server, or matched pairs - all four combinations work through the same wrap. The gateway speaks both dialects natively and translates between them.
Invisible from both sides. The client sees the wrapped server's own identity, tools, results, errors, and notifications - byte-for-byte, verified against real published servers. The server sees a normal client with your client's identity. No renamed tools, no injected prefixes, no "via toolfunnel" tells - the wrap presents the server as itself.
The hard parts are bridged, not dropped. Mid-call user prompts (elicitation) from a legacy server are translated into the modern retry pattern and back - for modern clients; a legacy client gets a clean decline rather than a hang (the bridge targets the era gap, and legacy-to-legacy relay is on the roadmap). Resource subscriptions survive - and are silently re-established if the wrapped server crashes and reconnects. Progress tokens flow through. Cancellations are translated into the server's own request ids.
Still governable when you want it. Wrapping doesn't switch off the gate: every call can still pass your PreToolUse hooks, and every tool still has its visibility dials - hide a dangerous tool, and it vanishes from the wrapped surface too. Transparency is the default; the levers are opt-in.
Use it to keep a favourite unmaintained server alive past the cutover, to give a modern-only server to your older tooling, or just to put a policy gate in front of a server you didn't write - without its client ever knowing.
Full details (including the security model for wrapped servers with filesystem access): the manual.
Build your own MCP server - no code, no SDK
ToolFunnel is a no-code MCP builder. Point it at a few scripts (any language), curate a set of tools from other MCP servers, or mix both, then switch its own four meta-tools off - and what your agent connects to is a plain, top-level MCP server presenting exactly your chosen tools. No decorators, no framework, no @tool boilerplate, no Python. One tf_pack call turns it into a publishable npm package your users install with npx your-mcp.
If you can write a script, you can ship an MCP. The full walkthrough is in the manual; the short version is toolfunnel_howto({ topic: "create-tool" }) and tf_pack.
The meta-tool surface
The model never sees your long tail of tools directly. It sees four fixed meta-tools - toolfunnel_list_tools, toolfunnel_tool_instructions, toolfunnel_howto, toolfunnel_run_tool - and reaches the real tools through them: list the briefs, read one tool's instructions on demand, then run it through the gate. Any curated upstream tools you expose are advertised alongside them and run through the same gate.
The visibility matrix
Every tool - your own, a forwarded upstream tool, and the four meta-tools - has three independent visibility dials: enabled (lean-visible), hot (promoted to the every-turn tools/list surface, directly callable), and hidden (manager-list declutter). Toggles are live, no restart required, no new session required.
This is what lets ToolFunnel be a lean register and a conventional MCP at the same time: keep the long tail lean, promote the few tools you call constantly, or promote your chosen set and switch the meta-tools off to present a plain top-level MCP server (the no-code-MCP posture above).
The gate
Every server-side run path - your tools, the management functions, and every forwarded upstream call - funnels through one gate:
gatedRun({ engine, ctx, toolName, args, execute })
→ fire PreToolUse (may BLOCK; fails CLOSED if the engine errors)
→ execute() (ONLY if allowed)
→ fire PostToolUse (advisory; cannot un-run the tool)Hooks speak the Claude-Code hook protocol (event JSON on stdin, exit 2 to block), so an existing hook travels here unchanged. The load-bearing invariant, proven by test: a PreToolUse deny means execute() is never called. The shipped example hooks are disabled by default - enable one in hooks/hooks.manifest.json (or the UI's Hooks tab) to turn policy on. Writing hooks, matchers, and worked examples: manual.
Why it's different
Hosting tools and proxying other MCP servers is a crowded space - but for my own use case, which is why I rolled my own solution, I wanted something different.
A quick feature comparison as of Aug 2nd 2026:
Capability | ToolFunnel | FastMCP | mcpproxy-go | MetaMCP | mcp-anything |
Config-declared polyglot tools (no SDK) | ✓ | ✗ (decorators) | partial (proxy only) | ✗ | ✓ |
Lean server-side exposure (briefs + schema on demand) | ✓ | partial | ✓ | ✗ | ✗ |
Server-side fail-closed policy gate (Pre/Post) | ✓ | ✓ | ✓ | ✓ | ✗ |
Live attach / hot-reload, no restart | ✓ | ✗ | partial | partial | ✓ |
Non-Docker self-healing reconnect | ✓ | ✗ | partial (Docker) | partial (circuit-breaker) | ✗ |
Visibility matrix - lean default + per-tool promote-to-every-turn + hide | ✓ | ✗ | filter only | cherry-pick only | ✗ |
Zero runtime dependencies* | ✓ (Node, no SDK) | ✗ (framework) | ✓ (Go) | ✗ (Docker) | ✓ (Go) |
Runtime dependencies (installed / bundled) | 0* | many | 40+ (bundled) | many | bundled (Go) |
Config web UI | ✓ | ✗ | ✓ | ✓ | ✗ |
Dual-era protocol (2026-07-28 + legacy), client & server side | ✓ | ✗✓(beta) | ✗ | ✗ | ✗ |
Transparent single-server wrap (invisible, era-bridging) | ✓ | ✗ | ✗ | ✗ | ✗ |
Beyond the dependency count, four capability choices set ToolFunnel apart from a pure proxy like mcpproxy-go:
It HOSTS, not just proxies. A proxy forwards tools from existing MCP servers. ToolFunnel also turns an arbitrary local command or script, any language, into a first-class gated MCP tool from one JSON entry, with no SDK and no pre-existing server.
Reference mode. A tool ToolFunnel only describes:
toolfunnel_run_toolhands back the instructions and the connected AI performs the action in its own environment - and the handoff itself is gated (a PreToolUse deny withholds the instructions). Nothing executes server-side.A portable policy gate, not a content scanner. The gate speaks the Claude-Code hook protocol (PreToolUse/PostToolUse, exit-2-to-block) inside the gateway, so an existing hook/policy travels to any client unchanged - an easily adaptable (to CODEX or whatever you are using) programmable policy that ports, rather than a built-in scanner.
The visibility matrix. Not on/off filtering: a lean default you can selectively promote to the every-turn surface, hide from the manager view, or collapse entirely (turn the meta-tools off and present your tools as a plain top-level MCP).
Underneath it all: a lean surface (briefs + instructions-on-demand) that keeps token cost flat as you add tools, a fail-closed gate on every server-side path, and zero runtime dependencies* in a component that sits in a privileged position. The wedge is the whole package in one small, auditable server, not any single trick.
State of development and honest limitations
ToolFunnel is a focused solo build. I've tested it thoroughly for my own use case, but it may still contain bugs outside of that - and there are features I've leaned on less than others. The OAuth 2.1 and Streamable-HTTP implementations in particular are recent, added in line with the latest MCP SDK capabilities, and haven't been tested as extensively, so your mileage may vary.
There are no Prometheus/OpenTelemetry metrics either - instead there's a toggleable JSONL audit log plus in-memory call counters on /health. I haven't needed full metrics for my own use; if it's something you'd want, let me know and I'll look at adding it.
If you find a bug - better still, a bug and a fix - or have an improvement, I'd genuinely like to hear from you. I'm keen to work with others on ToolFunnel :)
And because it's hand-rolled rather than built on the MCP SDK, I'll need to keep it in line with MCP itself as the spec evolves - the revisions land roughly quarterly, and I aim to track new capabilities as they're announced. Again: if you'd like to get involved, I'd love to hear from you :)
Use cases
Tame context bloat. Several rich MCP servers connected at once drown the agent's context in tool schemas it won't use this turn. Behind ToolFunnel the agent sees short briefs and loads a tool's full schema only when it actually reaches for it.
One toolbox, many workflows. Keep all your multi-use tools and common MCP servers in one place and pick which to surface per workflow, instead of re-wiring a different setup for every client.
Govern what an agent may run, on any client. Put a fail-closed PreToolUse policy in the gateway so it travels with your tools, even to clients that have no hook system of their own.
Turn a script into an MCP tool without building an MCP. Have a useful CLI, a bash one-liner, or a script in any language? Declare it in a JSON entry and it's a gated MCP tool - no protocol code, no SDK.
Keep a legacy internal MCP working. Front an ageing in-house MCP server with ToolFunnel and keep the workflows that depend on it running as the ecosystem moves on.
Add a tool mid-session. Need a tool while you're working? Drop it in and it's live on the next turn, no restart.
Survive an upstream crash. If an attached MCP server dies mid-session, ToolFunnel notices, reconnects it in the background with backoff, and re-advertises its tools. Most reconnect logic elsewhere is Docker-scoped; this isn't.
Zero dependencies, on purpose
ToolFunnel has no runtime npm dependencies ("dependencies": {}) and does not use an MCP SDK - the JSON-RPC 2.0 wire protocol is hand-rolled on top of Node built-ins (node:http, node:child_process, node:fs, ...). Requires Node >= 18. npm install toolfunnel pulls zero packages.
* The one asterisk: OAuth is opt-in. Enabling OAuth 2.1 (off by default) adds exactly one dependency -
jose, which is itself zero-dependency, audited, and the same library the official MCP SDK uses. It is not a runtime dependency of the core: it appears only as adevDependency(for the OAuth test suite) and is installed on demand for users who turn auth on. So the default footprint is genuinely zero, and the most security-sensitive code in the project - token validation - is delegated to an audited library rather than hand-rolled.
This is a deliberate security decision, not minimalism for its own sake. ToolFunnel sits in a privileged position - it gates tool execution - which is exactly where you don't want an unaudited dependency tree. And dependencies: {} in npm is a stronger claim than a "single binary" elsewhere: a Go gateway that ships as one binary still statically links its dependency tree (mcpproxy-go's, for example, runs to 40+ direct deps - goja, esbuild, gRPC, an observability stack). That's dependency-bundled, not dependency-free. In a year of high-profile npm supply-chain compromises, a tool-execution gate with nothing transitive to audit is a defensible engineering stance - you audit your code, not forty supply chains. (It is not a silver bullet: a zero-dep posture shrinks the audit surface, it doesn't remove the burden of getting the hand-rolled wire + gate correct - which I have tried to do.)
Authentication - optional OAuth 2.1
By default the gateway is loopback-only and unauthenticated - the right posture for a single operator on localhost. For a networked or multi-user deployment, ToolFunnel can act as an OAuth 2.1 resource server: it validates the bearer token on every request before any tool runs, through jose with a pinned algorithm allowlist, enforced issuer, and an enforced audience bound to this gateway's resource URI (the RFC 8707 confused-deputy defence). Auth is what unlocks a non-loopback bind: the HTTP host refuses to bind off-localhost unless OAuth is enabled. Setup, config fields, and discovery details: manual.
The OAuth client leg (Dynamic Client Registration, authorization-server-metadata discovery, step-up auth) and the 2026 spec hardening are planned, not yet shipped - the resource-server slice is the shipped, tested MVP.
Teams and bespoke builds
One ToolFunnel instance serves one operator - a deliberate design (why). A Team edition (per-user identity, audit trails, quotas) is on the roadmap if there is interest - and custom gateways built on ToolFunnel are available today. Open an issue titled enquiry.
Quickstart
npm install toolfunnel # runtime dependencies: none
# or from source:
git clone https://github.com/Rendeverance/toolfunnel.git && cd toolfunnel && npm install
node bin/toolfunnel.js # stdio MCP server (what most clients spawn)
node bin/toolfunnel.js --ui # optional config web UI on 127.0.0.1:9777Point your client at it via .mcp.json:
{ "mcpServers": { "toolfunnel": { "command": "node", "args": ["/path/to/toolfunnel/bin/toolfunnel.js"] } } }Or skip the config entirely - just ask your AI. Point any MCP-aware client at ToolFunnel and say "attach this tool server, expose these tools, and block anything destructive." The AI reads ToolFunnel's own built-in instructions and wires it all up for you - upstreams, exposed tools, a PreToolUse safety gate, even wrapping a server - in plain language, no JSON editing. Every feature is documented from the inside (toolfunnel_howto covers creating tools, attaching MCPs, hooks, packaging, wrapping, and configuration), so a plain agent with no special prompt can drive the whole gateway. Prefer to click? The web UI does the same. No coding experience required :)
The HTTP host (--http), registering over HTTP, the web UI tabs, the audit log, configuration files, project layout, and the smoke test are all walked through step-by-step, with screenshots, in the manual.
Identity & settings - one small file
Everything the gateway calls itself lives in toolfunnel.json at the config home - every field optional, an absent file is simply the default identity:
{ "serverName": "my-mcp", "serverVersion": "1.0.0", "clientName": "my-client", "httpPort": 9998, "uiPort": 9777 }serverName/serverVersion are what connected clients see in the handshake; clientName/clientVersion are what upstream servers see from the gateway. (Under a wrap on stdio you don't need any of it - the wrapped server is shown your real client's identity automatically.) The web UI's Settings tab edits the same file.
Prefer to configure everything by hand? The whole gateway is driven by a handful of plain JSON files - no code anywhere. The complete map (every file, every field, a worked five-file example) is one call away for your agent - toolfunnel_howto({ topic: "configure" }) - and in the manual's configuration chapter for you.
Packaging: ship your own MCP
Everything you build here - tools, curation, upstream selections, policy hooks, identity - lives in one folder (the config home), and one management call packages it:
tf_pack { format: "home" }produces a portable setup: zip it, git it, or run it with--config-dir.tf_pack { format: "npm", name: "my-mcp" }produces a publishable npm package that depends on toolfunnel (never forks it), bundles your setup, and gives your usersnpx my-mcp- your server, your name in the handshake, your tools and schemas, your gate enforced on their machine regardless of client.
Full story: docs/packaging.md.
License
Available Tools
4 toolstoolfunnel_howtoA
Get self-extension instructions: how to author a new tool, register an upstream MCP, add a hook, build a shareable package, WRAP one MCP server as the entire surface (transparent passthrough), or configure the gateway with JSON files only. The system documents how to extend itself.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which guide to return: create-tool | add-mcp | add-hook | package | wrap | configure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It only states that instructions are returned and mentions the system documents itself. It does not mention safety (read-only, no side effects), authentication needs, rate limits, or response format. This minimal disclosure is insufficient for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose. The first sentence explains what the tool does and lists all topics; the second reinforces the self-documentation aspect. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter and no output schema, the description covers the topic list adequately. However, it does not mention the return format (e.g., markdown, plain text) or whether the instructions are step-by-step. Still, the tool's purpose is narrow, and the description is mostly sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear enum and description for 'topic'. The description adds value by listing the enum values in a prose sentence, but the schema already describes each option. Baseline 3 is appropriate as the description does not add significant new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Get self-extension instructions' which clearly states the verb and resource. It then enumerates specific topics (create-tool, add-mcp, add-hook, package, wrap, configure), distinguishing this tool from siblings like toolfunnel_tool_instructions (which likely covers using tools) and toolfunnel_list_tools (listing). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when the user wants to extend the system, but does not explicitly state when to use this tool versus alternatives (e.g., toolfunnel_tool_instructions for using tools). No when-not or exclusions are provided, leaving the agent to infer from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolfunnel_list_toolsA
List the available tools (briefs only). Optionally filter by a free-text string and/or a category. Returns [{ name, summary, category }]. Call toolfunnel_tool_instructions for a specific tool, then run it yourself per its instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Optional free-text filter matched against tool name/summary. | |
| category | No | Optional category to restrict the listing to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the return format (list of {name, summary, category}) and that it's 'briefs only'. No destructive or side effects are implied, and the description is honest about what it provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The main action is front-loaded, and every sentence adds essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with optional filters, the description covers everything: what it returns, how to filter, and links to the next step. No output schema is needed because the return format is specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by explaining the purpose of filtering ('matched against tool name/summary') and the category restriction, but the schema already provides similar descriptions. However, the description contextualizes the parameters in the overall workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists available tools with briefs, optionally filtered by text and/or category. It explicitly distinguishes from sibling tools by directing to toolfunnel_tool_instructions for specific tool details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear workflow: list tools, optionally filter, then use toolfunnel_tool_instructions for a specific tool. It explicitly mentions filtering options and tells when not to use this tool (for detailed instructions, use sibling).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolfunnel_run_toolA
Execute one register tool by its name through the gateway PreToolUse gate. Args: { name, args? }. Call toolfunnel_tool_instructions first to learn the tool's arg shape. Returns { ok, output, error? }. Every call is gated (a PreToolUse hook may deny it).
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Structured arguments forwarded to the tool. Optional. | |
| name | Yes | Exact tool name from toolfunnel_list_tools. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. Reveals return shape and gating behavior, but lacks details on error handling, idempotency, or side effects. Adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: three sentences, front-loaded with purpose, then args and behavior. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return format is explained even without output schema. Gating is mentioned. Could elaborate on error cases (e.g., tool not found), but for a generic runner this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers both parameters (100% coverage). Description adds valuable context by instructing to call toolfunnel_tool_instructions for arg shape, and summarizes the arg structure. Clearer than schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool executes a registered tool by name, and distinguishes it from sibling tools (list, instructions, howto) which are about discovery and learning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to call toolfunnel_tool_instructions first to learn args, and notes that calls are gated and may be denied. However, no explicit when-not-to-use or alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolfunnel_tool_instructionsA
Get the full usage instructions / documentation for one tool by name (venv, the reliable invoke command, safety notes). Read this before running the tool yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The exact tool name (as returned by toolfunnel_list_tools). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It describes a retrieval operation ('Get the full usage instructions') and implies no side effects. However, it does not explicitly declare read-only or idempotent behavior, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that immediately states the purpose, includes relevant examples, and provides a usage note. Every word adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (one parameter, no output schema), the description adequately covers what the tool does, what it returns, and when to use it. It could optionally specify the output format (e.g., text), but this is not a critical omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'name' has a schema description that specifies it must be an exact tool name from toolfunnel_list_tools. The tool description adds context by listing examples ('venv, the reliable invoke command, safety notes'), reinforcing the meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves full usage instructions/documentation for a specific tool by name, giving examples like 'venv, the reliable invoke command, safety notes'. It effectively distinguishes from siblings that list, run, or provide how-to guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises 'Read this before running the tool yourself,' providing clear context for when to use it. It does not explicitly state when not to use it or name alternatives, but the sibling set makes the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v0.6.0- Changed
toolfunnel_howto2 fields changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Which self-extension guide to return: create-tool | add-mcp | add-hook | package."New value: +"Which guide to return: create-tool | add-mcp | add-hook | package | wrap | configure." - changed
Input schema / properties / topic / enumPrevious value: -[ - "create-tool", - "add-mcp", - "add-hook", - "package" -]New value: +[ + "create-tool", + "add-mcp", + "add-hook", + "package", + "wrap", + "configure" +]
4 tool updates
v0.1.0- First observed
toolfunnel_howto - First observed
toolfunnel_list_tools - First observed
toolfunnel_run_tool - First observed
toolfunnel_tool_instructions
TDQS
Each tool has a distinct purpose: listing available tools, retrieving detailed instructions for a specific tool, executing a tool, and obtaining self-extension documentation. There is no ambiguity or overlap.
All tool names follow a consistent 'toolfunnel_<descriptive verb/noun>' pattern in snake_case, making it easy to predict functionality from the name.
With 4 tools, the server is tightly scoped to its meta-purpose (discover, learn, run, extend). This is an ideal size for managing other tools without unnecessary complexity.
The set covers core operations (list, instructions, run, extension docs). A minor gap is the lack of a programmatic tool to register new tools dynamically, but the 'howto' tool explains how to do it externally, so agents can still extend the system.
Maintenance
Related MCP Connectors
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
MCP gateway with runtime security policy, tool-call-level control, and audit of agent actions.
Remote MCP gateway for ScriptMasterLabs x402-paid tools and agent-native API access.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceFastMCP is a comprehensive MCP server allowing secure and standardized data and functionality exposure to LLM applications, offering resources, tools, and prompt management for efficient LLM interactions.3MIT
- AlicenseAqualityAmaintenanceLocal-first MCP proxy with BM25 tool discovery, quarantine security, Docker isolation, OAuth support, activity logging, and web UI. Routes multiple upstream MCP servers through a single endpoint.9335MIT
- AlicenseBqualityCmaintenanceSecurity gateway that wraps any MCP server with per-tool policies, approval gates, and optional Ed25519-signed decision receipts. Shadow mode logs every tool call without blocking; enforce mode applies block, rate-limit, and minimum-tier rules. Receipts are independently verifiable offline with no accounts needed.569310MIT
- AlicenseNot gradedqualityCmaintenanceMetaMCP is a MCP proxy that dynamically aggregates MCP servers into a unified endpoint, with middlewares and namespaces.2,641MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Rendeverance/toolfunnel'
If you have feedback or need assistance with the MCP directory API, please join our Discord server