
Research
/Security News
Popular npm Packages in the keyv and Cacheable Namespaces Compromised in Active Supply Chain Attack
Popular npm packages keyv and cacheable compromised.
MCP proxy that aggregates multiple servers with tool filtering - stop carrying 70k tokens of tools you'll never use
A Model Context Protocol (MCP) proxy server that aggregates multiple MCP servers into a single interface, enabling you to use tools from multiple sources simultaneously through Claude Desktop or Claude Code CLI.
Most MCP servers expose all their tools with no filtering options, consuming valuable context space
MCP Funnel enables you to:
┌────────────────────────┐
│ CLI (e.g. Claude Code) │
└──────┬─────────────────┘
│ MCP Protocol via stdio
┌──────▼──────┐
│ MCP Funnel │ ← Filtering and dynamic discovery happens here
└──────┬──────┘
│
┌───┴──────┬─────────┬─────────┐
│ │ │ │
┌──▼────┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│GitHub │ │Memory │ │FS │ │ ... │ ← Each exposes all tools
└───────┘ └───────┘ └───────┘ └───────┘
MCP Funnel:
github__create_issue, memory__store_memory)A typical MCP setup might expose:
Many of these tools are rarely used:
Or to "speak" with chat:
> /context
⎿ ⛁ ⛀ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ Context Usage
⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ claude-opus-4-1-20250805 • 42k/200k tokens (21%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ MCP tools: 25.4k tokens (12.7%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ Messages: 96 tokens (0.0%)
> /context
⎿ ⛁ ⛀ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛁ ⛀ Context Usage
⛀ ⛀ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ claude-opus-4-1-20250805 • 18k/200k tokens (9%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ MCP tools: 2.4k tokens (1.2%)
⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛶ ⛁ Messages: 96 tokens (0.0%)
Then use it:
> discover tool for code reasoning
⏺ I'll help you discover the code reasoning tool.
⏺ mcp-funnel - discover_tools_by_words (MCP)(words: "reasoning", enable: false)
⎿ Found 1 tools:
○ code-reasoning__code-reasoning: 🧠 A detailed tool for dynamic and reflective problem-solving through sequential thinking.
… +29 lines (ctrl+o to expand)
⏺ Found it! The code-reasoning__code-reasoning tool is available for detailed code analysis and reasoning. Let me enable it:
⏺ mcp-funnel - load_toolset (MCP)(tools: ["code-reasoning__code-reasoning"])
⎿ Loaded 1 tools matching specified patterns
⏺ The code reasoning tool is now enabled. It provides:
- Dynamic problem-solving through sequential thinking
- Ability to branch and explore alternatives
- Revision capabilities to correct earlier thinking
- Flexible thought progression that adapts as understanding deepens
You can now use this tool for analyzing code logic, understanding complex implementations, and working through programming challenges step-by-step.
MCP Funnel supports dynamically installing additional commands from npm packages. You can install commands globally to your user directory (~/.mcp-funnel/packages) where they'll be available across all your projects.
manage_commands toolmanage_commands is a built-in MCP Funnel tool that installs, updates, and removes command packages without requiring a separate CLI wrapper. The tool is exposed by default as long as exposeCoreTools is unset (or explicitly includes manage_commands).
Example install request through bridge_tool_request (Claude, Codex CLI, etc.):
{
"name": "manage_commands",
"arguments": {
"action": "install",
"package": "@awesome-org/mcp-command",
"version": "1.2.3"
}
}
Supported payload fields:
action: install, update, or uninstall (required).package: npm package spec or previously installed command name (required).version: optional version (install only) — e.g., "1.2.3".force: boolean flag to reinstall even if already present (install only).removeData: boolean flag to delete cached data (uninstall only).Responses include structured details about the command, any discovered tools, and whether a hot reload succeeded. When running inside an MCP client you can call the tool directly; no additional CLI plumbing is necessary.
User-installed commands are automatically discovered from ~/.mcp-funnel/packages/node_modules/ and loaded alongside built-in commands. They respect your configuration:
commands.list is specified, only whitelisted commands are loadedhideTools patternsexposeTools patternsMCP Funnel supports two ways to specify configuration:
Implicit (default): Looks for .mcp-funnel.json in the current working directory
npx mcp-funnel # Uses ./.mcp-funnel.json
Explicit: Specify a custom config file path
npx mcp-funnel /path/to/config.json
User Base Config (merged automatically)
If present, ~/.mcp-funnel/.mcp-funnel.json is merged with the project config. Project values override user base values. Arrays are replaced (no concatenation).
Create a .mcp-funnel.json file in your project directory:
{
"servers": {
"github": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/github/github-mcp-server"],
"secretProviders": [{ "type": "dotenv", "config": { "path": ".env" } }]
},
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"]
},
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/path/to/allowed/directory"
]
}
},
"hideTools": [
"github__list_workflow_runs",
"github__get_workflow_run_logs",
"memory__debug_*",
"memory__dashboard_*",
"github__get_team_members"
]
}
Here's how simple it is to configure GitHub MCP with secure token handling:
.mcp-funnel.json:
{
"servers": {
"github": {
"transport": {
"type": "streamable-http",
"url": "https://api.githubcopilot.com/mcp/"
},
"auth": {
"type": "bearer",
"token": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
},
"secretProviders": [
{ "type": "dotenv", "config": { "path": ".env" } }
]
}
}
}
.env:
GITHUB_PERSONAL_ACCESS_TOKEN=ghp_your_github_token_here
That's it! The secretProviders automatically loads your token from .env, keeping it secure and out of your config files.
command: Command to executeargs: Command arguments (optional)env: Environment variables (optional, deprecated - use secretProviders instead)secretProviders: Array of secret provider configurations for secure environment variable management (recommended)npm_lookup, ts-validate) or with wildcards (e.g., npm_*) in exposeTools/hideTools patterns.Patterns match against the prefixed tool names (serverName__toolName) and support wildcards (*):
Individual tools:
github__get_team_members - Hide specific tool from GitHub servermemory__check_database_health - Hide specific tool from Memory serverWildcard patterns:
memory__dashboard_* - All dashboard tools from Memory servergithub__debug_* - All debug tools from GitHub server*__workflow_* - All workflow-related tools from any servermemory__ingest_* - All ingestion tools from Memory server*__list_* - All list tools from any serverCommon filtering examples:
"hideTools": [
"memory__dashboard_*", // Hide all dashboard tools from Memory
"memory__debug_*", // Hide all debug tools from Memory
"memory__ingest_*", // Hide ingestion tools from Memory
"github__get_team_members", // Hide specific GitHub tool
"github__*_workflow_*", // Hide workflow tools from GitHub
"*__list_*_artifacts" // Hide artifact listing tools from all servers
]
Note: Always use the server prefix (e.g., github__, memory__) to target specific servers' tools. Use *__ at the beginning to match tools from any server.
MCP Funnel includes internal tools for discovery and bridging. Control which core tools are exposed using exposeCoreTools:
"exposeCoreTools": ["discover_*", "load_toolset"] // Only expose discovery tools and toolset loading
Available core tools:
discover_tools_by_words - Search for tools by keywordsget_tool_schema - Get input schema for toolsbridge_tool_request - Execute tools dynamicallyload_toolset - Load predefined tool patternsIf exposeCoreTools is not specified, all core tools are enabled by default.
Add to your configuration (e.g. path/to/your/project/.mcp.json):
{
"mcpServers": {
"mcp-funnel": {
"command": "npx",
"args": ["-y", "mcp-funnel"]
}
}
}
This will use .mcp-funnel.json from your current working directory. To use a custom config path:
{
"mcpServers": {
"mcp-funnel": {
"command": "npx",
"args": ["-y", "mcp-funnel", "/path/to/your/.mcp-funnel.json"]
}
}
}
Add to your configuration (e.g. path/to/your/project/.gemini/settings.json):
{
"mcpServers": {
"mcp-funnel": {
"command": "npx",
"args": ["-y", "mcp-funnel"]
}
}
}
Add to your configuration (e.g. ~/.codex/config.toml):
[mcp_servers.mcp-funnel]
command = "npx"
args = ["-y", "mcp-funnel"]
Kick off the guided migration flow to consolidate existing CLI configs:
npx mcp-funnel init
This command:
.mcp.json, .gemini/settings.json), Claude Desktop (~/.claude.json), and Codex (~/.codex/config.toml)..mcp-funnel.json..mcp-funnel.json, creating the file with recommended defaults when needed.mcp-funnel entry remains, pointing at the merged configuration.Every write is gated behind an explicit confirmation, so you can review the proposed changes before they land.
Once configured, you can use natural language to interact with your aggregated tools:
"Load PRs for https://github.com/chris-schra/mcp-funnel"
This works seamlessly because MCP Funnel aggregates your GitHub server's tools with proper namespacing!
MCP Funnel provides a three-tier visibility system for managing which tools are exposed:
alwaysVisibleTools)Tools matching these patterns are always exposed from startup, even when using the dynamic discovery pattern (empty allowlist). Perfect for critical tools you always want available.
{
"alwaysVisibleTools": [
"github__create_pull_request", // Always show this specific tool
"memory__store_*" // Always show all store operations
]
}
exposeTools)When using an empty allowlist (exposeTools: []), these tools are hidden initially but can be discovered and enabled dynamically via load_toolset. When allowlisted in exposeTools, they're visible from startup.
hideTools)Tools matching these patterns are never exposed, regardless of other settings.
To start with a minimal surface and enable tools on demand:
{
"exposeTools": [],
"alwaysVisibleTools": [],
"exposeCoreTools": [
"discover_*",
"get_tool_schema",
"load_toolset",
"bridge_tool_request"
]
}
Runtime flow:
discover_tools_by_words with keywords (e.g., "context7").load_toolset with explicit tool names or patterns (e.g., ["context7__resolve_library_id", "context7__get-library-docs"]).Core Tools Mode allows you to expose only MCP Funnel's internal tools for dynamic discovery. When you set exposeCoreTools to a minimal set, MCP Funnel can expose as few as 3 tools instead of 100+:
{
"servers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"secretProviders": [{ "type": "dotenv", "config": { "path": ".env" } }]
}
},
"exposeCoreTools": [
"discover_tools_by_words",
"get_tool_schema",
"bridge_tool_request"
]
}
Simple workflow:
User: "Load PRs for https://github.com/chris-schra/mcp-funnel"
Claude: *Automatically discovers GitHub tools, gets schema, and executes via bridge*
Step-by-step workflow:
1. "Find tools for working with files"
→ Claude uses discover_tools_by_words
→ Returns: filesystem__read_file, filesystem__write_file, etc.
2. "Get the schema for filesystem__read_file"
→ Claude uses get_tool_schema
→ Returns: Input parameters and types
3. "Read the README.md file"
→ Claude uses bridge_tool_request
→ Executes: {"tool": "filesystem__read_file", "arguments": {"path": "README.md"}}
MCP Funnel includes a discover_tools_by_words tool that allows searching for tools by keywords. However, this feature currently has limited utility:
Claude Code CLI does not support dynamic tool updates. Once a session starts, the tool list is fixed. This means:
discover_tools_by_words tool can find matching toolsWe're eagerly waiting for these issues to be resolved:
Once these features land, dynamic discovery will significantly reduce initial context usage by loading only the tools you need on-demand.
MCP Funnel includes a secure secret management system that follows the principle of least privilege. Instead of exposing all environment variables to MCP servers, you can use secret providers to control exactly which secrets each server receives.
Quick example:
{
"secretProviders": [
{ "type": "dotenv", "path": ".env" }, // Load from .env files
{ "type": "process", "prefix": "MCP_" }, // Filter env vars by prefix
{ "type": "inline", "values": { ... } } // Define inline secrets
]
}
Key benefits:
📖 See the complete Secret Management guide →
For local development setup, debugging, and testing:
Contributions are welcome! Key areas needing work:
MIT - See LICENSE file in the repository root
FAQs
MCP proxy that aggregates multiple servers with tool filtering - stop carrying 70k tokens of tools you'll never use
The npm package mcp-funnel receives a total of 40 weekly downloads. As such, mcp-funnel popularity was classified as not popular.
We found that mcp-funnel demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Popular npm packages keyv and cacheable compromised.

Security News
A misconfiguration gave three Anthropic models internet access, and one, believing it was in a simulation, shipped a credential-stealing package to PyPI.

Security News
/Company News
Socket has joined the new Composer and Packagist sponsorship program as a launch sponsor, supporting the team that keeps PHP's package ecosystem secure.