{"_id":"@dandehoon/unimcp","_rev":"7-f4574c380704ce18bfc255be70494464","name":"@dandehoon/unimcp","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"@dandehoon/unimcp","version":"1.0.0","keywords":[],"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"ISC","_id":"@dandehoon/unimcp@1.0.0","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"14c73fafd42079cdd2d65cfe72ec65c848d08281","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.0.0.tgz","fileCount":15,"integrity":"sha512-K0PhyyBRvNrBg/4KaZZZZfaklKTdy7tmvANcPF8HmqSnJ4P3BjW6NVM8+JiMtcGJrA1m0wZ78ma4Tvm/91V88w==","signatures":[{"sig":"MEYCIQCs95/iylUqq9kQKCfPPQbotShMtZQZjlX5DEwtI0pc9AIhALgEbKpvTETxaX2ghZZwcHs3kqwaXN7g8GzfbQ4v2bff","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59393},"main":"index.js","pnpm":{"overrides":{"hono":">=4.12.12","@hono/node-server":">=1.19.13"}},"type":"module","gitHead":"8e06e6b79cfd97aa1dddec95241e969adb0d66cf","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && cp dist/unimcp /usr/local/bin/unimcp && codesign --force --deep --sign - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"_npmVersion":"11.3.0","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"chokidar":"^5.0.0","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.2","devDependencies":{"typescript":"^6.0.2","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/unimcp_1.0.0_1775760105645_0.5675848844197151","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dandehoon/unimcp","version":"1.0.1","keywords":[],"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"ISC","_id":"@dandehoon/unimcp@1.0.1","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"75b53680c71cc9f263b2d2ecc19aac8b188f3f46","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.0.1.tgz","fileCount":16,"integrity":"sha512-IceSzJQaUtOmZ+y7P5b6sLMG1lgZTTgcHXhFeQ5pM5BC6oficZFRzmEteQgcP96yRs8VK1dSw8NVXCdGuSMZGQ==","signatures":[{"sig":"MEQCID9Jlfrzy2Gng5yHyM+PsfHJGNUen+Uf5qEhWd3hSOOMAiAf0fQj1Bdr2EOpUGE8MyBSVX0PmJtVt5mrCH2a9CBA2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":442643},"main":"index.js","pnpm":{"overrides":{"hono":">=4.12.12","@hono/node-server":">=1.19.13"}},"type":"module","gitHead":"df7a8d4a5ccb023dc389a81106b9004823e1afbf","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","bundle":"bun build --bundle --target=node --minify --outfile dist/unimcp.js src/index.ts","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && cp dist/unimcp /usr/local/bin/unimcp && codesign --force --deep --sign - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"_npmVersion":"11.3.0","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"chokidar":"^5.0.0","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.2","devDependencies":{"typescript":"^6.0.2","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/unimcp_1.0.1_1775761449100_0.5039784283191424","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@dandehoon/unimcp","version":"1.1.0","keywords":[],"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"MIT","_id":"@dandehoon/unimcp@1.1.0","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"899bb900d1ef8f6f801dba049c0f1a1f0079093f","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.1.0.tgz","fileCount":18,"integrity":"sha512-80moE0TXWPWeYF8e8dh/203+ONPxswHS9ub6C3BFjF4V50QmDhdwujhX6bmX4gQLr4WVF8xvrR3stL3dmOrexg==","signatures":[{"sig":"MEQCIH2zyciahjIebJQxufAw2ZIWon2KDIQVlYMwmVHxFnG1AiA5R4ir/9B8wpTxafOCwEAOyqG8DSf91emlGDz+Nbzk6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":489884},"main":"index.js","pnpm":{"overrides":{"hono":">=4.12.12","@hono/node-server":">=1.19.13"}},"type":"module","gitHead":"3991f8878ed9504714de21989a47dba9cd384c6d","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","bundle":"bun build --bundle --target=node --minify --outfile dist/unimcp.js src/index.ts","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && cp dist/unimcp /usr/local/bin/unimcp && codesign --force --deep --sign - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"_npmVersion":"11.3.0","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"chokidar":"^5.0.0","commander":"^14.0.3","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.2","devDependencies":{"typescript":"^6.0.2","@types/node":"^25.5.2"},"_npmOperationalInternal":{"tmp":"tmp/unimcp_1.1.0_1776278228252_0.9725506990311588","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@dandehoon/unimcp","version":"1.1.1","keywords":[],"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"MIT","_id":"@dandehoon/unimcp@1.1.1","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"581c59b416409fd24f85c79968d24d6ade0f880a","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.1.1.tgz","fileCount":18,"integrity":"sha512-/ZDkoqWDYe7+2/QRUF9nR1XQfO4PxEthlgBHpskT1oShpvfE2ocPJDajx32CSrYVzKq4qot8ShGsQo0TPB2BLg==","signatures":[{"sig":"MEYCIQD/lhagBaTe7x8j5IB4hK26EgGu8feHgSntK3c8y32F1AIhANT/QgMwOZY9FkIySoghCuFNgC5qYKGhDvOxtXdIE6E+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":490704},"main":"index.js","pnpm":{"overrides":{"hono":">=4.12.12","@hono/node-server":">=1.19.13"}},"type":"module","gitHead":"a64bf006ef597cd3fba379a83aafc4d46ea106a3","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","bundle":"bun build --bundle --target=node --minify --outfile dist/unimcp.js src/index.ts","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && cp dist/unimcp /usr/local/bin/unimcp && codesign --force --deep --sign - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"_npmVersion":"11.3.0","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"chokidar":"^5.0.0","commander":"^14.0.3","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.2","devDependencies":{"typescript":"^6.0.2","@types/node":"^25.5.2"},"_npmOperationalInternal":{"tmp":"tmp/unimcp_1.1.1_1776801679028_0.7881017767154779","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@dandehoon/unimcp","version":"1.2.0","keywords":[],"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"MIT","_id":"@dandehoon/unimcp@1.2.0","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"1bc4cf565a93a5026cf957eb0c47148572f4a4ce","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.2.0.tgz","fileCount":18,"integrity":"sha512-Oh9DNKxJQWIDNlEdY+uNL/Be0LYYZcnYM6y6YMIGZXofbbhrMcMPygJdb2KvkUN9XsZw/mGVqjsfU5eKtZKMsw==","signatures":[{"sig":"MEQCIC7Mc4KJ8BpUQ13VwV1FohbhTevE3DnYK7h/7wDGO5mnAiA5MhVM+Rvrqeqg/dqgz9ewHeDAyLDuLP1ABGiIyoXNvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":505393},"main":"index.js","type":"module","_from":"file:dandehoon-unimcp-1.2.0.tgz","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","bundle":"bun build --bundle --target=node --minify --outfile dist/unimcp.js src/index.ts","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && cp dist/unimcp /usr/local/bin/unimcp && codesign --force --deep --sign - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"_resolved":"/private/var/folders/9h/zq0xcb1j5bb2q79lxkyx7jfr0000gp/T/778477efed3662ce13414abf040cbac3/dandehoon-unimcp-1.2.0.tgz","_integrity":"sha512-Oh9DNKxJQWIDNlEdY+uNL/Be0LYYZcnYM6y6YMIGZXofbbhrMcMPygJdb2KvkUN9XsZw/mGVqjsfU5eKtZKMsw==","_npmVersion":"11.3.0","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"chokidar":"^5.0.0","commander":"^14.0.3","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"tmp":"tmp/unimcp_1.2.0_1779602081765_0.8700271144847698","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@dandehoon/unimcp","version":"1.3.0","keywords":[],"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"MIT","_id":"@dandehoon/unimcp@1.3.0","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"130e5faeb7b41cf79c5a0f530448b0b1c2bc5a0a","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.3.0.tgz","fileCount":19,"integrity":"sha512-JnIKoZ2yT/HWAG11dzDKbxuVhV5XvxNEEGWgG9xesk/Xm5r1Q0Wl2sw7ZPn8rKTd+faZzIs4tAaaxcfAGmDVGg==","signatures":[{"sig":"MEUCIGXD5rxv2M3sNlP0tlznULmB6LmfPAA1P7DBTSFQ4q9TAiEAyFgeawhPM2RqxaCdb6vKGq0G9p9T5Wc+X/54sAsU+BY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":527517},"main":"index.js","type":"module","_from":"file:dandehoon-unimcp-1.3.0.tgz","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","bundle":"bun build --bundle --target=node --minify --outfile dist/unimcp.js src/index.ts","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && rm -f /usr/local/bin/unimcp && cp dist/unimcp /usr/local/bin/unimcp && codesign --force -s - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"_resolved":"/private/var/folders/9h/zq0xcb1j5bb2q79lxkyx7jfr0000gp/T/48f345a3edd8dced1778c19c99a62f66/dandehoon-unimcp-1.3.0.tgz","_integrity":"sha512-JnIKoZ2yT/HWAG11dzDKbxuVhV5XvxNEEGWgG9xesk/Xm5r1Q0Wl2sw7ZPn8rKTd+faZzIs4tAaaxcfAGmDVGg==","_npmVersion":"11.3.0","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"chokidar":"^5.0.0","commander":"^14.0.3","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"tmp":"tmp/unimcp_1.3.0_1780040467031_0.2928301406378029","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"_id":"@dandehoon/unimcp@1.5.0","bin":{"unimcp":"bin/unimcp.js"},"dist":{"shasum":"d83fbd4e8e9262c187988174676e2b225795ecca","tarball":"https://registry.npmjs.org/@dandehoon/unimcp/-/unimcp-1.5.0.tgz","fileCount":19,"integrity":"sha512-rMjG9nTlfujwoLqH7beIfdla+lQeyZM6zX+F5p87ZySeg6wu6OaX73UJjh/+xRCfSiNWj1Qp4/70gxAUKP/wiw==","signatures":[{"sig":"MEYCIQDHOUpmHfs6GcEN2usTNKeTqiKelh/ePveDtRpLAFqxpgIhAPCCPJoorfFpnofmQxNwm2IgHnaxjbKU7+BQDlfpA3if","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCusLOjcK/D55NQmT/1i7Z7CDK5qnvBJN/Jx8YamL7CGAIhAPPbPE7wfbMmJJHof4XCSsPyeB7RR9sf9OpGBgyTyOWd"}],"unpackedSize":531471},"main":"index.js","name":"@dandehoon/unimcp","type":"module","_from":"file:dandehoon-unimcp-1.5.0.tgz","author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"MIT","scripts":{"dev":"bun run src/index.ts","http":"bun run src/index.ts --http","test":"bun test tests/","build":"bun build --compile --minify src/index.ts --outfile dist/unimcp && rm -f ./*.bun-build","bundle":"bun build --bundle --target=node --minify --outfile dist/unimcp.js src/index.ts","daemon":"bun run src/index.ts --daemon","collect":"bun run src/index.ts collect","register":"bun run src/index.ts setup","typecheck":"tsc --noEmit","install-bin":"pnpm build && rm -f /usr/local/bin/unimcp && cp dist/unimcp /usr/local/bin/unimcp && codesign --force -s - /usr/local/bin/unimcp","register-node":"node bin/unimcp.js setup"},"version":"1.5.0","_npmUser":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"keywords":[],"_resolved":"/private/var/folders/9h/zq0xcb1j5bb2q79lxkyx7jfr0000gp/T/0cda51f05f8097cfc4d1128c8e9e1b01/dandehoon-unimcp-1.5.0.tgz","_integrity":"sha512-rMjG9nTlfujwoLqH7beIfdla+lQeyZM6zX+F5p87ZySeg6wu6OaX73UJjh/+xRCfSiNWj1Qp4/70gxAUKP/wiw==","_npmVersion":"11.19.1","description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","directories":{},"maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"_nodeVersion":"26.9.0","dependencies":{"chokidar":"^5.0.0","commander":"^14.0.3","minimatch":"^10.2.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/unimcp_1.5.0_1790010500171_0.21860032976651"}}},"time":{"created":"2026-04-09T18:41:45.553Z","modified":"2026-09-21T17:08:20.450Z","1.0.0":"2026-04-09T18:41:45.788Z","1.0.1":"2026-04-09T19:04:09.269Z","1.1.0":"2026-04-15T18:37:08.440Z","1.1.1":"2026-04-21T20:01:19.209Z","1.2.0":"2026-05-24T05:54:41.951Z","1.3.0":"2026-05-29T07:41:07.270Z","1.5.0":"2026-09-21T17:08:20.283Z"},"author":{"name":"dandehoon","email":"nguyenbao1917@gmail.com"},"license":"MIT","keywords":[],"description":"A local MCP aggregator that merges multiple MCP servers into a single unified endpoint.","maintainers":[{"name":"dandehoon","email":"nguyenbao1917@gmail.com"}],"readme":"# unimcp\n\nA local MCP aggregator. One config, one daemon, per-client tool control.\n\n## Why\n\nMCP clients duplicate config. Every client that speaks MCP (Claude Code, Cursor, VS Code, OpenCode, custom agents) needs its own copy of the same server definitions. Change a server, update N configs.\n\nCentralized MCP servers solve duplication but create a new problem: tool visibility is controlled server-side. You either expose everything, or manage static profiles in the server config. Switching what a client sees means editing the server.\n\nDocker-based MCP servers add another pain point: poor lifecycle management. Stdio containers can hang indefinitely, orphaned processes pile up, and there's no shared daemon to manage them.\n\nunimcp fixes these:\n\n- **One config** — define all MCP servers in a single `unimcp.json`. Every client connects through unimcp.\n- **Auto daemon** — a shared background process manages all upstream connections. Auto-spawns on first use, auto-shuts down after 30s idle, hot-reloads on config change. No orphaned Docker containers or zombie stdio processes.\n- **Client-side tool control** — because clients share a daemon, each one can declare what tools it sees via `UNIMCP_INCLUDE`/`UNIMCP_EXCLUDE` env vars. No server-side profiles to manage.\n- **Per-secret isolation** — different `${VAR}` values (e.g. distinct `GITHUB_TOKEN`s) automatically get separate daemon instances.\n\nSee [Architecture](#architecture) for the full picture.\n\n## Quick start\n\n### 1. Install\n\n```bash\nnpm install -g @dandehoon/unimcp\n```\n\nOr run directly without installing:\n\n```bash\nnpx @dandehoon/unimcp\n```\n\n### 2. Create config\n\nAdd servers via CLI (similar to `claude mcp`):\n\n```bash\nunimcp add context7 --type http --url https://mcp.context7.com/mcp\nunimcp add searxng --command docker --args \"run,-i,--rm,dandehoon/searxng-mcp:latest\"\nunimcp add github --command npx --args \"-y,@modelcontextprotocol/server-github\" --env GITHUB_TOKEN='${GITHUB_TOKEN}'\nunimcp list\n```\n\nOr create `unimcp.json` directly — the format uses the same `mcpServers` schema as Claude Code, Cursor, and Copilot, so you can copy an existing config and it works as-is:\n\n```json\n{\n  \"mcpServers\": {\n    \"context7\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.context7.com/mcp\"\n    },\n    \"searxng\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"dandehoon/searxng-mcp:latest\"]\n    }\n  }\n}\n```\n\nAlready have MCP servers configured in your clients? Import them all at once:\n\n```bash\nunimcp collect --save\n```\n\n### 3. Register with your client\n\n```bash\nunimcp setup                          # all supported clients in current project\nunimcp setup --target=claude          # specific client only\nunimcp setup --global                 # user-level config\n```\n\nSupported targets: `claude`, `cursor`, `copilot`, `opencode`.\n\nDone. Your clients now connect through unimcp instead of spawning servers directly.\n\n## Architecture\n\nunimcp has two layers — a thin per-client **bridge** and a shared **daemon**:\n\n```mermaid\nflowchart LR\n    subgraph clients[\"MCP clients\"]\n        direction TB\n        cc[Claude Code]\n        cu[Cursor]\n        vs[VS Code / Copilot]\n    end\n    subgraph bridges[\"unimcp bridges — one stdio process per client\"]\n        direction TB\n        br1[unimcp]\n        br2[unimcp]\n        br3[unimcp]\n    end\n    subgraph daemon[\"unimcp daemon — shared, HTTP :4848\"]\n        agg[\"aggregator<br/>tools merged as<br/>serverName__toolName\"]\n    end\n    subgraph upstreams[\"upstream MCP servers\"]\n        direction TB\n        u1[\"context7\"]\n        u2[\"searxng\"]\n        u3[\"github\"]\n    end\n    cc <-- stdio --> br1\n    cu <-- stdio --> br2\n    vs <-- stdio --> br3\n    br1 -- \"HTTP /mcp<br/>X-Tools-Include / X-Tools-Exclude\" --> agg\n    br2 -- \"HTTP /mcp\" --> agg\n    br3 -- \"HTTP /mcp\" --> agg\n    agg -- HTTP --> u1\n    agg -- \"stdio (docker)\" --> u2\n    agg -- stdio --> u3\n```\n\n- **Bridge** — each MCP client spawns its own `unimcp` stdio process. It forwards `tools/list` and `tools/call` to the daemon over HTTP and applies the per-client `UNIMCP_INCLUDE` / `UNIMCP_EXCLUDE` filters as request headers.\n- **Daemon** — one shared HTTP server (`/mcp`) owns all upstream connections, merges their tools into the `serverName__toolName` namespace, and serves every bridge. Built-in endpoints: `/health`, `/status`, `/mcp`.\n\n### Lifecycle\n\n| Behavior | Detail |\n|----------|--------|\n| Auto-spawn | First bridge to start checks the PID file. If no daemon, it spawns one (detached) and waits up to 15 s for `/health`. |\n| Idle shutdown | Daemon counts SSE sessions; 30 s after the last one closes, it exits and removes its PID file. |\n| Hot reload | `unimcp.json` is watched. On change, the daemon swaps in a new aggregator without dropping in-flight requests. |\n| Port fallback | Daemon tries `UNIMCP_PORT` (default 4848); if taken, picks an OS-assigned port and writes the actual port into the PID file so bridges discover it. |\n| Reconnect | Bridges detect transport errors (`ECONNRESET`, session-gone, fetch-failed, …) and re-spawn the daemon if it has died. |\n\n### Per-context isolation\n\nEach running daemon is scoped to its own context — defined by which `unimcp.json` is being served and the values of any environment variables that config references. Two clients in the same project with matching env share one daemon; switch project, *or* change a referenced variable, and a fresh daemon spins up:\n\n```mermaid\nflowchart LR\n    a[\"Cursor<br/>foo/unimcp.json · ENV=dev\"] --> d1{{daemon 1}}\n    b[\"Claude<br/>foo/unimcp.json · ENV=dev\"] --> d1\n    c[\"Cursor<br/>foo/unimcp.json · ENV=prod\"] --> d2{{daemon 2}}\n    d[\"Cursor<br/>bar/unimcp.json\"] --> d3{{daemon 3}}\n```\n\nInspect or stop them with `unimcp status` and `unimcp stop`.\n\n## Configuration\n\nThe `unimcp.json` format extends the standard `mcpServers` schema used by Claude Code, Cursor, and other MCP clients. You can drop in an existing config and it works as-is.\n\nConfig is resolved in this order: `./unimcp.json` (local) > `--mcp-file` flag / `UNIMCP_CONFIG` env > `~/.config/unimcp/unimcp.json` (global).\n\n`${VAR}` references are expanded from your shell environment at load time. If a referenced variable is unset or empty, that server is skipped rather than started with a blank value.\n\n```jsonc\n{\n  \"mcpServers\": {\n    // HTTP server\n    \"context7\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.context7.com/mcp\",\n    },\n    // Stdio server (Docker)\n    \"searxng\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"dandehoon/searxng-mcp:latest\"],\n    },\n    // Stdio server with env vars and tool filtering\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-github\"],\n      \"env\": { \"GITHUB_TOKEN\": \"${GITHUB_TOKEN}\" },\n      \"include\": [\"search_*\", \"get_*\"],\n    },\n    // Disabled server (kept in config, not connected)\n    \"experimental\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"experimental-mcp\"],\n      \"enabled\": false,\n    },\n  },\n}\n```\n\n### Environment variables\n\n| Variable | Purpose |\n|----------|---------|\n| `UNIMCP_CONFIG` | Config file path |\n| `UNIMCP_PORT` | Daemon port (default: 4848) |\n| `UNIMCP_HOST` | Daemon host (default: 127.0.0.1) |\n| `UNIMCP_INCLUDE` | Comma-separated glob patterns; only matching tools are visible |\n| `UNIMCP_EXCLUDE` | Comma-separated glob patterns; matching tools are hidden |\n\n### Per-client tool control\n\nEach client controls its own view via environment variables, no server-side config needed:\n\n```jsonc\n// Claude Code (.mcp.json) — sees everything (no filter)\n{\n  \"mcpServers\": {\n    \"unimcp\": { \"command\": \"unimcp\" }\n  }\n}\n\n// Cursor (.cursor/mcp.json) — excludes internal tools\n{\n  \"mcpServers\": {\n    \"unimcp\": {\n      \"command\": \"unimcp\",\n      \"env\": { \"UNIMCP_EXCLUDE\": \"internal__*\" }\n    }\n  }\n}\n```\n\n`UNIMCP_INCLUDE` and `UNIMCP_EXCLUDE` accept comma-separated glob patterns using `serverName__toolName` format:\n\n```bash\nUNIMCP_INCLUDE=github__*,context7__*    # only these tools\nUNIMCP_EXCLUDE=internal__*              # everything except these\n```\n\nBoth server-level and client-level filters are AND-ed: a tool must pass both to be visible.\n\n## Commands\n\n```\n# Runtime\nunimcp                     Stdio mode (ensure daemon, bridge stdio ↔ daemon)\nunimcp --http              Run as HTTP daemon directly (no bridge)\nunimcp status              Show running daemon info and loaded tools\nunimcp stop [id]           Stop the daemon for current context, an ID prefix, or --all\nunimcp restart [id]        Stop the daemon; next client connection respawns it\n\n# Client integration\nunimcp setup               Register unimcp in client configs (claude/cursor/copilot/opencode)\nunimcp collect             Merge MCP configs from all clients into one\n\n# Config editing\nunimcp list                List servers in unimcp.json\nunimcp get <name>          Show server details\nunimcp add <name>          Add a server (--type, --command, --args, --env, --url, --header)\nunimcp add-json <name> …   Add a server from a JSON string\nunimcp remove <name>       Remove a server\n```\n\n## Development\n\n```bash\npnpm install\npnpm dev            # stdio mode\npnpm http           # HTTP daemon\npnpm typecheck      # tsc --noEmit\npnpm test           # bun test\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}