{"_id":"@alesya_h/jsmcp","_rev":"13-1d9121fb696c66c7d6ee6bbf98bfcf95","name":"@alesya_h/jsmcp","dist-tags":{"latest":"1.7.0"},"versions":{"1.0.0":{"name":"@alesya_h/jsmcp","version":"1.0.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.0.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"1d76fe70bf57f9e0f2011d9cd83551d73617075c","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.0.0.tgz","fileCount":4,"integrity":"sha512-cs/nMrd+xAerLXhyngoKu0JeTEja4xj4VJeB+6cnRMwO4J/9mr/hCu4K4L2cqKetlBW3kHDiW6I16f18cV/AfQ==","signatures":[{"sig":"MEQCIBr46JdH622B00ehXJfbjVUkfa9rPpzK8m0yORS1N8bqAiAqF45dMjal4NYXk32cOYJuhz37M/MRY3/NDOXybsnGJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50796},"type":"module","engines":{"node":">=18"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js","check":"node --check src/index.js","start":"node src/index.js"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"_npmVersion":"11.9.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.0.0_1774856104838_0.6970794275671386","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@alesya_h/jsmcp","version":"1.0.1","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.0.1","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"bb0d9ba9461eafa647633a6b9da4669b93d1cfa4","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.0.1.tgz","fileCount":4,"integrity":"sha512-HPPP4Dn+Ac0hbS2IlB4dbCg/c/NAan8CQDkC2Waxaoa8EYfbDoL16+66y8JbLzuczYETeMJmITtT5wYYG5RcXg==","signatures":[{"sig":"MEQCIDbVThroHNroE73hjybkn/HBqHbk3MJJkTk1nOOaETTEAiAyXS6hWqzH9wJ7kt062tkqL+7wq1qvirTKCkyZUxEJYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52117},"type":"module","engines":{"node":">=18"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js","check":"node --check src/index.js","start":"node src/index.js"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.0.1_1774856734408_0.5054047084371935","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alesya_h/jsmcp","version":"1.1.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.1.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"a3e6f49427fb258bef50b3dc827c7d56e5eb8890","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.1.0.tgz","fileCount":15,"integrity":"sha512-eHwYT/v7YAtKB6ZScMfkSAjJ/hCJ9WK2Z4Bmv2cwSqIToEZWFpd8iMUYfCBbb+qbFLgF4ZIXdRuBq2wohV0aQw==","signatures":[{"sig":"MEYCIQDzoEeQ6/TCXRf/VkOY5oPMXLK2JIqk74x7m9L4km9XlAIhAJzgXit6F1yuczbuvTJZ+p0ApjI7ICidC6QFEBREZ7MU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62152},"type":"module","engines":{"node":">=18"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^3.25.76","yaml":"^2.8.3","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.1.0_1774865811180_0.22069411303994357","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@alesya_h/jsmcp","version":"1.2.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.2.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"2aacf9612bf721fdf688cd82dc4dbdd4fd080eba","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.2.0.tgz","fileCount":16,"integrity":"sha512-2Jte9aorBGUSc2k2AkwkfQqY+5tWu7tWLDv6YZhCsCMyD1aKiqP+0RISS4xMO7zzzMr7YQt3aiUmp6yyy2YOew==","signatures":[{"sig":"MEUCIEK9RcC4yKIleVfcwqz7X0FdLxUG5salyySGQg+wWgBGAiEApx2KJKpzneDuX22yDSHnKyVKUTGtRoo1tooVv6zg/3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88200},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.2.0_1776053507323_0.7365491895479386","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@alesya_h/jsmcp","version":"1.2.2","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.2.2","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"5b868e76e9e83bb16d6934d4b94617b6a05010e9","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.2.2.tgz","fileCount":20,"integrity":"sha512-VAUN6uFP0bYWcOfvjVRsceCeVXMNBvIeOgbkkxp6kN8bQKqEhotoD0tLjtHiFIoid3NAzw+sMOCvjoxyo1QhRQ==","signatures":[{"sig":"MEYCIQDQZker/ZTjvfCv0XVKvMe4snv95jZIYJ/NVu8Od2UgmAIhAK3XI/xg6ov0CDYzwJkbPKFeuEJrLXa7kYEh56Et6Dug","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89803},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.2.2_1776216614876_0.5343258026039186","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@alesya_h/jsmcp","version":"1.3.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.3.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"a0e214d4cd5eeee617554bb7de1d2f4b5dafa57d","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.3.0.tgz","fileCount":22,"integrity":"sha512-AAYyPt918KsjzhGOV/QAp8HC04ZPr02Br/2DmOW18LTmPplqg82u6Jktz7yBNn/sH7J2ysDdebWeuMQxI1baew==","signatures":[{"sig":"MEYCIQDpKJrVRJwEcpxrPDh/BqDmu6s+Bs1yYc0cQFDsW3kjVwIhAJznFx9S9mAMZBJ+cwvfg1mWL0ojVXh2IDEcXv+gMyRj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103719},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.3.0_1777560957282_0.15995446709926808","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@alesya_h/jsmcp","version":"1.3.1","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.3.1","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"1fdbf7f45dcd8d6f4441ab3e6880e830d0cfcd35","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.3.1.tgz","fileCount":23,"integrity":"sha512-8Xtr04C3WjbOSZjLhTcMehv0wfYxmQ2UvpwknMpJqddPxcmSLGARpZ9TYB4BtdSR/6mF6EjIu4zz5M1DkC7bfQ==","signatures":[{"sig":"MEQCIFiXbI8MW1gO4eLXoOCo+KB5sxoUYQXGfEFNlRr9+fdKAiBgIkrFAX/sPmUm67Kh8wHaOzLZ624pHb+Cm9x82dub7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107704},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.3.1_1778285140943_0.28396692843315496","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@alesya_h/jsmcp","version":"1.3.2","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.3.2","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"fbd20331ffc82b1e5da8f0752cb0ba2a0f628e37","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.3.2.tgz","fileCount":23,"integrity":"sha512-U85kGji7FZgNYzAZSbgz1uqrkE3uYefj7qzTV++XXNOGqd3gNyzHMyBOf4pVoGEDwtZwsDn4dW1zolKhStw2QQ==","signatures":[{"sig":"MEYCIQDZD02QUXQ+6qh3pXEd9vh8apOsRrEuVlhXCIuNEXlQOQIhAIi23dOT7hHRXFccXhEVJPc+IoLA+zemC5xOws39OMtv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107936},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.3.2_1778314799953_0.4292969468436203","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@alesya_h/jsmcp","version":"1.4.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.4.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"204c8ebb8d5263a30a98963089dd53c94a9e3e7d","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.4.0.tgz","fileCount":23,"integrity":"sha512-3dMXy41un70WFYCGn0iDClMVMtUQw+ErWUI3L+F5piLg1K4pQd2EU+8uH1fkWFV1Mte69S/8u8IxO3G914J4NQ==","signatures":[{"sig":"MEUCIQDfXptV3C8wgmfLhLJxzoGgJpS3fZ2KpP6L3BxUDKTkhwIgP3mKkZnocbL01KI+6B73393WwoN+XYbLyK72TCzduqg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115858},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","change-case":"^5.4.4","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.4.0_1778387480379_0.057039600112694044","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@alesya_h/jsmcp","version":"1.5.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.5.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"29e3c420608e713831ccf312367c6c4435ea8109","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.5.0.tgz","fileCount":23,"integrity":"sha512-UvgX7jiCdz7CaAmyoNRKe+DD+bFAH1pNd17pCd5jbh/HlNvwX/j72gXkEgoyj8TyZlRUJyaIyoeHKIgJt5hjfA==","signatures":[{"sig":"MEUCIQDKRF7EKfCvXGyDCktgBUQoIAWZiWyOvqx+k4k3FtIHDwIgXcblneA4520LDmyl7POCZ4UP12DJ4kKNHFR7ZLgZ2jg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118350},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","change-case":"^5.4.4","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.5.0_1778418550960_0.20552335708333724","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@alesya_h/jsmcp","version":"1.6.0","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.6.0","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"85ef7970107d443c9d220edc13545fa5ba6d9e0a","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.6.0.tgz","fileCount":23,"integrity":"sha512-anWauF6rAobF6oYx9GDTgU4+dsV9Ruyp7IUPJiUfvekSSfLLrpb+X2BV5DOVIo3xXr+EXz1QrmxK92Evmsz3Zw==","signatures":[{"sig":"MEYCIQDVmuTc8n75uCG62XEuJbMPveUK8wT6Mwjaf68MjfviqQIhAPcpLMr/7MJZM2KL964ufWQoyj0VQmz2+UCndkzGSpgf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119826},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","change-case":"^5.4.4","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.6.0_1778668387628_0.9347859624856376","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@alesya_h/jsmcp","version":"1.6.1","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"author":{"name":"Alesya Huzik"},"license":"MIT","_id":"@alesya_h/jsmcp@1.6.1","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"bin":{"jsmcp":"src/index.js"},"dist":{"shasum":"a12e6c1d0d0062bdd5429dc3a500ca825815d1e9","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.6.1.tgz","fileCount":24,"integrity":"sha512-oh8CwsTblxOUhrsTDgvj8eEyOVlyv9ffX0Zkqo4rPw/VKbz3JxIZf4WU047bzq8Gr7qc0hzGqf9K19Ex8S/L7g==","signatures":[{"sig":"MEYCIQD36rUgRcJCv8fAqVREN8aXREfb3P4LtF7FHsWeYddEHwIhAMJbNYDpmkm8af0sZoSo0mbZDW2Ia0aKJKgqsp45JukP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123928},"type":"module","engines":{"node":">=22"},"scripts":{"test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","check":"node --check src/index.js","start":"node src/index.js run"},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"repository":{"url":"git+https://github.com/alesya-h/jsmcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.20.0","zod":"^3.25.76","yaml":"^2.8.3","change-case":"^5.4.4","@modelcontextprotocol/sdk":"^1.28.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jsmcp_1.6.1_1779534255025_0.07599337616155166","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@alesya_h/jsmcp","version":"1.7.0","description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","license":"MIT","author":{"name":"Alesya Huzik"},"repository":{"type":"git","url":"git+https://github.com/alesya-h/jsmcp.git"},"homepage":"https://github.com/alesya-h/jsmcp#readme","bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"type":"module","engines":{"node":">=22"},"bin":{"jsmcp":"src/index.js"},"keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"scripts":{"start":"node src/index.js run","check":"node --check src/index.js","test":"node test/smoke-test.js && node test/auth-cli-test.js && node test/config-file-test.js","test:pi":"node --experimental-strip-types test/pi-extension-test.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1.28.0","change-case":"^5.4.4","ws":"^8.20.0","yaml":"^2.8.3","zod":"^3.25.76"},"_id":"@alesya_h/jsmcp@1.7.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-Q7M8cN1ldzvnuBWi9DSNpLSrPbuNI5wwpqVqPXFmRfOYE4LTDL8DwOUvq0nvViMlWBPXuMrynltqN3GH1JrEkg==","shasum":"3e2044bb7c1cecd376f9c611ec397255d0b72053","tarball":"https://registry.npmjs.org/@alesya_h/jsmcp/-/jsmcp-1.7.0.tgz","fileCount":27,"unpackedSize":146672,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDb2TgYv/o7PvV0+cAGPrFkKLCWH6LJZSZX3oI4Q7TI0QIhAJanssvzHNQP9PasUlzBJWdwa+4oCfKrl1V3vc5awC4W"}]},"_npmUser":{"name":"alesya_h","email":"ah1990au@gmail.com"},"directories":{},"maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jsmcp_1.7.0_1789552684295_0.5817790348973444"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-30T07:35:04.765Z","modified":"2026-09-16T09:58:04.555Z","1.0.0":"2026-03-30T07:35:04.990Z","1.0.1":"2026-03-30T07:45:34.532Z","1.1.0":"2026-03-30T10:16:51.302Z","1.2.0":"2026-04-13T04:11:47.488Z","1.2.2":"2026-04-15T01:30:15.018Z","1.3.0":"2026-04-30T14:55:57.450Z","1.3.1":"2026-05-09T00:05:41.111Z","1.3.2":"2026-05-09T08:20:00.089Z","1.4.0":"2026-05-10T04:31:20.519Z","1.5.0":"2026-05-10T13:09:11.117Z","1.6.0":"2026-05-13T10:33:07.789Z","1.6.1":"2026-05-23T11:04:15.170Z","1.7.0":"2026-09-16T09:58:04.418Z"},"bugs":{"url":"https://github.com/alesya-h/jsmcp/issues"},"author":{"name":"Alesya Huzik"},"license":"MIT","homepage":"https://github.com/alesya-h/jsmcp#readme","keywords":["mcp","model-context-protocol","javascript","cli","oauth"],"repository":{"type":"git","url":"git+https://github.com/alesya-h/jsmcp.git"},"description":"MCP server that allows agents to work with other MCP tools programmatically by writing JavaScript","maintainers":[{"name":"alesya_h","email":"ah1990au@gmail.com"}],"readme":"# jsmcp\n\n`jsmcp` exists for cases where an agent needs to do more than a single MCP tool call.\n\nMost MCP clients are great at one tool call at a time, but awkward when work requires:\n\n- several related tool calls\n- branching logic based on earlier results\n- loops, retries, or result aggregation\n- transforming tool output before the next call\n\n`jsmcp` solves that by exposing approved MCP tools as JavaScript namespaces. Instead of forcing the model to juggle many separate tool invocations, it can discover what is available and then write a small amount of JavaScript to use those tools programmatically.\n\nIn practice, this means:\n\n- the agent first learns what servers and tools are available, while `jsmcp` constrains access to whatever servers and tools you allow in a preset\n- the agent can then write JavaScript for multi-step work\n- logs stay separate from return values so the code stays easier to reason about\n\nConfig is read from `$XDG_CONFIG_HOME/jsmcp/` or, if `XDG_CONFIG_HOME` is not set, `~/.config/jsmcp/`. Exactly one of `config.json`, `config.yaml`, or `config.yml` must exist there.\n\n## Why\n\nUse `jsmcp` when you want agents to treat MCP tools more like a small programmable API surface than a sequence of isolated button presses.\n\nThis is especially useful when an agent needs to:\n\n- combine results from several MCP tools\n- script workflows across one or more MCP servers\n- make decisions in code instead of repeatedly re-planning between tool calls\n- keep tool access constrained to a reviewed preset\n\n## Install\n\n```bash\nnpm install -g @alesya_h/jsmcp\n```\n\nOr run it without installing globally:\n\n```bash\nnpx @alesya_h/jsmcp run\n```\n\n## Run\n\n```bash\njsmcp run\njsmcp run work\njsmcp server work --port 3000 --bind 0.0.0.0\njsmcp client --profile work --host 127.0.0.1 --port 3000\njsmcp client --profile work --port 3000 --session-id my-agent-session\njsmcp client --profile work --host remote.example.com --api-key \"$JSMCP_API_KEY\"\njsmcp status --profile work --host 127.0.0.1 --port 3000\njsmcp status kagi --tools --profile work --port 3000\njsmcp restart --host 127.0.0.1 --port 3000\njsmcp auth\njsmcp auth firefox_devtools\n```\n\nIf you are running from a source checkout instead of an installed package, replace `jsmcp` with `node src/index.js`, for example `node src/index.js run`.\n\n`run` starts the meta-MCP server directly over stdio.\n\n`server` starts a long-lived daemon on `ws://<bind>:<port>/mcp`, starts every globally enabled MCP server once, and keeps those underlying connections warm. The chosen preset becomes the default profile for connections that do not request one. It binds to `0.0.0.0` by default and accepts `--bind <host>` to choose another bind address.\n\n`client` exposes a stdio MCP server that proxies raw MCP/JSON-RPC messages to `server` over WebSocket. It accepts `--host <host>` and `--port <number>` to choose which daemon to connect to, can optionally pass `--profile <name>` to select that daemon-side profile, accepts `--session-id <id>` to reuse the same daemon-side log session across client reconnects, and accepts `--api-key <key>` to authenticate with a daemon whose API key differs from the local key file.\n\n`status` connects to the daemon over HTTP, retrying until it is reachable, and prints the configured servers in the selected profile with their startup status or startup errors. Pass a server name to show only that server, and pass `--tools` to include each healthy server's allowed tools and descriptions. It accepts `--host <host>`, `--port <number>`, and `--profile <name>`.\n\n`restart` asks a running daemon over HTTP to exit with a restart-request status. Run it under a supervisor such as the included systemd user service so the daemon is started again automatically. It accepts `--host <host>` and `--port <number>`.\n\n`run`, `server`, and `client` all accept an optional preset as either a positional argument or `--profile <name>`. The default daemon port is `41528`. If `client --session-id` is omitted, the client generates a random session id and reuses it for reconnects during that client process.\n\nOn first `server` start, `jsmcp` creates an API key at `$XDG_CONFIG_HOME/jsmcp/api-key.txt`, or `~/.config/jsmcp/api-key.txt` if `XDG_CONFIG_HOME` is not set. Daemon WebSocket and HTTP API requests must include it in the `X-JSMCP-API-Key` header; unauthenticated requests receive `401`. CLI commands that connect to the daemon read the key from `JSMCP_API_KEY` when it is set, otherwise from the local key file. `jsmcp client` also accepts `--api-key <key>`, which takes precedence over `JSMCP_API_KEY`.\n\nThe daemon also exposes the five meta tools through one JSON HTTP endpoint, plus a restart endpoint:\n\n```text\nPOST /api/call?tool=list_servers&profile=<name>\nPOST /api/call?tool=list_tools&profile=<name>\nPOST /api/call?tool=execute_code&sessionId=<id>&profile=<name>\nPOST /api/call?tool=fetch_logs&sessionId=<id>\nPOST /api/call?tool=clear_logs&sessionId=<id>\nPOST /api/restart\n```\n\nThe `/api/call` request body is a JSON object matching the selected MCP tool arguments. HTTP callers may include `sessionId` in the query string to use a stable daemon-side log session. They may include `profile` to select which profile filters the server and tool view for that request.\n\nUse `jsmcp auth` to manage OAuth for remote servers. With no arguments it lists remote servers that have OAuth enabled. With a server name it starts the OAuth flow for that server.\n\nIf no graphical environment is detected, or if you pass `--no-browser`, `jsmcp auth <server>` prints the authorization URL and waits for either the localhost callback or a pasted callback URL/code.\n\n## Pi Extension\n\nThe Pi extension lives in [`extensions/pi/`](extensions/pi/README.md). To load it directly from this checkout, run from the repository root:\n\n```bash\nmkdir -p ~/.pi/agent/extensions\nln -s \"$PWD/extensions/pi\" ~/.pi/agent/extensions/jsmcp\n```\n\nMove any existing standalone copy aside before creating the link. Start `jsmcp server` separately, then run `/reload` in Pi. The extension exposes the five meta tools with a `jsmcp_` prefix, including `jsmcp_execute_code` with `rawText`, timing, and session memory support. See its README for configuration and tests.\n\n## systemd User Service\n\nThis repo includes `systemd/jsmcp.service`, a user unit that starts `jsmcp server` from the globally installed CLI.\n\nInstall it with:\n\n```bash\nnpm install -g .\nmkdir -p ~/.config/systemd/user\nln -sfn \"$PWD/systemd/jsmcp.service\" ~/.config/systemd/user/jsmcp.service\nsystemctl --user daemon-reload\nsystemctl --user enable --now jsmcp.service\n```\n\nUseful commands:\n\n```bash\nsystemctl --user status jsmcp.service\njournalctl --user -u jsmcp.service -f\nsystemctl --user restart jsmcp.service\n```\n\nThe checked-in unit starts the default preset on the default daemon port and resolves `jsmcp` through the user's actual login shell from `getent passwd`.\n\n## Config\n\nThe config file may be JSON or YAML and uses these top-level keys:\n\n- `servers`: server definitions\n- `jsmcp`: optional jsmcp-specific settings\n- `presets`: optional overrides for which servers and tools are exposed to the agent\n\nServer names must be valid JavaScript identifiers because `execute_code()` exposes them directly as globals.\n\n`jsmcp` accepts both OpenCode MCP config style and the overlapping Claude Code MCP style for the common fields:\n\n- local servers: `type: \"local\"` or `type: \"stdio\"`\n- remote servers: `type: \"remote\"`, `type: \"http\"`, or `type: \"sse\"`\n- commands: either `command: [\"cmd\", \"arg1\"]` or `command: \"cmd\"` with `args: [\"arg1\"]`\n- environment variables: either `environment` or `env`\n\nSupported `servers.<name>` fields:\n\n- `type`: required; one of `local`, `stdio`, `remote`, `http`, `sse`\n- `description`: optional string shown in `list_servers()`\n- `enabled`: optional boolean; defaults to `true`\n- `timeout`: optional number in milliseconds used for initial tool discovery\n- `strip_tool_prefix`: optional string, `true`, or `false`; strings are removed from exposed tool names, `true` infers a shared prefix, and `false` disables prefix stripping for that server\n- `normalize_tool_names`: optional boolean; converts exposed tool names to `snake_case` after prefix stripping\n- `blocked_tools`: optional server-level deny list; a tool name string or array of exact tool names, `{ glob: \"...\" }`, and `{ regex: \"...\" }` selectors. Selectors match final exposed tool names after prefix stripping and normalization, and blocked tools cannot be re-enabled by presets.\n\nSupported `jsmcp` fields:\n\n- `auto_strip_tool_prefixes`: optional boolean; default `false`; if `true`, servers infer and strip shared tool-name prefixes unless overridden by `servers.<name>.strip_tool_prefix`\n- `normalize_tool_names`: optional boolean; default `false`; if `true`, servers expose tool names as `snake_case` unless overridden by `servers.<name>.normalize_tool_names`\n\nFor local / stdio servers:\n\n- `command`: required; non-empty string or non-empty array\n- `args`: optional array; appended to `command` when `command` is a string, and also accepted when `command` is an array\n- `env`: optional object of environment variables\n- `environment`: optional object of environment variables; merged with `env`, and wins on duplicate keys\n- `cwd`: optional working directory\n\nFor remote / HTTP / SSE servers:\n\n- `url`: required string\n- `headers`: optional object of request headers\n- `oauth`: optional OAuth config\n\nSupported `oauth` forms:\n\n- omitted, `null`, or `true`: enable OAuth with default behavior\n- `false`: disable OAuth for that server\n- object with any of:\n  - `clientId`\n  - `clientSecret`\n  - `scope`\n\nSupported value substitutions in string fields:\n\n- `{env:NAME}`: expand from the current environment\n- `${NAME}`: Claude Code-style environment expansion\n- `${NAME:-default}`: Claude Code-style expansion with fallback\n- `{file:path}`: replace with file contents\n\nFor `{file:path}`:\n\n- relative paths are resolved relative to the config file directory\n- `~/...` resolves from the user home directory\n- absolute paths are used as-is\n\nIf `presets` is omitted, the default preset includes every server with `enabled !== false` and allows all of that server's tools.\n\nIf `presets` is present, it is an object of preset names. Each preset is an object of per-server overrides layered on top of the server definitions:\n\n- `presets.default`: optional overrides for the default preset\n- any other preset name, such as `presets.work`: additional named preset overrides\n\nIf a server strips prefixes or normalizes names, preset tool selectors match the final exposed tool names that agents see.\n\nServer-level `blocked_tools` selectors are applied before preset allowlists. Use them for globally unsafe tools, and use presets for profile-specific whitelists.\n\nWithin a preset, server rules work like this:\n\n- omitted server rule: use the server definition as-is\n- `true`: include that server and allow all its tools\n- `false`: exclude that server from that preset\n- `\"tool_name\"`: include only that exact tool\n- array entries may be:\n  - exact tool name strings\n  - `{ \"regex\": \"...\" }` selectors\n  - `{ \"glob\": \"...\" }` selectors\n\nIf a server has `enabled: false` in `servers`, it is globally disabled and is not started or exposed by any preset.\n\nExample:\n\n```json\n{\n  \"servers\": {\n    \"math\": {\n      \"type\": \"stdio\",\n      \"description\": \"Basic arithmetic tools\",\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/math-server.js\"],\n      \"env\": {\n        \"LOG_LEVEL\": \"debug\"\n      },\n      \"cwd\": \"${PWD}\"\n    },\n    \"docs\": {\n      \"type\": \"http\",\n      \"description\": \"Documentation search and retrieval\",\n      \"url\": \"https://example.com/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ${DOCS_TOKEN}\"\n      },\n      \"oauth\": {\n        \"scope\": \"docs.read\"\n      }\n    }\n  },\n  \"presets\": {\n    \"default\": {\n      \"math\": [\"add\", { \"glob\": \"mul_*\" }],\n      \"docs\": [{ \"regex\": \"(search|fetch)\" }]\n    },\n    \"work\": {\n      \"docs\": true\n    }\n  }\n}\n```\n\nCompatibility notes:\n\n- Claude Code-style `env`, `type: \"stdio\"`, `type: \"http\"`, `type: \"sse\"`, and `command` plus `args` are supported\n- OpenCode-style `type: \"local\"`, `type: \"remote\"`, command arrays, and `environment` are also supported\n- Claude Code-specific features such as `headersHelper` and advanced OAuth fields like `callbackPort` or `authServerMetadataUrl` are not supported yet\n\nOAuth tokens and registration state are stored in `$XDG_DATA_HOME/jsmcp/oauth.json` or `~/.local/share/jsmcp/oauth.json`.\n\n## Exposed Tools\n\n- `list_servers`\n- `list_tools`\n- `execute_code`\n- `fetch_logs`\n- `clear_logs`\n\n## Behavior\n\n- every server with `enabled !== false` is started once when `jsmcp` starts\n- `list_servers()` is the required first step so the agent can learn what capabilities are available\n- you must call `list_tools(server)` before using a server in `execute_code()` so you know the exact tool names, aliases, and schemas\n- `list_servers()` and `list_tools(server)` return only the servers and tools allowed in the connection's selected profile\n- `execute_code({ code, data?, timeoutMs?, rawText? })` does not manage server lifecycle; it can only use servers that are already started\n- prefer `execute_code({ code, ... })` whenever the work would require more than a single tool call\n- `execute_code()` exposes session-scoped in-memory JSON storage at `jsmcp.memory`\n- `console.log`, `console.info`, `console.warn`, and `console.error` inside `execute_code()` are stored for `fetch_logs()`\n- `fetch_logs()` drains the log buffer on read\n\n## `execute_code`\n\n`execute_code` runs JavaScript as the body of an async function.\n\nStarted servers are injected as globals. Each allowed MCP tool becomes a function on that server object. Prefer underscore aliases when available.\n\nIf you pass `data`, it is exposed to the script as the global variable `data`. This is useful for strings or structured values that would otherwise need escaping inside the code string.\n\nYou should call `list_tools(server)` before using a server in `execute_code()`. For multi-step work, prefer writing JavaScript instead of trying to mentally chain several tool calls.\n\nExample:\n\n```js\nreturn await math.add({ a: 2, b: 5 });\n```\n\nWith data:\n\n```js\nreturn data.message;\n```\n\nWith in-memory session storage:\n\n```js\nawait jsmcp.memory.set(\"search_results\", await search.query({ q: \"example\" }));\nreturn await jsmcp.memory.keys();\n```\n\nA later `execute_code()` call in the same profile and session can read it:\n\n```js\nconst results = await jsmcp.memory.get(\"search_results\", []);\nreturn results.slice(0, 3);\n```\n\nAvailable methods are `get(key, defaultValue?)`, `set(key, value)`, `has(key)`, `delete(key)`, `keys()`, `entries()`, `clear()`, and `update(key, updater)`. Stored values are converted with the same JSON-safe conversion used for `execute_code()` results. Memory is in-process only and is cleared when `jsmcp` exits.\n\n### Results and execution time\n\nSuccessful `execute_code` responses always put the JSON-safe return value in `structuredContent.value`, including objects, arrays, strings, and primitives. Returning nothing produces `value: null`. For example, `return await math.add({ a: 2, b: 5 });` produces:\n\n```json\n{\n  \"value\": { \"sum\": 7 },\n  \"executionMs\": 12\n}\n```\n\n`executionMs` is elapsed wall-clock time in rounded milliseconds, measured around runtime execution (including awaited tool calls and result conversion, but not response formatting or transport). Execution errors use `{ \"error\": \"message\", \"executionMs\": 12 }` with `isError: true`, including syntax errors and timeouts.\n\n**Compatibility:** object results used to appear directly in `structuredContent`. Callers must now read `structuredContent.value` instead. Other meta tools' response shapes are unchanged.\n\nThe optional boolean `rawText` defaults to `true`. When the returned value is a string, `content[0].text` contains that string verbatim, without JSON quoting or escaped newlines. A separate text block reports `Execution time: <n>ms`. The structured envelope is still provided for programmatic callers.\n\nFor example, call:\n\n```json\n{\n  \"code\": \"return data.message;\",\n  \"data\": { \"message\": \"Hello\\nworld\" }\n}\n```\n\nThe first text block is:\n\n```text\nHello\nworld\n```\n\nPass `rawText: false` to render the entire `{ value, executionMs }` envelope as JSON text instead. Non-string results always use JSON text. Errors retain plain error text with a separate timing block. These options behave identically over stdio, WebSocket, and HTTP. Clients that display `structuredContent` rather than `content` may still show JSON.\n\n### Connected MCP tool results\n\nCalls inside your JavaScript are automatically unwrapped; agents do **not** need to access `.structuredContent` themselves:\n\n- If an upstream tool returns `structuredContent`, the call resolves to that object.\n- Otherwise, text-only content resolves to a string (multiple text blocks are joined with newlines). JSON-looking text is not automatically parsed.\n- Otherwise, mixed/non-text content resolves to `{ text, content, meta }`, preserving the content blocks.\n- Upstream `isError` results throw an error.\n\n```js\nconst result = await math.add({ a: 2, b: 5 });\nreturn result.sum; // 7, not result.structuredContent.sum\n```\n\nOnly the outer `execute_code` response adds `{ value, executionMs }`; upstream objects are not otherwise flattened. To display a string field directly, return that field rather than its containing object.\n\nIf a tool name is not a valid JavaScript identifier, prefer its underscore alias:\n\n```js\nreturn await math.tool_name({ value: 1 });\n```\n\nThe original tool name still works with bracket access:\n\n```js\nreturn await math[\"tool-name\"]({ value: 1 });\n```\n","readmeFilename":"README.md"}