shutup-mcp
Experimental MCP tool-list filtering proxy for large tool catalogs.
shutup-mcp sits between an MCP client and one or more MCP servers. It aggregates tool definitions and exposes only the top-k tools that match the current intent.
This repository is an alpha implementation seed. It is useful for experimenting with tool-list compression, but it is not yet a full production MCP gateway.
What It Does
- Reads a Claude Desktop-style MCP config.
- Discovers configured MCP servers.
- Fetches and prefixes upstream tools.
- Builds a hybrid retrieval index over tool names and descriptions.
- Filters
tools/listresults using:- explicit CLI intent;
- a runtime
shutup__set_intenttool; - fallback behavior when no intent is known.
- Routes
tools/callto the correct upstream server. - Supports local embedding backends:
sentence-transformers;ollama.
What It Does Not Yet Do
This alpha does not yet provide:
- full MCP request proxying for every capability;
- persistent upstream sessions for every server;
- guaranteed client-side dynamic intent detection across all MCP clients;
- production authentication or sandboxing;
- benchmark-backed token or latency claims.
Earlier README versions included strong reduction metrics. Those are removed until reproducible benchmarks are added.
Install
pip install shutup-mcp
For local development:
pip install -e ".[dev]"
CLI Usage
One-shot tool filtering
shutup \
--config ~/Library/Application\ Support/Claude/claude_desktop_config.json \
--intent "read and write local files" \
--top-k 5
This prints a JSON array of filtered tool definitions.
Run as MCP proxy
shutup \
--config ~/Library/Application\ Support/Claude/claude_desktop_config.json \
--intent "work with GitHub issues" \
--serve \
--top-k 5
If --intent is supplied, tools/list returns only top-k tools matching that intent.
If no intent is supplied, the proxy exposes a small control tool:
shutup__set_intent
Calling this tool updates the current intent, after which tools/list can be filtered.
Claude Desktop Configuration
Example:
{
"mcpServers": {
"shutup": {
"command": "shutup",
"args": [
"--config",
"/absolute/path/to/claude_desktop_config.json",
"--serve",
"--intent",
"work with GitHub issues",
"--top-k",
"5"
]
}
}
}
Example MCP Server Config
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"]
}
}
}
Embedder Options
| Backend | Description | Privacy | Setup |
|---|---|---|---|
sentence-transformers |
Local model such as all-MiniLM-L6-v2 |
Local after download | Downloads model on first use |
ollama |
Ollama embedding model | Local | Requires Ollama running |
fake |
Deterministic lightweight test embedder | Local | For tests and CI only |
Command Options
shutup --config PATH [--intent TEXT] [--top-k K] [--embedder BACKEND] [--serve]
| Option | Description | Default |
|---|---|---|
--config |
Path to Claude Desktop MCP config | required |
--intent |
Current user task intent | none |
--top-k |
Number of tools to expose | 5 |
--embedder |
sentence-transformers, ollama, or fake |
sentence-transformers |
--serve |
Run as an MCP stdio proxy | false |
Runtime Intent Tool
The proxy exposes a control tool:
shutup__set_intent
Input:
{
"intent": "create and triage GitHub issues"
}
Output:
{
"ok": true,
"intent": "create and triage GitHub issues"
}
This provides an explicit client-controlled intent update path.
Testing
pip install -e ".[dev]"
pytest -q
Tests use the lightweight fake embedder and do not download embedding models.
Security Notes
shutup-mcp reads and launches MCP servers from a config file. Treat that config file as executable configuration.
Do not use untrusted server configs.
This project filters tool visibility; it does not enforce policy, authorization, sandboxing, or data-loss prevention.
License
MIT
No comments yet
Be the first to share your take.