{"_id":"@arcadeai/mcpx","_rev":"8-3e73521084496f3cf6ccedf0230ebec7","name":"@arcadeai/mcpx","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@arcadeai/mcpx","version":"1.0.0","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.0.0","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"5b3613f5993382da47f914f49a21a39e2d09fdba","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.0.0.tgz","fileCount":62,"integrity":"sha512-JBBK8kdAc75sUk7zNXw6LH3F9Vmf2IArs3tSVL/jVX9GjB/1RVLcm1gjUg36oqIcc+qLsXCEhFvMvPRs+Tde3w==","signatures":[{"sig":"MEUCIHQxxb2MFuDmdBiclfI6TMZKZGn61rRkZt3Z9cmhXz2ZAiEA61x9MpmIjAEFTRdRrO+rdJwJe+Itieo7zMEzKt0TAcM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310864},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"evantahler","email":"evan@evantahler.com"},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.8.0","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.0.0_1784258285041_0.5941098600357808","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@arcadeai/mcpx","version":"1.0.1","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.0.1","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"38cf064dfa679130ac46b8307a5ace0001ebb7ba","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.0.1.tgz","fileCount":62,"integrity":"sha512-jPNiLPlLIxDPyRG36xu9AzyYm/wlcZPN0PZKHaXf7qbiBwXl/NvXsDju1FfziZxHD79GLUxRegklhLVF8C+tNQ==","signatures":[{"sig":"MEUCIDFiRaTLBVdTtBDZdc703Tmlr6WV/YRSx4HK22DmrbyZAiEAv6tRWOvpAmAMVGB2UuadCBwtylOvfasjW73q9T5kLu8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":310864},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"9370dc633afd298b9d562527194b9cc3be17d407","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.0.1_1784258640774_0.40091657042168816","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@arcadeai/mcpx","version":"1.1.0","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.1.0","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"a3fbddf54ee53d6a684bb75d3370bfcf4e183a33","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.1.0.tgz","fileCount":63,"integrity":"sha512-PWHK6pW/lL6+bE7tcF6q+8KByrG6A5pMwUlzRjclhnXIuptu955Uby5qWvpgALQUloDIFgydu/iLGb1koX9VaQ==","signatures":[{"sig":"MEQCIBZpeaguHSvant9x7LBzpoD240FSKTdw5kUuWqmYisAeAiBZy/tnUpwswaHZHsEewOa5g2k9kk91ddL8Hd6ozQVtlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDKa6puz0CNDosV1Copjzmeo4flTTERoovuLY7RLPr3TAIhAPC4Gj5qEX3V33SV8VC+AbtIzpNdOsXNxhxwsYNZvazi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":315802},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"f6c36e7c6bc961de4cf67a769cfb1eba121f9f4f","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.1.0_1788933714429_0.2916657141094896","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@arcadeai/mcpx","version":"1.2.0","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.2.0","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"a00b5be30ca986843cd3d8a21f4bc501bbc44d99","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.2.0.tgz","fileCount":65,"integrity":"sha512-HKxtcpWgykKqF8H18f+/efv8lDB69zO27OJ84zUXNJGddEwlCGG1loLQeUAm0ZXEd+Xb0RThn9sY3DWUYUZd8A==","signatures":[{"sig":"MEUCIAeidJGnMMenpyRPA266+OEs2EuaUJC/E6hflUqd/W+yAiEAxvdSlPJ1aOOLccF6VmRhSNn1EVOI0Kl8fCiZa5+XvHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDJgcFjVBq/fSDyRlqHB9VI9tdui0gVHN5blNMRtrix/gIgR5P7KMm2u8vcFBJzE735rzjc3vF+rqI/6LY3wIUJvhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":327810},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"45d6a80b451ed243bca8af7d50dfcfee166b40aa","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/core":"2.0.0","@modelcontextprotocol/client":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14","@modelcontextprotocol/server":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.2.0_1788936078412_0.10244353925232286","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@arcadeai/mcpx","version":"1.2.1","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.2.1","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"83f576f43f03c2264ebc4af26614f8fe297d8794","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.2.1.tgz","fileCount":65,"integrity":"sha512-8J3IcyBey6rY2xWCREduE6+CcbdC/rTcJ/XOkzo6xjej/zPzFhkwhINWvszeiS55Uo9tXU/FZJxLSNENaEpjVA==","signatures":[{"sig":"MEUCIQDlSE3rWy6q9bW82tpBk/r3lioGB9OC7lDAHGITVaQPRAIgUTO7DgdM8HJIn9QQIPJgMdtbfahN9n5EvmB0zItG5nY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDxcPkmKrpefc2uLd4CjQolZsKcEy7yRb/BIiSa5SxbdgIgVaP/zfXuM5D4AHITqi1GDC4EYppo348IWai6jRAZlf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":328482},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"a56808050844bfeaf1724861c11a7a02c3a6f912","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/core":"2.0.0","@modelcontextprotocol/client":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14","@modelcontextprotocol/server":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.2.1_1788968873950_0.8576324139256322","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@arcadeai/mcpx","version":"1.2.2","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.2.2","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"9335dcebefc17390bfe798dd4ed839cb5d8e96df","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.2.2.tgz","fileCount":65,"integrity":"sha512-mk+KPGokRyM2goigxjvO8u8cWiaMW1r512HWzvqQHRV0o9IQBxfxojtgAyc7VJmIdkcxbBJHExYhCaM3mBCGTA==","signatures":[{"sig":"MEUCICchSX9B8hoJ1aTT4pTl90j4sfKyCbl6a17e0PCyLZ5zAiEA+YoAq4ZAiW8jHY3QYCujQL6GcpI2qFnuhpm/MCZlOys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEZbIip2g+T2j2lls7SKvwWg/q8FNoL3kfWvEuJwzcEQAiEAo6iqNf716286XhMh80sHlhvsnfF2sotCTXcAgmtA3I8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":331988},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"f2afe3f0cfb70fe64e052f37ac3749511a1477a6","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/core":"2.0.0","@modelcontextprotocol/client":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14","@modelcontextprotocol/server":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.2.2_1788998993065_0.958545830498291","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@arcadeai/mcpx","version":"1.2.3","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"author":{"name":"Evan Tahler"},"license":"MIT","_id":"@arcadeai/mcpx@1.2.3","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"homepage":"https://github.com/arcadeai-labs/mcpx#readme","bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"bin":{"mcpx":"src/cli.ts"},"dist":{"shasum":"c40371835051b12ed85c05f7d7b7f8fef59c7ac0","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.2.3.tgz","fileCount":65,"integrity":"sha512-p5oBHN6ITX2uqP6cwOxsUX9qLhk5hKrcHoiSvRCpAOCQQ3T0GbBhr67iBfXZ8y2MqpeWXnmU4wv6WhrCKw8FBQ==","signatures":[{"sig":"MEUCIQD0Cl2GPcVzkN1KBKQORswJhDdGv/2mDRJk6Vd1HSZmoQIgYwQwnKsIQWwFpmkivRnfwvagu6eBEYTMXx1xWnFQkbo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHrz16flRpVldch0QJeaof1SDjM+mqPKdIPKvggjB6alAiBrgXsUQs/gRQqkpLbCE8BGbRWKRhXFLDQfMyeqycdTXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":334209},"main":"./src/sdk.ts","type":"module","types":"./src/sdk.ts","exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"637023567477ff4d2d2747187517e739492c1ceb","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/core":"2.0.0","@modelcontextprotocol/client":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14","@modelcontextprotocol/server":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpx_1.2.3_1789003358973_0.8049264955349029","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"_id":"@arcadeai/mcpx@1.3.0","bin":{"mcpx":"src/cli.ts"},"bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"dist":{"shasum":"c5701362e284f79d218b3381758e7cced188186a","tarball":"https://registry.npmjs.org/@arcadeai/mcpx/-/mcpx-1.3.0.tgz","fileCount":133,"integrity":"sha512-Cx8MS0h/gG/1zcii/zyY0kV0oh0Zi71uwJVBCxAELVG+ZDGEr/qWyABoMxWP925Oi+ie+z/Nmf1XA1tP54IOAw==","signatures":[{"sig":"MEQCIHkS7CW4+Cl02LWJ2tL2w2LmNNs1Uxi9mGqQVKYMCOiJAiABIVuuEfA3vEDMX4El9Dji87HUhyoQu+wWsYrgkwYQCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICgVULGTRSL2X6B3LGLlqHPbkr9p6O+jp7Zfhy/1OkUAAiAEusw1d6/NhnmA5UCF6TJGN3H1rg1qir8eDuOnMDPwQA=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arcadeai%2fmcpx@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":430016},"main":"./src/sdk.ts","name":"@arcadeai/mcpx","type":"module","types":"./src/sdk.ts","author":{"name":"Evan Tahler"},"exports":{".":"./src/sdk.ts","./cli":"./src/cli.ts"},"gitHead":"4ce3980daa88c8bfc7149e0fa25cf389a5440dfa","license":"MIT","scripts":{"dev":"bun run src/cli.ts","lint":"biome ci . && tsc --noEmit","test":"bun test","build":"bun build --compile --minify --sourcemap ./src/cli.ts --outfile dist/mcpx","format":"biome check --write .","prebuild":"bash scripts/apply-transformers-patch.sh","test:e2e":"bun test test/integration/remote-server.test.ts"},"version":"1.3.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"890f5ea3-8a43-47aa-8f14-4cfb9e522e8e"}},"homepage":"https://github.com/arcadeai-labs/mcpx#readme","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"_npmVersion":"11.5.1","description":"A command-line interface for MCP servers. curl for MCP.","directories":{},"maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"_nodeVersion":"22.14.0","dependencies":{"ajv":"^8.20.0","ansis":"^4.2.0","upgradr":"^0.1.1","commander":"^14.0.3","picomatch":"^4.0.4","nanospinner":"^1.2.2","onnxruntime-web":"1.26.0-dev.20260416-b7804b056c","@types/picomatch":"^4.0.3","@huggingface/transformers":"^4.2.0","@modelcontextprotocol/core":"2.0.0","@modelcontextprotocol/client":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6","@biomejs/biome":"^2.4.14","@modelcontextprotocol/server":"^2.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcpx_1.3.0_1790979228948_0.6328429336708805"}}},"time":{"created":"2026-07-17T03:18:04.875Z","modified":"2026-10-02T22:13:49.343Z","1.0.0":"2026-07-17T03:18:05.176Z","1.0.1":"2026-07-17T03:24:00.944Z","1.1.0":"2026-09-09T06:01:54.519Z","1.2.0":"2026-09-09T06:41:18.507Z","1.2.1":"2026-09-09T15:47:54.059Z","1.2.2":"2026-09-10T00:09:53.158Z","1.2.3":"2026-09-10T01:22:39.042Z","1.3.0":"2026-10-02T22:13:49.045Z"},"bugs":{"url":"https://github.com/arcadeai-labs/mcpx/issues"},"author":{"name":"Evan Tahler"},"license":"MIT","homepage":"https://github.com/arcadeai-labs/mcpx#readme","keywords":["mcp","cli","model-context-protocol","ai","llm","tools"],"repository":{"url":"git+https://github.com/arcadeai-labs/mcpx.git","type":"git"},"description":"A command-line interface for MCP servers. curl for MCP.","maintainers":[{"name":"sdserrano","email":"sdserranog@gmail.com"},{"name":"evantahler","email":"evan@evantahler.com"}],"readme":"# mcpx\n\nA command-line interface for MCP servers. **curl for MCP.**\n\nThe internet is debating CLI vs MCP like they're competitors. [They're not.](https://arcade.dev/blog/curl-for-mcp)\n\nThree audiences:\n\n1. **Coding agents** (Claude Code, Cursor) that prefer shelling out over maintaining persistent MCP connections — better for token management, progressive tool discovery, and sharing a single pool of MCP servers across multiple agents on one machine\n2. **Non-coding agents** that need programmatic access to MCP tools from TypeScript — remote, persistent, or isolated agents that don't have a shell\n3. **MCP developers** who need a fast way to discover, debug, and test their servers from the terminal\n\n## Install\n\n```bash\n# Via bun (all platforms)\nbun install -g @arcadeai/mcpx\n\n# Via curl (macOS/Linux)\ncurl -fsSL https://raw.githubusercontent.com/arcadeai-labs/mcpx/main/install.sh | bash\n```\n\n```powershell\n# Via PowerShell (Windows)\nirm https://raw.githubusercontent.com/arcadeai-labs/mcpx/main/install.ps1 | iex\n```\n\nThe curl/PowerShell installers download a pre-built binary — no runtime needed. The bun install method requires [Bun](https://bun.sh). Binaries for all platforms are also available on the [GitHub Releases](https://github.com/arcadeai-labs/mcpx/releases) page.\n\n## Quick Start\n\n```bash\n# Add the GitHub MCP server\nmcpx add github --url https://mcp.github.com\n\n# List all servers and their tools\nmcpx\n\n# List with descriptions\nmcpx -d\n\n# Inspect a server\nmcpx info github\n\n# Inspect a specific tool\nmcpx info github search_repositories\n\n# Execute a tool (JSON args)\nmcpx exec github search_repositories '{\"query\": \"mcp server\"}'\n\n# Execute a tool with shell-style flags (anything after `--` is parsed against the tool's input schema)\nmcpx exec github search_repositories -- --query \"mcp server\"\n\n# Execute a tool without specifying the server (auto-resolved)\nmcpx exec search_repositories '{\"query\": \"mcp server\"}'\nmcpx exec search_repositories -- --query \"mcp server\"\n\n# Search tools — combines keyword and semantic matching\nmcpx search \"post a ticket to linear\"\n\n# Search with only keyword/glob matching (fast, no embeddings)\nmcpx search -k \"*file*\"\n\n# Search with only semantic matching\nmcpx search -q \"manage pull requests\"\n\n# Limit the number of results (default: 10)\nmcpx search -n 5 \"manage pull requests\"\n```\n\n## Commands\n\n| Command                                | Description                                            |\n| -------------------------------------- | ------------------------------------------------------ |\n| `mcpx`                                 | List all configured servers and tools                  |\n| `mcpx servers`                         | List configured servers (name, type, detail)           |\n| `mcpx info <server>`                   | Server overview (version, capabilities, tools, counts, session id) |\n| `mcpx info <server> <tool>`            | Show tool schema                                       |\n| `mcpx search <query>`                  | Search tools (keyword + semantic)                      |\n| `mcpx search -k <pattern>`             | Keyword/glob search only                               |\n| `mcpx search -q <query>`               | Semantic search only                                   |\n| `mcpx search -n <number> <query>`      | Limit number of results (default: 10)                  |\n| `mcpx index`                           | Build/rebuild the search index                         |\n| `mcpx index -i`                        | Show index status                                      |\n| `mcpx exec <server> <tool> [json]`     | Validate inputs locally, then execute tool             |\n| `mcpx exec <tool> [json]`              | Execute tool (server auto-resolved if unambiguous)     |\n| `mcpx exec <server> <tool> -- --k=v`   | Shell-flag args (typed via the tool's input schema)    |\n| `mcpx exec <server> <tool> -f file`    | Read tool args from a JSON file                        |\n| `mcpx exec <server>`                   | List available tools for a server                      |\n| `mcpx auth <server>`                   | Authenticate with an HTTP MCP server (OAuth)           |\n| `mcpx auth <server> -s`                | Check auth status and token TTL                        |\n| `mcpx auth <server> -r`                | Force token refresh                                    |\n| `mcpx deauth <server>`                 | Remove stored authentication for a server              |\n| `mcpx add <name> --command <cmd>`      | Add a stdio MCP server to your config                  |\n| `mcpx add [name] --url <url>`          | Add an HTTP MCP server (name derived from URL if omitted) |\n| `mcpx remove <name>`                   | Remove an MCP server from your config                  |\n| `mcpx ping`                            | Check connectivity to all configured servers           |\n| `mcpx ping <server> [server2...]`      | Check connectivity to specific server(s)               |\n| `mcpx grade [server]`                  | Grade server quality against the 100-point rubric       |\n| `mcpx session`                         | Print Streamable HTTP session ids for all servers      |\n| `mcpx session <server> [server2...]`   | Print Streamable HTTP session id(s) for specific servers |\n| `mcpx skill install --claude`          | Install the mcpx skill for Claude Code                 |\n| `mcpx skill install --cursor`          | Install the mcpx rule for Cursor                       |\n| `mcpx resource`                        | List all resources across all servers                  |\n| `mcpx resource <server>`               | List resources for a server                            |\n| `mcpx resource <server> <uri>`         | Read a specific resource                               |\n| `mcpx prompt`                          | List all prompts across all servers                    |\n| `mcpx prompt <server>`                 | List prompts for a server                              |\n| `mcpx prompt <server> <name> [json]`   | Get a specific prompt                                  |\n| `mcpx exec [server] <tool> --no-wait`  | Execute as async task, return task handle immediately  |\n| `mcpx exec [server] <tool> --ttl <ms>` | Set task TTL in milliseconds (default: 60000)          |\n| `mcpx task list <server>`              | List tasks on a server                                 |\n| `mcpx task get <server> <taskId>`      | Get task status                                        |\n| `mcpx task result <server> <taskId>`   | Retrieve completed task result                         |\n| `mcpx task cancel <server> <taskId>`   | Cancel a running task                                  |\n| `mcpx allow <server>`                  | Allow an agent to exec all tools on a server           |\n| `mcpx allow <server> <tools...>`       | Allow specific tools only                              |\n| `mcpx allow --all`                     | Allow all mcpx exec calls                              |\n| `mcpx allow --all-read`                | Allow read-only commands (search, info, list, etc.)    |\n| `mcpx allow --list`                    | Show current mcpx-related permissions                  |\n| `mcpx allow --cursor <server>`         | Allow for Cursor instead of Claude Code                |\n| `mcpx deny <server>`                   | Remove permissions for a server                        |\n| `mcpx deny --all`                      | Remove all mcpx-related permissions                    |\n| `mcpx check-update`                    | Check for a newer version of mcpx                      |\n| `mcpx upgrade`                         | Upgrade mcpx to the latest version                     |\n\n## Options\n\n| Flag                      | Purpose                                                  |\n| ------------------------- | -------------------------------------------------------- |\n| `-h, --help`              | Show help                                                |\n| `-V, --version`           | Show version                                             |\n| `-d, --with-descriptions` | Include tool descriptions in list output                 |\n| `-c, --config <path>`     | Specify config file location                             |\n| `-v, --verbose`           | Show HTTP details and JSON-RPC protocol messages         |\n| `-S, --show-secrets`      | Show full auth tokens in verbose output (unmasked)       |\n| `-j, --json`              | Force JSON output (default when piped)                   |\n| `-F, --format <format>`   | Output format: `json` or `markdown`                      |\n| `-N, --no-interactive`    | Decline server elicitation requests (for scripted usage) |\n| `--no-color`              | Disable ANSI colors in output                            |\n| `--force-color`           | Force ANSI colors even when piped                        |\n| `-l, --log-level <level>` | Minimum server log level to display (default: `warning`) |\n| `--mcp-version <version>` | MCP protocol era: `v1`, `v2`, or `auto` (default: `v1`) |\n\n### Output & colors\n\nmcpx auto-detects whether stdout/stderr are interactive and adapts:\n\n- TTY → colored, formatted output (tables, headers, badges).\n- Non-TTY / piped → JSON.\n\nColor emission honors the standard env vars and matching flags:\n\n- `NO_COLOR=1` or `--no-color` — disable ANSI colors.\n- `FORCE_COLOR=1` or `--force-color` — enable ANSI colors even when piped.\n- `--json` / `-j` — JSON output, no colors.\n- `CI=true` — treated as non-interactive (spinners off).\n\nServer log messages (`notifications/message`) are displayed on stderr with level-appropriate coloring. Valid levels (in ascending severity): `debug`, `info`, `notice`, `warning`, `error`, `critical`, `alert`, `emergency`. When a server declares logging capability, mcpx sends `logging/setLevel` to request messages at the configured threshold and above.\n\n## Managing Servers\n\nAdd and remove servers from the CLI — no manual JSON editing required.\n\n```bash\n# Add a stdio server (anything after `--` is passed to the command verbatim)\nmcpx add filesystem --command npx -- -y @modelcontextprotocol/server-filesystem /tmp\n\n# Equivalent forms: repeatable --args, or a single comma-separated --args\nmcpx add filesystem --command npx --args -y --args @modelcontextprotocol/server-filesystem --args /tmp\nmcpx add filesystem --command npx --args \"-y,@modelcontextprotocol/server-filesystem,/tmp\"\n\n# Add an HTTP server with headers\nmcpx add my-api --url https://api.example.com/mcp --header \"Authorization:Bearer tok123\"\n\n# When --url is used, the name is optional — derived from the URL's last path\n# segment (or hostname if there is none). The example below stores the server\n# under the name \"evan-coding\".\nmcpx add --url https://api.arcade.dev/mcp/evan-coding\n\n# Add with tool filtering (repeatable, or comma-separated)\nmcpx add github --url https://mcp.github.com --allowed-tools \"search_*\" --allowed-tools \"get_*\"\n\n# Add a legacy SSE server (explicit transport)\nmcpx add legacy-api --url https://api.example.com/sse --transport sse\n\n# Add with environment variables (repeatable, or comma-separated)\nmcpx add my-server --command node --args server.js --env API_KEY=sk-123 --env DEBUG=true\n\n# Overwrite an existing server\nmcpx add filesystem --command echo --force\n\n# Remove a server (also cleans up auth.json)\nmcpx remove filesystem\n\n# Remove but keep stored auth credentials\nmcpx remove my-api --keep-auth\n\n# Preview what would be removed\nmcpx remove my-api --dry-run\n```\n\n**`add` options:**\n\n| Flag                       | Purpose                                                                |\n| -------------------------- | ---------------------------------------------------------------------- |\n| `--command <cmd>`          | Command to run (stdio server)                                          |\n| `--args <arg>`             | Argument for the command. Repeatable, or comma-separated. Tokens after `--` are also appended (stdio only). |\n| `--env <KEY=VAL>`          | Environment variable. Repeatable, or comma-separated.                  |\n| `--cwd <dir>`              | Working directory for the command                                      |\n| `--url <url>`              | Server URL (HTTP server)                                               |\n| `--header <Key:Value>`     | HTTP header. Repeatable.                                               |\n| `--transport <type>`       | Transport: `sse` or `streamable-http`                                  |\n| `--allowed-tools <pat>`    | Allowed tool pattern. Repeatable, or comma-separated.                  |\n| `--disabled-tools <pat>`   | Disabled tool pattern. Repeatable, or comma-separated.                 |\n| `--mcp-version <version>`  | MCP protocol era for this server (`v1`, `v2`, or `auto`)               |\n| `-f, --force`              | Overwrite if server already exists                                     |\n| `--no-auth`                | Skip automatic OAuth after adding                                      |\n| `--no-index`               | Skip rebuilding the search index                                       |\n\n**`remove` options:**\n\n| Flag          | Purpose                                           |\n| ------------- | ------------------------------------------------- |\n| `--keep-auth` | Don't remove stored auth credentials              |\n| `--dry-run`   | Show what would be removed without changing files |\n\n## Configuration\n\nConfig lives in `~/.mcpx/` (or the current directory). Three files:\n\n### `servers.json` — MCP Server Definitions\n\nStandard MCP server config format. Supports both stdio and HTTP servers.\n\n```json\n{\n  \"mcpServers\": {\n    \"filesystem\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \".\"],\n      \"env\": { \"API_KEY\": \"${API_KEY}\" },\n      \"allowedTools\": [\"read_file\", \"list_directory\"],\n      \"disabledTools\": [\"delete_file\"]\n    },\n    \"github\": {\n      \"url\": \"https://mcp.github.com\"\n    },\n    \"internal-api\": {\n      \"url\": \"https://mcp.internal.example.com\",\n      \"headers\": { \"Authorization\": \"Bearer ${TOKEN}\" }\n    },\n    \"legacy-sse\": {\n      \"url\": \"https://legacy.example.com/sse\",\n      \"transport\": \"sse\"\n    },\n    \"modern-mcp\": {\n      \"url\": \"https://mcp.example.com\",\n      \"mcp\": \"v2\"\n    }\n  }\n}\n```\n\n**Stdio servers** — `command` + `args`, spawned as child processes\n**HTTP servers** — `url`, with optional static `headers` for pre-shared tokens. OAuth is auto-discovered at connection time via `.well-known/oauth-authorization-server` — no config needed. By default, mcpx tries Streamable HTTP first and automatically falls back to legacy SSE if the server doesn't support it. Set `\"transport\": \"sse\"` or `\"transport\": \"streamable-http\"` to skip auto-detection. Set `\"mcp\": \"v1\"`, `\"v2\"`, or `\"auto\"` to choose the protocol era (see [MCP versions](#mcp-versions)).\n\nEnvironment variables are interpolated via `${VAR_NAME}` syntax. Set `MCP_STRICT_ENV=false` to warn instead of error on missing variables.\n\n**Tool filtering:**\n\n- `allowedTools` — glob patterns for tools to expose (whitelist)\n- `disabledTools` — glob patterns for tools to hide (blacklist, takes precedence)\n\n### `auth.json` — OAuth Token Storage (managed automatically)\n\nStores OAuth tokens for HTTP MCP servers. You don't edit this directly — managed automatically.\n\n```json\n{\n  \"github\": {\n    \"access_token\": \"gho_xxxx\",\n    \"refresh_token\": \"ghr_xxxx\",\n    \"expires_at\": \"2026-03-03T12:00:00Z\",\n    \"token_type\": \"bearer\",\n    \"scope\": \"repo,read:org\"\n  },\n  \"linear\": {\n    \"access_token\": \"lin_xxxx\",\n    \"refresh_token\": \"lin_ref_xxxx\",\n    \"expires_at\": \"2026-03-04T08:30:00Z\",\n    \"token_type\": \"bearer\"\n  }\n}\n```\n\nTokens are automatically refreshed when expired (if a refresh token is available). Any command that connects to a server (`exec`, `info`, `search`, listing) will refresh tokens transparently. If refresh is impossible or the server still rejects the token, the command fails immediately with a prompt to run `mcpx auth <server>` instead of reopening the browser. `mcpx auth <server> --status` shows current token state and TTL.\n\n### `search.json` — Semantic Search Index (managed automatically)\n\nContains every discovered tool with metadata for semantic search. Built by `mcpx index` and kept fresh automatically — `mcpx` (the default list) and `mcpx index --status` already fetch every server's live tools, so they detect new/changed/removed tools and re-index the affected servers in the background.\n\n```json\n{\n  \"version\": 1,\n  \"indexed_at\": \"2026-03-03T10:00:00Z\",\n  \"embedding_model\": \"Xenova/bge-small-en-v1.5\",\n  \"tools\": [\n    {\n      \"server\": \"linear\",\n      \"tool\": \"createIssue\",\n      \"description\": \"Create a new issue in Linear\",\n      \"input_schema\": { \"...\": \"...\" },\n      \"scenarios\": [\"Create a new issue in Linear\", \"create issue\"],\n      \"keywords\": [\"create\", \"issue\"],\n      \"embedding\": [0.012, -0.034, \"...\"]\n    }\n  ]\n}\n```\n\nEach tool gets:\n\n- **scenarios** — the tool description plus a keyword phrase derived from the tool name\n- **keywords** — terms extracted by splitting the tool name on `_`, `-`, and camelCase boundaries\n- **embedding** — 384-dim vector for cosine similarity search\n\nScenarios and keywords are extracted heuristically from tool names and descriptions. Embeddings are generated in-process using `Xenova/bge-small-en-v1.5` (~33MB ONNX model, downloaded on first run). No API keys needed.\n\n## Config Resolution Order\n\n1. `MCP_CONFIG_PATH` environment variable\n2. `-c / --config` flag\n3. `./servers.json` (current directory)\n4. `~/.mcpx/servers.json`\n\n## Environment Variables\n\n| Variable          | Purpose                     | Default    |\n| ----------------- | --------------------------- | ---------- |\n| `MCP_CONFIG_PATH` | Config directory path       | `~/.mcpx/` |\n| `MCP_DEBUG`       | Enable debug output         | `false`    |\n| `MCP_TIMEOUT`     | Request timeout (seconds)   | `1800`     |\n| `MCP_CONCURRENCY` | Parallel server connections | `5`        |\n| `MCP_MAX_RETRIES` | Retry attempts              | `3`        |\n| `MCP_STRICT_ENV`  | Error on missing `${VAR}`   | `true`     |\n| `MCP_VERSION`     | MCP protocol era (`v1`, `v2`, `auto`) | `v1` |\n\n## MCP versions\n\nmcpx uses the official MCP TypeScript **SDK v2** client (`@modelcontextprotocol/client`) and can speak both protocol eras:\n\n| Value  | Handshake                                                         | Use when                                      |\n| ------ | ----------------------------------------------------------------- | --------------------------------------------- |\n| `v1`   | 2025 `initialize` (legacy). Default.                              | Existing MCP servers (2024–2025 spec)         |\n| `v2`   | Pin [2026-07-28](https://modelcontextprotocol.io/specification/2026-07-28) (`server/discover`). No fallback. | Servers that require the modern protocol      |\n| `auto` | Probe for 2026-07-28, fall back to the 2025 handshake             | Mixed or unknown servers                      |\n\nChoose it in any of these places (most specific wins):\n\n```bash\n# 1. Per-server config (highest priority)\nmcpx add github --url https://mcp.github.com --mcp-version v2\n# or in servers.json: { \"url\": \"...\", \"mcp\": \"v2\" }\n\n# 2. CLI flag (applies to servers without an `mcp` field)\nmcpx --mcp-version v2 ping github\nmcpx --mcp-version auto exec github search_repositories '{\"query\":\"mcp\"}'\n\n# 3. Environment variable\nexport MCP_VERSION=v2\nmcpx ping github\n```\n\n```typescript\n// 4. TypeScript SDK\nconst client = new McpxClient({ mcp: \"v2\" });\n```\n\n`mcpx info <server>` reports the requested `mcp` value plus the negotiated `protocolVersion` and `protocolEra`.\n\n## Server quality checks\n\nGrade a configured MCP server across security, protocol readiness, tool quality, and surface size:\n\n```bash\nmcpx grade github\nmcpx grade github --json\nmcpx grade github --expect github.com --min-score 80\nmcpx grade github --rubric ./my-rubric.json\nmcpx grade github --no-probe\n```\n\nInteractive output includes a color-coded ASCII letter grade, compact overall and per-category pie charts,\nprogress bars, detailed rule evidence, and prioritized improvements. Use `--json` (or `--format json`) for a stable\nmachine-readable report with `schemaVersion`, score, grade, category totals, status summary, and every rule result.\n\nThe default rubric is [`rubric/mcp-quality.json`](rubric/mcp-quality.json). It is the single source of truth for\nrule weights and grade bands; custom rubrics may change weights or disable rules, but enabled weights must total\n100. Safe error-quality probes call at most three tools explicitly annotated with `readOnlyHint: true`; use\n`--no-probe` to skip them.\n\nFor HTTP servers, the report also runs MCP Debugger-style wire diagnostics: malformed JSON-RPC and protocol\nheaders, Origin rejection, session termination, response envelopes and content types, reserved `_meta`, error and\nnotification behavior, OAuth challenge parsing, protected-resource metadata, authorization-server discovery,\nPKCE, registration, grants, token authentication methods, and synthetic invalid-token rejection. The invalid-token\nprobe can create an expected security-log event. `--no-probe` disables tool calls but not these non-mutating\nprotocol and authorization probes.\n\nThe checks are inspired by the [ToolBench methodology](https://toolbench.arcade.dev/methodology),\n[Smithery scoring guidance](https://github.com/AgentWorkforce/relaycast/blob/main/.claude/skills/optimizing-smithery-score/SKILL.md),\n[MCP Debugger](https://mcpdebugger.dev/about) and its\n[example report](https://mcpdebugger.dev/results/3K9iOLV1AVfFeMLZuwrpd8XeVqm), the\n[official MCP conformance suite](https://github.com/modelcontextprotocol/conformance), and the\n[MCP tool specification](https://modelcontextprotocol.io/specification/draft/server/tools).\n\n## OAuth Flow\n\nFor HTTP MCP servers that require OAuth:\n\n```bash\n# Start the OAuth flow — opens browser for authorization\nmcpx auth github\n\n# Check token status\nmcpx auth github -s\n# => github: authenticated (expires in 47m)\n\n# Force re-authentication\nmcpx auth github -r\n\n# Authenticate without rebuilding the search index\nmcpx auth github --no-index\n```\n\nThe OAuth flow:\n\n1. Discovers the server's OAuth metadata via `/.well-known/oauth-authorization-server`\n2. Starts a local callback server on a random port\n3. Opens the browser for user authorization\n4. Exchanges the authorization code for tokens\n5. Stores tokens in `auth.json`\n6. Automatically refreshes tokens before they expire on any subsequent command\n7. If a stored token is rejected and cannot be refreshed, commands fail immediately with a prompt to run `mcpx auth <server>` — they do not reopen the browser in a loop\n\n## Search\n\n`mcpx search` is a single command that combines keyword matching and semantic vector search. By default, both strategies run and results are merged.\n\n```bash\n# Combined search (default) — keyword hits + semantic matches, merged and ranked\nmcpx search \"send a message to slack\"\n# => slack/postMessage          (0.94) Post a message to a channel\n# => slack/sendDirectMessage    (0.87) Send a DM to a user\n# => teams/sendMessage          (0.72) Send a Teams message\n\n# Keyword only — fast glob match against tool names, descriptions, and keywords\nmcpx search -k \"*pull*request*\"\n# => github/createPullRequest\n# => github/getPullRequest\n# => github/mergePullRequest\n\n# Semantic only — vector similarity against intent\nmcpx search -q \"review someone's code changes\"\n# => github/submitPullRequestReview  (0.91) Submit a PR review\n# => github/getPullRequest           (0.85) Get PR details\n# => github/listPullRequestCommits   (0.78) List commits in a PR\n```\n\nThe combined search pipeline:\n\n1. **Keyword match** — glob/substring against tool names, descriptions, and indexed keywords\n2. **Semantic match** — embed the query, cosine similarity against tool embeddings\n3. **Merge & rank** — combine both result sets, deduplicate, sort by score\n4. **Return** — top results with similarity scores\n\nThe index updates incrementally — only new or changed tools are re-indexed. The first run indexes everything; subsequent runs are fast.\n\n## Tasks (Async Tool Execution)\n\nMCP servers can declare support for [tasks](https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/tasks) — long-running operations that return a task handle instead of blocking until completion. When a tool supports tasks (`execution.taskSupport: \"optional\"` or `\"required\"`), mcpx automatically uses task-augmented execution.\n\n```bash\n# Default: wait for the task to complete, showing progress updates\nmcpx exec my-server long_running_tool '{\"input\": \"data\"}'\n\n# Return immediately with a task handle (useful for scripting)\nmcpx exec my-server long_running_tool '{\"input\": \"data\"}' --no-wait\n# => Task created: task-abc123 (status: working)\n\n# Check task status\nmcpx task get my-server task-abc123\n\n# Retrieve the result once complete\nmcpx task result my-server task-abc123\n\n# List all tasks on a server\nmcpx task list my-server\n\n# Cancel a running task\nmcpx task cancel my-server task-abc123\n```\n\nFor tools that don't support tasks, `exec` works exactly as before — no changes needed.\n\n## Elicitation (Server-Requested User Input)\n\nMCP servers can request user input mid-operation via [elicitation](https://modelcontextprotocol.io/specification/draft/client/elicitation). mcpx supports both modes:\n\n- **Form mode**: The server sends a JSON schema describing input fields (strings, numbers, booleans, enums, multi-select). mcpx renders prompts in the terminal and validates input before returning it.\n- **URL mode**: The server sends a URL for the user to visit (e.g., for authentication or payment flows). mcpx opens it in the default browser.\n\n```bash\n# Interactive — prompts appear in the terminal\nmcpx exec my-server deploy_tool '{\"target\": \"staging\"}'\n# Server requests input: Confirm deployment\n#   *Confirm [y/n]: y\n\n# Non-interactive — decline all elicitation (for scripts/CI)\nmcpx exec my-server deploy_tool '{\"target\": \"staging\"}' --no-interactive\n\n# JSON mode — elicitation requests are written to stdout as JSON,\n# and responses are read from stdin (for programmatic handling)\necho '{\"action\":\"accept\",\"content\":{\"confirm\":true}}' | \\\n  mcpx exec my-server deploy_tool '{\"target\": \"staging\"}' --json\n```\n\n## Debugging with Verbose Mode\n\n`-v` shows both HTTP request/response details (like `curl -v`) and JSON-RPC protocol messages exchanged with the server. All debug output goes to stderr so piping to `jq` still works.\n\n### JSON-RPC Protocol Tracing\n\nVerbose mode traces every JSON-RPC message at the transport layer — requests, responses, and notifications — for both stdio and HTTP servers:\n\n```bash\nmcpx -v exec mock echo '{\"message\":\"hello\"}'\n\n# → initialize (id: 0)\n# ← initialize (id: 0) [45ms] — mock-server v1.0\n# → notifications/initialized\n# → tools/call (id: 1)\n# ← tools/call (id: 1) [12ms] — ok\n```\n\nWith `--json`, trace output is NDJSON on stderr (one JSON object per message):\n\n```bash\nmcpx -v -j exec mock echo '{\"message\":\"hello\"}' 2>trace.jsonl\n```\n\n### HTTP Traffic\n\nFor HTTP/SSE servers, verbose mode also shows raw HTTP headers and timing:\n\n```bash\nmcpx -v exec arcade Gmail_WhoAmI\n\n# > POST https://api.arcade.dev/mcp/evan-coding\n# > authorization: Bearer eyJhbGci...\n# > content-type: application/json\n# > accept: application/json, text/event-stream\n# >\n# {\n#   \"method\": \"tools/call\",\n#   \"params\": {\n#     \"name\": \"Gmail_WhoAmI\",\n#     \"arguments\": {}\n#   }\n# }\n# < 200 OK (142ms)\n# < content-type: application/json\n# < x-request-id: abc123\n# <\n# { \"content\": [ ... ] }\n\n# Debug on stderr, clean JSON on stdout\nmcpx -v exec arcade Gmail_WhoAmI | jq .\n\n# Show full auth tokens (unmasked)\nmcpx -v -S exec arcade Gmail_WhoAmI\n```\n\nThe `>` / `<` convention matches curl — `>` for request, `<` for response. The `→` / `←` arrows show JSON-RPC protocol messages with method names, IDs, round-trip timing, and result summaries.\n\n## Session IDs\n\nStreamable HTTP servers may issue an `mcp-session-id` after initialize. That id lives on the transport mcpx keeps after connect — it is not a config-file field. You can export it from a live connection:\n\n```bash\n# Print session ids for every configured server\nmcpx session\n\n# One or more servers\nmcpx session github\nmcpx session github linear --json\n\n# Also included on connect metadata\nmcpx ping github --json\nmcpx info github\n```\n\nStdio and SSE transports (and HTTP servers that omit the header) report no session id.\n\nFrom TypeScript:\n\n```typescript\nconst sessionId = await client.getSessionId(\"github\");\n// or: (await client.getServerInfo(\"github\")).sessionId\n```\n\n## Input Validation\n\n`mcpx exec` validates tool arguments locally before sending them to the server. MCP tools advertise a JSON Schema for their inputs — mcpx uses this to catch errors fast, without a round-trip.\n\n```bash\n# Missing required field — caught locally\nmcpx exec github create_issue '{\"title\": \"bug\"}'\n# => error: missing required field \"repo\" (github/create_issue)\n\n# Wrong type — caught locally\nmcpx exec github create_issue '{\"repo\": \"foo\", \"title\": 123}'\n# => error: \"title\" must be a string, got number (github/create_issue)\n\n# Valid — sent to server\nmcpx exec github create_issue '{\"repo\": \"foo\", \"title\": \"bug\"}'\n# => { ... }\n```\n\nValidation covers:\n\n- **Required fields** — errors before sending if any are missing\n- **Type checking** — string, number, boolean, array, object\n- **Enum values** — rejects values not in the allowed set\n- **Nested objects** — validates recursively\n\nIf a tool's `inputSchema` is unavailable (some servers don't provide one), execution proceeds without local validation.\n\n### Shell-flag args\n\nAnything after a `--` separator is parsed as shell flags using the tool's input schema for type coercion. This is handy for interactive use — you don't need to remember JSON quoting rules.\n\n```bash\n# JSON form\nmcpx exec github create_issue '{\"owner\":\"arcadeai-labs\",\"repo\":\"mcpx\",\"title\":\"bug\"}'\n\n# Equivalent shell-flag form\nmcpx exec github create_issue -- --owner arcadeai-labs --repo mcpx --title bug\n\n# --field=value also works\nmcpx exec github create_issue -- --owner=arcadeai-labs --repo=mcpx --title=bug\n\n# Booleans\nmcpx exec my-server flagit -- --enabled         # true\nmcpx exec my-server flagit -- --no-enabled      # false\n\n# Arrays — repeatable flag or comma-split\nmcpx exec my-server tag -- --label bug --label todo\nmcpx exec my-server tag -- --label bug,todo\n```\n\nType coercion follows the field's `type` in the input schema (`string`, `integer`, `number`, `boolean`, `array`). Nested objects must use the JSON form. Combining `--` shell flags with inline JSON args, `--file`, or stdin is rejected.\n\n## Shell Output & Piping\n\nOutput is human-friendly by default, JSON when piped:\n\n```bash\n# Human-readable\nmcpx info github\n\n# JSON (piped)\nmcpx info github | jq '.tools[].name'\n\n# Force JSON\nmcpx info github --json\n```\n\n### Output Formats (`--format`)\n\nTool results (`exec`, `task result`) support three output formats via the global `--format` / `-F` flag:\n\n| Format     | Description                                                             |\n| ---------- | ----------------------------------------------------------------------- |\n| `json`     | Full MCP protocol response as JSON (default)                            |\n| `text`     | Extract text from content blocks, strip protocol wrapper                |\n| `markdown` | Extract text and render with rich terminal formatting (colors, borders) |\n\n```bash\n# Default JSON output — full MCP response with content array\nmcpx exec github search_repositories '{\"query\":\"mcp\"}'\n\n# Markdown — rich terminal rendering with colors and formatting\nmcpx exec github search_repositories '{\"query\":\"mcp\"}' -F markdown\n```\n\nThe `markdown` format extracts text from MCP content blocks and renders it through Bun's built-in markdown parser with ANSI styling — headings, bold/italic, code blocks with borders, colored links, and bullet lists. JSON content is converted to a structured document with headings and bullet lists.\n\nFor other commands (`list`, `info`, `search`), `--format json` forces JSON output and `--format markdown` uses the existing human-friendly formatting.\n\n### Chaining tool results\n\nTool results are JSON by default, designed for chaining:\n\n```bash\n# Search repos and read the first result\nmcpx exec github search_repositories '{\"query\":\"mcp\"}' \\\n  | jq -r '.content[0].text | fromjson | .items[0].full_name' \\\n  | xargs -I {} mcpx exec github get_file_contents '{\"owner\":\"{}\",\"path\":\"README.md\"}'\n\n# Conditional execution\nmcpx exec filesystem list_directory '{\"path\":\".\"}' \\\n  | jq -e '.content[0].text | contains(\"package.json\")' \\\n  && mcpx exec filesystem read_file '{\"path\":\"./package.json\"}'\n```\n\nStdin and file input work for tool arguments:\n\n```bash\n# Pipe JSON directly\necho '{\"path\":\"./README.md\"}' | mcpx exec filesystem read_file\n\n# Pipe from a file\ncat params.json | mcpx exec server tool\n\n# Shell redirect from a file\nmcpx exec server tool < params.json\n\n# Read args from a file with --file flag\nmcpx exec filesystem read_file -f params.json\n```\n\n## Agent Integration\n\n### Claude Code Skill\n\nmcpx ships a Claude Code skill at `.claude/skills/mcpx.md` that teaches Claude Code how to discover and use MCP tools. Install it:\n\n```bash\n# Install to the current project (.claude/skills/mcpx.md)\nmcpx skill install --claude\n\n# Install globally (~/.claude/skills/mcpx.md)\nmcpx skill install --claude --global\n\n# Install to both locations\nmcpx skill install --claude --global --project\n\n# Overwrite an existing skill file\nmcpx skill install --claude --force\n```\n\nThen in any Claude Code session, the agent can use `/mcpx` or the skill triggers automatically when the agent needs to interact with external services. The skill instructs the agent to:\n\n1. **Search first** — `mcpx search \"<intent>\"` to find relevant tools\n2. **Inspect** — `mcpx info <server> <tool>` to get the schema before calling\n3. **Execute** — `mcpx exec <tool> '<json>'` to execute (or `mcpx exec <server> <tool> '<json>'` if the tool name is ambiguous)\n\nThis keeps tool schemas out of the system prompt entirely. The agent discovers what it needs on-demand, saving tokens and context window space.\n\n### Cursor Rule\n\nmcpx ships a Cursor rule at `.cursor/rules/mcpx.mdc` that teaches Cursor how to discover and use MCP tools. Install it:\n\n```bash\n# Install to the current project (.cursor/rules/mcpx.mdc)\nmcpx skill install --cursor\n\n# Install globally (~/.cursor/rules/mcpx.mdc)\nmcpx skill install --cursor --global\n\n# Install both Claude and Cursor at once\nmcpx skill install --claude --cursor\n\n# Overwrite an existing rule file\nmcpx skill install --cursor --force\n```\n\n### Raw System Prompt (other agents)\n\nFor non-Claude-Code agents, add this to the system prompt:\n\n```\nYou have access to MCP tools via the `mcpx` CLI.\n\nTo discover tools:\n  mcpx search \"<what you want to do>\"    # combined keyword + semantic\n  mcpx search -k \"<pattern>\"             # keyword/glob only\n  mcpx info <server> <tool>              # tool schema\n\nTo execute tools:\n  mcpx exec <tool> '<json args>'              # server auto-resolved\n  mcpx exec <server> <tool> '<json args>'     # explicit server\n  mcpx exec <server> <tool> -- --k=v          # shell-flag args (typed via schema)\n  mcpx exec <server> <tool> -f params.json\n\nAlways search before executing — don't assume tool names.\n```\n\n### Programmatic Usage (TypeScript SDK)\n\nFor agents that don't have shell access — remote, persistent, or isolated agents running in TypeScript:\n\n```typescript\nimport { McpxClient } from \"@arcadeai/mcpx\";\n\nconst client = new McpxClient();\n// or: new McpxClient({ mcp: \"v2\" }) // official SDK v2 client, pin 2026-07-28\n// or: new McpxClient({ mcp: \"auto\" }) // probe v2, fall back to v1\n// or: new McpxClient({ configDir: \"/path/to/.mcpx\" })\n// or: new McpxClient({ servers: { mcpServers: { ... } } })\n\n// 1. Search for tools\nconst results = await client.search(\"send a message\");\n\n// 2. Inspect the tool schema\nconst tool = await client.info(\"arcade\", \"Slack_SendMessage\");\n\n// 3. Execute the tool\nconst result = await client.exec(\"arcade\", \"Slack_SendMessage\", {\n  channel: \"#general\",\n  message: \"hello\",\n});\n\n// Also available: listTools, listResources, readResource,\n// listPrompts, getPrompt, listTasks, getTask, cancelTask,\n// getServerInfo, getServerNames, getSessionId, validateToolInput\n\nawait client.close();\n```\n\nThe SDK uses the same config files as the CLI (`~/.mcpx/servers.json`, `auth.json`, `search.json`). Server management (add, remove, auth) is done via the CLI — the SDK is read-only.\n\nYou can also pass server config directly, bypassing file loading entirely:\n\n```typescript\nconst client = new McpxClient({\n  servers: {\n    mcpServers: {\n      local: { command: \"node\", args: [\"server.js\"] },\n      remote: { url: \"https://mcp.example.com\", mcp: \"v2\" },\n    },\n  },\n  mcp: \"auto\", // default for servers that omit `mcp`\n});\n```\n\n#### Tool metadata\n\n`info()` and `listTools()` return the raw MCP `Tool`, so you get everything the server declares: `name`, `title`, `description`, `inputSchema`, `outputSchema`, `execution.taskSupport`, and `annotations`. The `annotations` object carries the MCP behavioral hints:\n\n```typescript\nconst tool = await client.info(\"github\", \"delete_repo\");\ntool?.annotations; // { title?, readOnlyHint?, destructiveHint?, idempotentHint?, openWorldHint? }\n```\n\n> ⚠️ Annotations are **untrusted hints** — per the MCP spec, clients should never make tool-use decisions based on annotations from untrusted servers. Treat the approval gate below as a guardrail, not a security boundary.\n\n#### Human-in-the-loop approval gate\n\nBecause the SDK runs non-interactively, mcpx can't prompt a human itself — instead you supply an approval callback and a policy for which tools to gate. This lets you require approval before, say, any **open-world writeable** tool (`openWorldHint: true` and not `readOnlyHint`) runs:\n\n```typescript\nimport { McpxClient, ToolApprovalDeniedError } from \"@arcadeai/mcpx\";\n\nconst client = new McpxClient({\n  servers: { mcpServers: { github: { url: \"https://mcp.github.com\" } } },\n  approvalPolicy: \"open-world-writeable\", // default is \"none\"\n  onApprovalRequired: async ({ server, tool, args, annotations, reason }) => {\n    // Prompt a human, call out to an approval service, check a policy, etc.\n    return await promptHuman(`Allow ${server}/${tool}? (${reason})`, args);\n  },\n});\n\n// Gated tools wait for the callback; returning false throws ToolApprovalDeniedError.\n// If a tool is gated but no onApprovalRequired callback was provided, exec() throws\n// ToolApprovalRequiredError (fail-closed).\nawait client.exec(\"github\", \"delete_repo\", { repo: \"old-thing\" });\n```\n\n`approvalPolicy` accepts:\n\n| Value                   | Gates                                                                              |\n| ----------------------- | ---------------------------------------------------------------------------------- |\n| `\"none\"` _(default)_    | nothing — existing behavior, zero overhead                                         |\n| `\"open-world-writeable\"`| tools with `openWorldHint: true` and not `readOnlyHint` (unannotated tools pass)   |\n| `\"writeable\"`           | any tool not explicitly `readOnlyHint: true` (also gates unannotated tools)        |\n| `\"all\"`                 | every `exec()` call                                                                |\n| `(tool, server) => boolean` | a custom predicate                                                             |\n| `Array<…>`              | any of the above, combined with OR                                                 |\n\nHelpers `isOpenWorldWriteable(tool)` and `isWriteable(tool)` are exported for building custom predicates, along with the `ToolAnnotations` type. `mcpx info <server> <tool>` also surfaces these hints in the CLI.\n\n**Gating a specific tool by name.** The annotation presets can't tell two similar tools apart — a \"create PR\" and a \"create issue\" tool both look like open-world writes. To gate one but not the other, use the custom predicate form and match on `tool.name` (and `server`):\n\n```typescript\nconst client = new McpxClient({\n  servers: { mcpServers: { github: { url: \"https://mcp.github.com\" } } },\n\n  // Require approval ONLY for creating PRs — issue creation runs freely.\n  approvalPolicy: (tool, server) => server === \"github\" && tool.name === \"create_pull_request\",\n\n  onApprovalRequired: async ({ server, tool, args }) => await promptHuman(`Allow ${server}/${tool}?`, args),\n});\n\nawait client.exec(\"github\", \"create_pull_request\", { ... }); // waits for approval\nawait client.exec(\"github\", \"create_issue\", { ... }); // runs immediately, no prompt\n```\n\nConfirm the exact `tool.name` first — it must match exactly, and servers name tools differently (e.g. `create_pull_request` vs `github_create_pr`):\n\n```bash\nmcpx search \"open pull request\"      # find the tool and its server\nmcpx info github create_pull_request # confirm the name\n```\n\nTo match a family of tools, use a regex (`/pull_request|merge_pr/.test(tool.name)`); to gate the PR tool _and_ everything open-world-writeable, combine them with the array form: `[\"open-world-writeable\", (tool, server) => …]`. Matching on `tool.name` is reliable — unlike `annotations`, which are untrusted server-supplied hints.\n\n## Permissions (Claude Code & Cursor)\n\nAI agents like Claude Code and Cursor prompt users to approve each `mcpx exec` call. `mcpx allow` and `mcpx deny` manage fine-grained permission rules so agents can self-authorize specific tools without broad access.\n\n**Key insight:** If the user allows the initial permission pattern once (safe — it only writes to local settings files), the agent can then grant itself access to specific tools as needed. This is an opt-in workflow — by default, agents cannot self-authorize and will prompt the user for each `mcpx exec` call.\n\n```bash\n# Allow all tools on a server (Claude Code, default)\nmcpx allow github\n\n# Allow for Cursor instead\nmcpx allow github --cursor\n\n# Allow specific tools only\nmcpx allow github search_repositories get_file\n\n# Allow read-only commands (search, info, list, servers, ping, etc.)\nmcpx allow --all-read\n\n# Allow all mcpx exec calls\nmcpx allow --all\n\n# Show current permissions across all scopes\nmcpx allow --list\nmcpx allow --list --cursor\n\n# Preview what would be written\nmcpx allow github --dry-run\n\n# Revoke a server's permissions\nmcpx deny github\n\n# Revoke all mcpx permissions\nmcpx deny --all\n```\n\n**Target flag** — by default, permissions target Claude Code. Use `--cursor` to target Cursor instead:\n\n| Flag        | Pattern prefix | Settings files                                  |\n| ----------- | -------------- | ----------------------------------------------- |\n| _(default)_ | `Bash(…)`      | `.claude/settings.local.json`, etc.             |\n| `--cursor`  | `Shell(…)`     | `.cursor/cli.json`, `~/.cursor/cli-config.json` |\n\n**Scope flags** control where the permission is written:\n\n| Flag        | Claude Code file              | Cursor file                 | Default |\n| ----------- | ----------------------------- | --------------------------- | ------- |\n| `--local`   | `.claude/settings.local.json` | `.cursor/cli.json`          | ✓       |\n| `--project` | `.claude/settings.json`       | `.cursor/cli.json`          |         |\n| `--global`  | `~/.claude/settings.json`     | `~/.cursor/cli-config.json` |         |\n\n**`allow` options:**\n\n| Flag         | Purpose                                             |\n| ------------ | --------------------------------------------------- |\n| `--all`      | Allow all mcpx exec calls                           |\n| `--all-read` | Allow read-only commands (search, info, list, etc.) |\n| `--list`     | Show current mcpx-related permissions               |\n| `--cursor`   | Target Cursor settings instead of Claude Code       |\n| `--local`    | Write to local settings (default)                   |\n| `--project`  | Write to project settings (shared)                  |\n| `--global`   | Write to global settings                            |\n| `--dry-run`  | Show patterns without writing                       |\n\n**`deny` options:**\n\n| Flag         | Purpose                                       |\n| ------------ | --------------------------------------------- |\n| `--all`      | Remove all mcpx-related permissions           |\n| `--all-read` | Remove read-only command permissions          |\n| `--cursor`   | Target Cursor settings instead of Claude Code |\n| `--local`    | Write to local settings (default)             |\n| `--project`  | Write to project settings (shared)            |\n| `--global`   | Write to global settings                      |\n| `--dry-run`  | Show what would be removed                    |\n\n## Development\n\n```bash\n# Install dependencies\nbun install\n\n# Run in development\nbun run dev\n\n# Run tests\nbun test\n\n# Build single binary\nbun run build\n\n# Lint\nbun lint\n```\n\n## Tech Stack\n\n| Layer       | Choice                                                |\n| ----------- | ----------------------------------------------------- |\n| Runtime     | Bun                                                   |\n| Language    | TypeScript                                            |\n| MCP Client  | `@modelcontextprotocol/client` (official SDK v2)          |\n| CLI Parsing | `commander`                                           |\n| Validation  | `ajv` (JSON Schema)                                   |\n| Embeddings  | `@huggingface/transformers` (Xenova/bge-small-en-v1.5) |\n\n## Inspiration\n\nInspired by [mcp-cli](https://github.com/philschmid/mcp-cli) by Phil Schmid, which nails the core DX of a shell-friendly MCP client. mcpx extends that foundation with OAuth support for HTTP servers and semantic tool search.\n\n## Why mcpx?\n\nmcpx is the client. If you need the server side — auth, governance, and production tools at scale — check out [Arcade](https://arcade.dev).\n\nThe full story: [curl for MCP: Why Coding Agents Are Happier Using the CLI](https://arcade.dev/blog/curl-for-mcp)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}