The Problem
Every MCP server you add to Claude Code dumps its full tool schemas into the context window. 5 servers with 50 tools each = 250 tool definitions loaded on every message. Your context fills up, latency increases, and the model gets confused by irrelevant tools.
The Solution
mcpzip sits between Claude and your MCP servers. It exposes just 3 tools:
| Tool | Purpose |
|---|---|
search_tools |
Find tools by keyword or natural language query |
describe_tool |
Get the full schema for a specific tool |
execute_tool |
Run a tool on its upstream server |
Claude searches for what it needs, gets the schema, and executes — all without loading hundreds of tool definitions into context.
How It Works
Claude Code mcpzip MCP Servers
| | |
|-- search_tools ------->| |
| "send a message" |-- (keyword + LLM search) |
|<-- results ------------| |
| slack__send_message | |
| telegram__send_msg | |
| | |
|-- describe_tool ------>| |
| slack__send_message | |
|<-- full schema --------| |
| | |
|-- execute_tool ------->| |
| slack__send_message |-- tools/call ----------->|
| {channel, text} |<-- result ----------------|
|<-- result -------------| |
Features
- Context compression: 3 tools instead of hundreds
- Smart search: Keyword matching + optional Gemini-powered semantic search
- Instant startup: Serves from disk-cached tool catalog, refreshes in background
- All transports: stdio, HTTP (Streamable HTTP), SSE
- OAuth 2.1: Browser-based PKCE flow, reuses mcp-remote tokens
- Connection pooling: Idle timeout, automatic reconnection
- Per-call timeout: Override the default timeout for slow tools
- Auto-migration: Import your existing Claude Code MCP config in one command
- ~5MB binary: Single static binary, no runtime dependencies
Quick Start
Install from source
Migrate your existing Claude Code config
This reads your ~/.claude.json or ~/.claude/config.json, creates a mcpzip config with all your servers, and replaces the individual entries with a single mcpzip entry.
Or set up manually
Configure Claude Code
Add mcpzip to your Claude Code config (~/.claude.json):
Configuration
mcpzip config lives at ~/.config/compressed-mcp-proxy/config.json:
Server Types
| Type | Config | Description |
|---|---|---|
stdio (default) |
command, args, env |
Spawns a local process |
http |
url, headers |
MCP Streamable HTTP with OAuth |
sse |
url |
Legacy SSE transport |
Search
Without a Gemini API key, mcpzip uses keyword search (tokenization + scoring). With a key, it adds LLM-powered semantic search that understands natural language queries like "send someone a message on slack".
Set the key via environment variable or config:
Architecture
┌─────────────────────────────────────────┐
│ mcpzip proxy │
│ │
Claude ──stdio──> │ MCP Server ──> ProxyServer │
│ │ │
│ ┌─────────┼──────────┐ │
│ │ │ │ │
│ search_tools describe execute │
│ │ │ │ │
│ v v v │
│ Searcher Catalog Manager │
│ (kw+LLM) (cached) (pool) │
│ │ │
└──────────────────────────────┼──────────┘
│
┌────────────────────┼────────┐
│ │ │
stdio/http/sse stdio/http sse
│ │ │
Server A Server B Server C
Key Components
- Catalog: Maintains a cached index of all tools from all upstream servers. Persists to disk. Background refresh on startup.
- Searcher: Two-tier search — fast keyword scoring, optional Gemini semantic reranking. Query results are cached.
- Manager: Connection pool for upstream servers. Lazy connection with idle timeout. Concurrent
list_toolsacross all servers. - MCP Server: NDJSON-over-stdio server implementing the MCP protocol. Handles
initialize,tools/list, andtools/call.
Development
# Build
# Run tests (150+ tests)
# Run the proxy
# Run with custom config
# Dry-run migration