β οΈ EXPERIMENTAL: This project is in active development and not production-ready. APIs may change without notice. Use at your own risk. Contributions and feedback welcome!
Transform MCP tool definitions into progressive discovery APIs (96% context savings)
Generate code execution wrappers for Model Context Protocol servers with automatic progressive tool discovery. Reduces context usage by up to 96% while maintaining full MCP functionality.
Loading MCP servers directly into Claude Code bloats context with ALL tool definitions:
Chrome DevTools MCP: 17,500 tokens (26 tools)
MSSQL Database (Γ2): 11,200 tokens (16 tools)
βββββββββββββββββββββββββββββββββββββββββββββ
Total: 28,700 tokens (14.5% of 200k context)
With 3-4 MCP servers, you easily hit 50k+ tokens before doing any actual work.
Progressive Discovery via Filesystem Structure
Instead of loading all tools upfront, present them as a TypeScript API filesystem that Claude explores on-demand:
api-universal/
βββ index.ts # Root discovery (~100 tokens)
βββ navigation/ # 6 tools
β βββ navigate_page.ts # Load only when needed
β βββ index.ts
βββ debugging/ # 5 tools
βββ ...
Claude reads only what it needs:
- Read root index β discover categories
- Explore category β see available tools
- Read specific tools β get documentation
- Use the APIs β execute via MCP
Result: ~550 tokens for a typical 2-tool task (vs 28,700 tokens)
# Via npx (no install needed)
npx mcp-code-wrapper . # Current directory
npx mcp-code-wrapper /path/to/project # Specific project
npx mcp-code-wrapper --global # Global ~/.claude/ MCPs
npx mcp-code-wrapper --help # Show help
# Or clone and run locally
git clone https://github.com/paddo/mcp-code-wrapper
cd mcp-code-wrapper
pnpm install
pnpm run generate /path/to/projectProject Mode (converts MCPs in a project):
npx mcp-code-wrapper . # Current directory (interactive selection)
npx mcp-code-wrapper /path/to/project # Specific directory (interactive selection)
npx mcp-code-wrapper . --all # Generate all servers without prompting
npx mcp-code-wrapper . --servers mssql-main,chrome-devtools # Specific serversInteractive mode (default):
- Shows list of available MCP servers
- Select which servers to generate wrappers for
- Useful when you only want specific MCPs
All mode (--all flag):
- Generates wrappers for all MCPs without prompting
- Useful for automation/scripts
What it does:
- Discovers all MCP servers in
.mcp.json - Prompts for server selection (unless
--allflag) - Generates code wrappers in
.mcp-wrappers/ - Creates Claude Code Skills for each MCP
- Disables MCPs (keeps config for executor)
- Updates
.gitignore
Global Mode (explicit flag required):
npx mcp-code-wrapper --globalLooks for ~/.claude/mcp.json and generates wrappers in ~/.claude/.mcp-wrappers/
Restart Claude Code to load new Skills:
claude -cSkills will use .mcp.json config to spawn servers on-demand with progressive discovery.
After restarting, ask Claude what skills it has:
> what skills do you have?
I have access to three specialized skills:
1. mcp-chrome-devtools - Browser automation and testing
- Navigate pages, fill forms, take screenshots
- Inspect network traffic, debug JavaScript
2. mcp-mssql-dev - Database operations on 'app_dev' database
- Execute SQL queries, read/write data
- Manage tables and schemas
3. mcp-mssql-prod - Database operations on 'app_prod' database
- Same SQL capabilities, production database
Before (Direct MCP):
- Chrome DevTools: 26 tools = 17,500 tokens
- Database Server 1: 8 tools = 5,600 tokens
- Database Server 2: 8 tools = 5,600 tokens
- Total: 28,700 tokens (14.5% of context)
After (Progressive Discovery):
- Root indexes: ~200 tokens
- 2 tool definitions: ~350 tokens
- Total: ~550 tokens
- Savings: 98% (28,150 tokens freed)
| Workflow | Tools Used | Direct MCP | Progressive | Savings |
|---|---|---|---|---|
| Simple task | 2 tools | 28,700 tokens | 550 tokens | 98% |
| Medium task | 5 tools | 28,700 tokens | 950 tokens | 97% |
| Complex task | 10 tools | 28,700 tokens | 1,650 tokens | 94% |
Even complex workflows save 90%+ of context.
// .mcp.json
{
"mcpServers": {
"chrome-devtools": {
"type": "stdio",
"command": "npx",
"args": ["chrome-devtools-mcp@latest"],
"env": {}
},
"database-server": {
"type": "stdio",
"command": "node",
"args": [".mcp-server/dist/index.js"],
"env": {
"DB_HOST": "your-host",
"DB_NAME": "your-database",
"DB_USER": "your-user",
"DB_PASSWORD": "***"
}
}
}
}npx mcp-code-wrapper /path/to/projectOutput:
π Discovering MCP servers in /path/to/project
β
Found .mcp.json
π¦ Discovered 2 MCP servers:
- chrome-devtools
- database-server
π§ Generating wrapper for: chrome-devtools
β
26 tools in 7 categories
π― Creating Claude Code Skill wrapper...
π§ Generating wrapper for: database-server
β
8 tools in 1 category
π― Creating Claude Code Skill wrapper...
β
Generated wrappers for 2 MCP servers
π Output: /path/to/project/.mcp-wrappers/
π Disabled 2 MCP servers in .mcp.json
π Disabled MCPs in settings.local.json
MCPs stay in .mcp.json for executor reference
Restore with: npx mcp-code-wrapper --restore
β οΈ IMPORTANT: Restart Claude Code to load new Skills
Run: claude -c
/path/to/project/
βββ .mcp.json # MCPs disabled (in-place)
βββ .mcp-wrappers/ # Generated code wrappers
β βββ chrome-devtools/
β β βββ navigation/
β β β βββ navigate_page.ts
β β β βββ take_screenshot.ts
β β β βββ index.ts
β β βββ debugging/
β β βββ index.ts
β βββ database-server/
β βββ queries/
β β βββ read_data.ts
β β βββ insert_data.ts
β β βββ index.ts
β βββ index.ts
βββ .claude/
βββ settings.local.json # MCPs disabled (in-place)
βββ skills/ # Auto-generated Skills
βββ mcp-chrome-devtools/
β βββ skill.json
β βββ instructions.md
βββ mcp-database-server/
βββ skill.json
βββ instructions.md
When you invoke a Skill:
// Claude reads root index (100 tokens)
import * as db from './.mcp-wrappers/database-server/index.ts';
// Discovers: { queries: {...} }
// Explores category (50 tokens)
import * as queries from './.mcp-wrappers/database-server/queries/index.ts';
// Discovers: { read_data, insert_data, ... }
// Reads specific tool (200 tokens)
import { read_data } from './.mcp-wrappers/database-server/queries/read_data.ts';
// Gets full documentation and API
// Uses tool
const result = await read_data({ query: 'SELECT * FROM users' });Total: 350 tokens (vs 5,600 tokens loading all tools)
β
Universal: Works with ANY MCP server (npm, Python, binaries, custom)
β
Auto-discovery: Finds all MCPs in .mcp.json automatically
β
Skills integration: Auto-generates Claude Code Skills
β
Config preservation: Disables MCPs but keeps config for executor
β
Token efficient: 96%+ context savings
β
Git-safe: Auto-updates .gitignore for generated code
β
No secrets committed: Env vars stay in .mcp.json (not tracked)
β
Auto-normalized responses: Runtime executor automatically unwraps MCP response formats
Convert multiple database MCPs without context bloat:
# Project with 3 database connections
npx mcp-code-wrapper /path/to/project
# Before: 3 databases Γ 5.6k tokens = 16.8k tokens
# After: Root + 3 tools = ~800 tokens
# Savings: 95%Use Chrome DevTools MCP without loading all 26 tools:
# Before: 17.5k tokens
# After (using 2 tools): 650 tokens
# Savings: 96%Convert all your global MCPs once:
npx mcp-code-wrapper --global
# Skills available in all projects
# MCPs disabled globally
# Context savings across all sessionsRemove all generated wrappers and Skills, re-enable MCPs:
# Restore current directory
npx mcp-code-wrapper --restore
# Restore specific project
npx mcp-code-wrapper --restore /path/to/projectThis will:
- Remove
.mcp-wrappers/directory - Remove all
mcp-*Skills from.claude/skills/ - Re-enable MCPs in
.mcp.json(removes"disabled": true) - Re-enable MCPs in
.claude/settings.local.json
No backup files created - operates on config in-place to avoid accidentally committing secrets.
By default, MCPs are disabled after wrapper generation. To keep them enabled:
npx mcp-code-wrapper /path/to/project --no-disableThis generates wrappers but leaves MCPs active in both .mcp.json and .claude/settings.local.json.
To skip interactive server selection and generate all at once:
npx mcp-code-wrapper /path/to/project --allThis is useful for automation, CI/CD, or when you always want all MCPs wrapped.
To generate wrappers for specific servers without prompting:
npx mcp-code-wrapper /path/to/project --servers mssql-main,chrome-devtoolsThis is useful when you:
- Only want specific MCPs wrapped
- Are automating wrapper generation in scripts
- Want to regenerate just one server without interactive prompts
# Traditional command mode (for testing)
pnpm run generate --from-mcp-json /path/to/.mcp.json --server database-serverDB_HOST=your-host DB_NAME=your-database pnpm run generate node /path/to/mcp-server.jsmcp-code-wrapper/
βββ src/
β βββ cli.ts # npx entry point
β βββ generator-universal.ts # Universal MCP generator
β βββ executor.ts # MCP client & code executor
β βββ measure-tokens.ts # Token comparison tool
β βββ index.ts # Demo workflow
βββ USAGE.md # Detailed usage guide
βββ FINDINGS.md # Experiment analysis
βββ CONTEXT.md # Project context
βββ UNIVERSAL_GENERATOR.md # Technical details
- USAGE.md - Complete usage guide with examples
- FINDINGS.md - Experiment results and analysis
- CONTEXT.md - Project overview and next steps
- UNIVERSAL_GENERATOR.md - How the generator works
Session Start
ββ Load all MCP tool definitions (28.7k tokens)
ββ Use 2 tools
ββ 26.7k tokens wasted on unused tools
Session Start
ββ Load Skills (50 tokens)
ββ Read root index (100 tokens)
ββ Navigate to category (50 tokens)
ββ Read 2 tool files (350 tokens)
ββ Use tools
Total: 550 tokens (98% savings)
- Node.js 18+
- Claude Code (for Skills integration)
- Project with
.mcp.jsonor global~/.claude/mcp.json
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
This is an experimental project. See CONTEXT.md for current status and next steps.
MIT
- MCP Context Isolation - Infrastructure-level solution
- Skills Controllability - Why Skills need explicit control
- Stop Speedrunning Claude Code - Context discipline matters
Built by @paddo based on Anthropic's code execution pattern.