{"_id":"@shipeasy/mcp","_rev":"18-5dab8ea4470b18b9788fe502b708e6c6","name":"@shipeasy/mcp","dist-tags":{"latest":"2.8.0"},"versions":{"1.0.0":{"name":"@shipeasy/mcp","version":"1.0.0","license":"MIT","_id":"@shipeasy/mcp@1.0.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"f455d9d091df1108485c677279e1929d9ba96aec","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.0.0.tgz","fileCount":57,"integrity":"sha512-slD6VuDJURYQhGqoNTiOwtxMfB2UlfEQmU0XvvHMaCVcXjzTNzl55U4XKk8KkOORKA41ArqcNMxUvcbrdUckHw==","signatures":[{"sig":"MEUCIQCg0izNpiRCLhPN77YDc5bp8FSyL3t3XHy8J+f7oI3LkQIgKrYBc/ONdKqci2P3Mu8tCXxVqLr96wEtxV9zQ39nmf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222268},"type":"module","_from":"file:shipeasy-mcp-1.0.0.tgz","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"}},"scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit"},"_npmUser":{"name":"vadimsh931","email":"vshaveyko@gmail.com"},"_resolved":"/private/var/folders/kp/rbfdd_fj2qlbbwbbdblxp8m00000gn/T/f886059f90753dc65d1ece1398c77373/shipeasy-mcp-1.0.0.tgz","_integrity":"sha512-slD6VuDJURYQhGqoNTiOwtxMfB2UlfEQmU0XvvHMaCVcXjzTNzl55U4XKk8KkOORKA41ArqcNMxUvcbrdUckHw==","repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.4.1","description":"Model Context Protocol server for the Shipeasy platform (experimentation + i18n)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.0_1778616202985_0.4282952442095618","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@shipeasy/mcp","version":"1.0.1","license":"MIT","_id":"@shipeasy/mcp@1.0.1","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"ae7d223d0f5f868c117315e87926bb9befdab8b3","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.0.1.tgz","fileCount":59,"integrity":"sha512-er3RH1Kp6wwg+sbryMZEoRv1bOXDWmanOKsHuqY6cWSCqAcgJYnmAhhSW8LJZqnhoOAJAZIlNfUHXnaq0QrzIA==","signatures":[{"sig":"MEQCIHIaotBQSSLOOpjYMUPxkIXRw6QKrNu2KJkuz6DKl5X0AiAwGJKJZ03SdKWQIT4aRqSOA/4Rcm54MXJKLGzPaqlktg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":224797},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"7d327af089235973992223e98fc4c03b2371f0bb","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Model Context Protocol server for the Shipeasy platform (experimentation + i18n)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.0.1_1780774446981_0.2446450346477329","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@shipeasy/mcp","version":"1.1.0","license":"MIT","_id":"@shipeasy/mcp@1.1.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"72762c24e1820060745fc6904fc09cd6deba701b","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.1.0.tgz","fileCount":59,"integrity":"sha512-LZkHMma6OR9OJTMHFU9toRG/xhi7mK1NoZWnhNg0ha1e8TBvc57evlbfWSvLp0oLGfmtfi2sut2jZo7xdb/jMQ==","signatures":[{"sig":"MEUCIQC6P7H7gLUv9Jj6vw0tMMBBSzEDiOuTYJ6sNVAvb6tW9wIgfmVu/x/HiE1lwEK2Nfk5MY/tjC8nIy5M7VUieQ0R+7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":235562},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"461956a9f19faf21674d01da0b00c776b897dbae","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Model Context Protocol server for the Shipeasy platform (experimentation + i18n)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.1.0_1780974630520_0.6869470703087399","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@shipeasy/mcp","version":"1.2.0","license":"MIT","_id":"@shipeasy/mcp@1.2.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"df2d38edb264b4c6a7df42ac51e178640a7a803f","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.2.0.tgz","fileCount":61,"integrity":"sha512-ONDdfHwCLLzVJWzTtOwG+gtqtZqmUhWoGDrrys+Ep9cxrzOGJkpCIMQSSoi3NoIpt41xbR5iEPWTwjL57JkXVw==","signatures":[{"sig":"MEUCIQCyFIh1zKWlaAc8ijbtrxbTPH6YQGBsn1Ec8OoX+4G2GQIgGwW1kjuGepNTY5z+TlBg5PRZDEOCIUusOT0cZI0tUlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":240030},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"078ce56767e843110e4f0c0e1b9a2db4e8cfd9b5","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Model Context Protocol server for the Shipeasy platform (experimentation + i18n)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.2.0_1781399778276_0.5276149780955266","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@shipeasy/mcp","version":"1.3.0","license":"MIT","_id":"@shipeasy/mcp@1.3.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"e29955414fc42b84c6e9afe49bb3db2899fc5b1d","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.3.0.tgz","fileCount":61,"integrity":"sha512-E5VAYbEcDCQr9rzbCNziVyRJi7HSweY//9KIInXpNcj6c91Kv4FuED4ILlP5plrOlQykjJwcNNZmN47TAmr//Q==","signatures":[{"sig":"MEUCIAZZ91PmBPLTopub1/ZsDxksz2uw3KQufYWx9lQ8gxklAiEA2hHjK4kXxe4cNYARxTi/3QsRCdF4HRFQ7bXo7+/6q1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":250180},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"32718390037c0d7af0ef9a1dfcf5bddd345206f1","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Model Context Protocol server for the Shipeasy platform (experimentation + i18n)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.3.0_1781456895649_0.750086881616228","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@shipeasy/mcp","version":"1.3.1","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@1.3.1","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"9103923f409b8b8753bca07f3659c386d04f0894","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.3.1.tgz","fileCount":61,"integrity":"sha512-vfS5qJX9o9xB79KE1LjbArZHss9CUGHDOfvo2IqcEfPEy5xCUugX9oM4jEhHOB7tPfupfEke0HtL+X/PydpmtQ==","signatures":[{"sig":"MEYCIQCcf47gbpkEL6jY5rmHz9yVXG3D6FjmRBCUiK4vIHgC7wIhAOnXjjPE9BAXdwQRJL+DOxCbjbKcHu5visGnnAZWyhMX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":252887},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"788daaa40014f5b7a99ba2d20ff6c381e85be4f9","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.3.1_1781461171866_0.8141231633351407","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@shipeasy/mcp","version":"1.3.2","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@1.3.2","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"84cfb0c86ab01501761f244cfe6958d14185f40b","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.3.2.tgz","fileCount":61,"integrity":"sha512-+XydNWyHbf+G8n2IOeOcaos7ZHt/3GlzK/8H3XT1Dle4kZipr6NM5/N9/JOrkP2toj/dp+ASjGMQD4dHi4iXdA==","signatures":[{"sig":"MEUCIQCbrEpB4KrQMZBixh2v7pOPr9nWgen9rJsWbC83+9FTcwIgeQ8SDjL/7TkGrflfYwSjxNWvBl5h+diEN3tLjfM8PmQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":253571},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"4992dcfe7be91b03fb94484d539156ac201cc32a","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.3.2_1781462283795_0.42171573462979706","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@shipeasy/mcp","version":"1.4.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@1.4.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"9885c8bb278df6439fa010c98495802caf8ce025","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.4.0.tgz","fileCount":61,"integrity":"sha512-vd0CXSTBI/6ICe6z1KP/MwmQTAUN1u7HkzYyNza/ryTZU91jcPDTtTMfAtwJWGbwoTO58yT/WIUg/bTwp1hk7g==","signatures":[{"sig":"MEUCID8l5ILvd40MyA3EunSFQYdKbJhAkYnSK6rvjCyXawlCAiEA1ZVdjlBFaWqoTLY/t8JUQUwF/C0Ptr0N293PKjInB0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260434},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"eb7e20b454c0bd640584dbadf674b121ac94b1bb","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.4.0_1781978108863_0.14388322866681436","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@shipeasy/mcp","version":"1.5.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@1.5.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"a5484b5852dd48ec63904dd00cf1255a24f44523","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.5.0.tgz","fileCount":61,"integrity":"sha512-XvdF8QKKtiWMisuDmjgJ3Z4oh/WqX1kpcxLM/NRQfbBm9qyR1QU5stZcHiRWIasOMo/msZV39EGGGYVTv6ARug==","signatures":[{"sig":"MEYCIQCzqdhxWV3xflZylrwVgCf5AvaoZaWAb9BlwsFvv9nm/gIhAJefNI0hp1Ju4LecqrCjXPl4p42esJnFrDf5EXKFUwko","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263917},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"e479077661b6f6318063bc1f3b6f9ac741d3e437","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.5.0_1782267039191_0.32893949440295267","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@shipeasy/mcp","version":"1.6.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@1.6.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"372d544fe200cf2a853c961204af1e055f1e79f9","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-1.6.0.tgz","fileCount":63,"integrity":"sha512-i6ErL7+2UxaptathzPAu/laDOTB8DU39+e5dcjKJjULBtt7yoaDhz+rQefkIgHdzv/f1CR/2e4YJScP/1Rezug==","signatures":[{"sig":"MEUCIQD+b/UG8quAHOzQ9RzDgivSW3Koj/g2RY811jNAci0FkgIgUtAYbFYXeKd8LH3/vr1MPJFlRfwn/mH0Mt43DdLITHQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":270965},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"f7b5647adf5a16e82a65bbceec777a4c4656a264","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_1.6.0_1782357124720_0.009452088878726173","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@shipeasy/mcp","version":"2.0.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.0.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/mcp#readme","bugs":{"url":"https://github.com/shipeasy-ai/mcp/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"b40c4e9bfb50cf5163e16770678664b265b0f267","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.0.0.tgz","fileCount":53,"integrity":"sha512-EAH4Mv57oSOIROjJsq+VIuWg7bO1HvSNHfrdpJLwzl3nDwCaCP+xqbQZojX6nsXK+ViIH16SJ77V6YvJH2wnhQ==","signatures":[{"sig":"MEYCIQDZitmWf7sBeysTnNeO0HbdNCAOohZ4LR2eXeNILP5w6wIhAMQgGnouznLjROWCaCeolqjZWMNJwAdZHtAx08+anpmQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186810},"type":"module","engines":{"node":">=20"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"c49ea6c7293846d9833788ea5bee5294011bb565","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d53cbde6-edd4-4e0c-b0c2-4a9271caae7f"}},"repository":{"url":"git+https://github.com/shipeasy-ai/mcp.git","type":"git"},"_npmVersion":"11.17.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^1.6.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.0.0_1782584102961_0.7719514424185008","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@shipeasy/mcp","version":"2.2.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.2.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"6258faafdefbbb08d95aa92a070158191e66097f","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.2.0.tgz","fileCount":43,"integrity":"sha512-hff/nI22mf5pQrKFCY4Is9Lt12bWCCJpgnu3dupAZPqBLah/1lt0YZKXRioJrHVKFTBTatxfKJakTtY97Ndb8g==","signatures":[{"sig":"MEQCID6zMtzMZoU6duU2f9y1lTtpiOWDZbcFQ0UaQCSmyd54AiAszBPWgA4/VqDepvfeEobj96omqXjo9HkPIPbKe6Rxxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":264354},"type":"module","engines":{"node":">=20"},"exports":{"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"},"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"68d5d64045ad01ef7e8f33851275ed9496d95e8f","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","prebuild":"pnpm gen:tools","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"repository":{"url":"git+https://github.com/shipeasy-ai/shipeasy.git","type":"git","directory":"mcp"},"_npmVersion":"11.18.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^2.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","yaml":"^2.5.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.2.0_1783124659731_0.7383332347358667","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@shipeasy/mcp","version":"2.3.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.3.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"37ec360e4c8325acadff5f50642ab19043edfea0","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.3.0.tgz","fileCount":49,"integrity":"sha512-ymkH01FFG5ywJ1Tb6DF7QscX3bKzsodZ7cCgvS0n8Hc+jGdry2ziPFEs8rmRAhvy0/ns5N4K/Py+/Ti40m02Mg==","signatures":[{"sig":"MEUCIExs9+JW0InqTjUW1q3b8DnipYMComPMNnlUyIocpv3nAiEA8Oxj4SAvsdirYZ/TzLRdssp8bsuUSd4RxbtzkZhec6I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":310564},"type":"module","engines":{"node":">=20"},"exports":{"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"},"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"8d513fc94c249177b93b0efac42ddd2f14e86f97","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","prebuild":"pnpm gen:tools","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"repository":{"url":"git+https://github.com/shipeasy-ai/shipeasy.git","type":"git","directory":"mcp"},"_npmVersion":"11.18.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^2.1.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","yaml":"^2.5.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.3.0_1783266391507_0.8614283496626238","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@shipeasy/mcp","version":"2.4.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.4.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"8c52db3c8ecf8952c1364521fca391874052925d","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.4.0.tgz","fileCount":55,"integrity":"sha512-R6cmNvyNQnRgEYIE28FIm3VCWzdsY50tvK8haZCNE/pZ4dvy0L//ToF7kgl9iM8zTljSc9N1HXfpMdHCIvTfCA==","signatures":[{"sig":"MEQCIEgrWGb/Upn1dO//IEC3q3V0UoOQlVl+93pZaP2UbZU4AiBcSmoU7gtsIwg5B5lySnZcqfVUyWMHEbDEhaBnXcx2FA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":345977},"type":"module","engines":{"node":">=20"},"exports":{"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"},"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"726c1bda1eb073cbfd892c9e1bafb73f3e60afe9","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","prebuild":"pnpm gen:tools","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"repository":{"url":"git+https://github.com/shipeasy-ai/shipeasy.git","type":"git","directory":"mcp"},"_npmVersion":"12.0.1","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^2.3.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","yaml":"^2.5.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.4.0_1783801031666_0.5051644552763577","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@shipeasy/mcp","version":"2.5.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.5.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"d2c59509bdc40a3539d0f76c127fc8686dcdea26","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.5.0.tgz","fileCount":57,"integrity":"sha512-ORR5rJKmWeGqt0kHqdEWQ1iQd53NZDsLVjg3PQ9fVvdfdn4f6b7FvuosLnqQPk1TTYQIP1DpL4R4V4fsvS9cpw==","signatures":[{"sig":"MEYCIQDRfiLpwqe8zPLOY4tCbLq5aOXhBtvlL2FAndmzstMQrAIhAN3gxXQ7QsiaH5o3UwkGrfcMJoMACGCuWyjidYB7G9G4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":390587},"type":"module","engines":{"node":">=20"},"exports":{"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"},"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"d16cc9967de152b703160752ed00168dacf7ddfd","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","prebuild":"pnpm gen:tools","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"repository":{"url":"git+https://github.com/shipeasy-ai/shipeasy.git","type":"git","directory":"mcp"},"_npmVersion":"12.0.1","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^3.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","yaml":"^2.5.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.5.0_1785027215377_0.9495656962807453","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"@shipeasy/mcp","version":"2.6.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.6.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"34d508ff7c7d54c015b62b84999654fabe3f7f11","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.6.0.tgz","fileCount":57,"integrity":"sha512-+4Z3Tjb5nh9iVnZt847COVPsPpLhWiGAu3uRPEGkyv0XXPGOlw0MQBHjRdEo0H6+3D3612LCbakELnajqIl8xQ==","signatures":[{"sig":"MEUCIH7UUv7GpjeKc5yO4kZqjhJtkeqTLSlhjbBxBiVA7gtjAiEAyNkD4UwfnXIxOLSGt5YvrkCa1HyS2kBgEgv3GgeaiSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":397775},"type":"module","engines":{"node":">=20"},"exports":{"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"},"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"9e48535edf32de451bb0c4cbf4195a8c387c3dcd","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","prebuild":"pnpm gen:tools","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"repository":{"url":"git+https://github.com/shipeasy-ai/shipeasy.git","type":"git","directory":"mcp"},"_npmVersion":"12.0.1","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^3.0.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","yaml":"^2.5.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.6.0_1785098204302_0.009577778230801748","host":"s3://npm-registry-packages-npm-production"}},"2.7.0":{"name":"@shipeasy/mcp","version":"2.7.0","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"license":"MIT","_id":"@shipeasy/mcp@2.7.0","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"dist":{"shasum":"a35c138140827ab59de4abf5111196c5b28e9cb1","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.7.0.tgz","fileCount":57,"integrity":"sha512-+gWnQej4BQ/p74mZqNacoi+LF1AXTZpazsMH9IoSuoU9rJ7XvIKe6Y8SwZgDnP2swVP6NEi4ZN7iE1zNsrQdeQ==","signatures":[{"sig":"MEUCIQC3UfDLKoANYegyIN9IjGDUd042j0S6Pp0tzOOW7VNNvwIgQnQ9Hn9LAT8q3q385lI27/f1OjE+Ya/Ct60V1rISFEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":397353},"type":"module","engines":{"node":">=20"},"exports":{"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"},"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"}},"gitHead":"1105b325a8ae48259e4cc4bb804b3056a1b9dd10","mcpName":"ai.shipeasy/mcp","scripts":{"dev":"tsx src/index.ts","docs":"tsx scripts/gen-mcp-docs.ts","test":"vitest run","build":"tsc -p tsconfig.json","start":"node bin/mcp.js","prebuild":"pnpm gen:tools","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","registry:gen":"tsx scripts/gen-server-json.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"repository":{"url":"git+https://github.com/shipeasy-ai/shipeasy.git","type":"git","directory":"mcp"},"_npmVersion":"12.0.1","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.0.0","typescript":"^5.7.4","@shipeasy/openapi":"^3.1.0","package-manager-detector":"^1.6.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","yaml":"^2.5.0","vitest":"^2.1.9","@types/node":"^20.19.39"},"_npmOperationalInternal":{"tmp":"tmp/mcp_2.7.0_1785167275415_0.5008887426782924","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"@shipeasy/mcp","version":"2.8.0","description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","mcpName":"ai.shipeasy/mcp","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"type":"module","license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/shipeasy-ai/shipeasy.git","directory":"mcp"},"bin":{"shipeasy-mcp":"bin/mcp.js"},"exports":{"./i18n/scan":{"types":"./dist/tools/i18n/scan.d.ts","default":"./dist/tools/i18n/scan.js"},"./tools-manifest":{"types":"./dist/tools/manifest.d.ts","default":"./dist/tools/manifest.js"},"./registry":{"types":"./dist/tools/registry.d.ts","default":"./dist/tools/registry.js"}},"scripts":{"prebuild":"pnpm gen:tools","build":"tsc -p tsconfig.json","dev":"tsx src/index.ts","gen:tools":"node scripts/gen-tools.mjs","type-check":"tsc --noEmit","docs":"tsx scripts/gen-mcp-docs.ts","registry:gen":"tsx scripts/gen-server-json.ts","test":"vitest run","start":"node bin/mcp.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","@shipeasy/openapi":"^3.1.0","package-manager-detector":"^1.6.0","typescript":"^5.7.4","zod":"^4.0.0"},"devDependencies":{"@types/node":"^20.19.39","tsx":"^4.19.0","vitest":"^2.1.9","yaml":"^2.5.0"},"engines":{"node":">=20"},"gitHead":"e198fa73f4e9f6aa746cb84837b69404c47a5b83","_id":"@shipeasy/mcp@2.8.0","bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"homepage":"https://github.com/shipeasy-ai/shipeasy#readme","_nodeVersion":"22.23.1","_npmVersion":"12.0.1","dist":{"integrity":"sha512-D6lakUWV27lZr3p+tBhbzaPQTKxWyMR7jflmU1aJjNKt1zQboOP2LYedgFw2FTBK+aXubLhOCSliCsH5fqwiFw==","shasum":"9837c63b0fd1cb6ac9df949cdee35db210a64d32","tarball":"https://registry.npmjs.org/@shipeasy/mcp/-/mcp-2.8.0.tgz","fileCount":57,"unpackedSize":399366,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@shipeasy%2fmcp@2.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDIoi06sBzP8SccP4XsNFnTPo7lUH/4Djvwr927e9T9BAIhAIKrfEpd3NKItXIslitrerz4sc+8l2S6vfASS7hU5JyF"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb0cd673-515d-4ce9-a2c2-e3425541c931"}},"directories":{},"maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_2.8.0_1785183854800_0.3607095242057976"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-12T20:03:22.874Z","modified":"2026-07-27T20:24:15.250Z","1.0.0":"2026-05-12T20:03:23.139Z","1.0.1":"2026-06-06T19:34:07.148Z","1.1.0":"2026-06-09T03:10:30.674Z","1.2.0":"2026-06-14T01:16:18.406Z","1.3.0":"2026-06-14T17:08:15.831Z","1.3.1":"2026-06-14T18:19:32.045Z","1.3.2":"2026-06-14T18:38:03.946Z","1.4.0":"2026-06-20T17:55:08.984Z","1.5.0":"2026-06-24T02:10:39.352Z","1.6.0":"2026-06-25T03:12:04.861Z","2.0.0":"2026-06-27T18:15:03.104Z","2.2.0":"2026-07-04T00:24:19.860Z","2.3.0":"2026-07-05T15:46:31.643Z","2.4.0":"2026-07-11T20:17:11.811Z","2.5.0":"2026-07-26T00:53:35.552Z","2.6.0":"2026-07-26T20:36:44.451Z","2.7.0":"2026-07-27T15:47:55.652Z","2.8.0":"2026-07-27T20:24:14.937Z"},"bugs":{"url":"https://github.com/shipeasy-ai/shipeasy/issues"},"license":"MIT","homepage":"https://github.com/shipeasy-ai/shipeasy#readme","keywords":["mcp","model-context-protocol","mcp-server","feature-flags","feature-gates","feature-management","feature-toggles","ab-testing","split-testing","experimentation","experiments","kill-switch","dynamic-config","remote-config","progressive-delivery","feature-rollout","canary-release","i18n","internationalization","localization","translations","shipeasy","claude","claude-code","cursor","windsurf","ai-agent","llm-tools"],"repository":{"type":"git","url":"git+https://github.com/shipeasy-ai/shipeasy.git","directory":"mcp"},"description":"Feature flags, A/B experiments, kill switches, dynamic config & i18n — Shipeasy MCP server.","maintainers":[{"name":"vadimsh931","email":"vshaveyko@gmail.com"}],"readme":"# `@shipeasy/mcp` — unified Model Context Protocol server\n\n> Replaces [packages/mcp-server/](../mcp-server/). One MCP server, one npm package, covers **both** subsystems:\n>\n> 1. **Experimentation** — gates, configs, experiments, metrics, events (from [experiment-platform/10-mcp-server.md](../../experiment-platform/10-mcp-server.md)).\n> 2. **String manager / i18n** — label profiles, keys, drafts, translations, publish, codemods (from [string-manager-platform/plan.md](../../string-manager-platform/plan.md) § MCP server).\n>\n> AI assistants (Claude Code, Cursor, Copilot, Windsurf, Claude Desktop, Continue) talk to one server and get the full platform.\n\n📖 **Docs:** [docs.shipeasy.ai/get-started/mcp](https://docs.shipeasy.ai/get-started/mcp) — setup guide · [full tool reference](https://docs.shipeasy.ai/get-started/mcp-reference) (auto-generated from the tool catalog).\n\n---\n\n## Status / migration\n\n- **New location:** `packages/mcp/` (this doc).\n- **Old location:** `packages/mcp-server/` — will be deleted once this ships. The npm package rename (`@shipeasy/mcp-server` → `@shipeasy/mcp`) is a **breaking change**; the old name publishes one final version that re-exports the new package as a deprecation shim.\n- **Binary rename:** `shipeasy-mcp` (unchanged — the old binary name is preserved so existing `.claude/settings.json` entries keep working).\n\n---\n\n## Install / run\n\nTwo steps: **(1)** register the server with your AI assistant, **(2)** authenticate once with `shipeasy-mcp install`. Step 2 is required before any mutating tool will work — it runs a browser-based PKCE device flow against `/auth/device/*` and writes the token to `~/.config/shipeasy/config.json` (shared with `@shipeasy/cli`).\n\n### Step 1 — register\n\n**npx (recommended for AI assistant configs)**\n\n```json\n// ~/.claude/settings.json  |  .cursor/mcp.json  |  .windsurf/mcp.json  |  .mcp.json (project-local)\n{\n  \"mcpServers\": {\n    \"shipeasy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@shipeasy/mcp@latest\"]\n    }\n  }\n}\n```\n\n**Global install**\n\n```bash\nnpm i -g @shipeasy/mcp\n# or\npnpm add -g @shipeasy/mcp\n```\n\n```json\n{ \"mcpServers\": { \"shipeasy\": { \"command\": \"shipeasy-mcp\" } } }\n```\n\n**Through the CLI** (if `@shipeasy/cli` is already installed)\n\n```bash\nshipeasy mcp install     # auto-writes ~/.claude/settings.json + .cursor/mcp.json\nshipeasy mcp start       # run stdio server (same binary, different entry)\n```\n\n#### Configuration (`env`)\n\nThe server is configured through environment variables, so every setting flows\nstraight from your `mcp.json` / `settings.json` `env` block:\n\n```json\n{\n  \"mcpServers\": {\n    \"shipeasy\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@shipeasy/mcp@latest\"],\n      \"env\": {\n        \"SHIPEASY_MCP_LIST_GUARD\": \"on\",\n        \"SHIPEASY_MCP_LIST_GUARD_WINDOW_MINUTES\": \"10\"\n      }\n    }\n  }\n}\n```\n\n| Variable                                 | Default | Effect                                                                                                                                                                                                                                                                             |\n| ---------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `XDG_CONFIG_HOME`                        | —       | Overrides the token/config file location.                                                                                                                                                                                                                                          |\n| `SHIPEASY_MCP_LIST_GUARD`                | `on`    | **List-before-create guard.** When on, every `*_create` that has a `*_list` sibling refuses to run unless it carries a fresh `listToken` that the sibling `*_list` just returned — a forcing-function so the assistant checks for an existing resource before creating a duplicate. Set `off` to disable. |\n| `SHIPEASY_MCP_LIST_GUARD_WINDOW_MINUTES` | `10`    | How long a minted `listToken` stays valid (effective validity is 1×–2× this, since the previous window is also accepted). A token also dies with the server process, so it can never be replayed across sessions.                                                                    |\n\n### Step 2 — authenticate\n\nRun this once per machine:\n\n```bash\nshipeasy-mcp install\n```\n\nWhat happens:\n\n1. The CLI generates a PKCE verifier + challenge.\n2. It calls `POST {api_base}/auth/device/start` to open a session; the worker returns a `state`.\n3. Your default browser opens at `{app_base}/cli-auth?state=…&code_challenge=…&source=mcp`. Sign in with your existing Shipeasy account (GitHub, Google, or magic link — same as the dashboard).\n4. The UI page calls `POST {api_base}/auth/device/complete` with `project_id` + PKCE verifier.\n5. The CLI polls `GET {api_base}/auth/device/poll?state=…` (header `X-Code-Verifier`) every ~2 s until it receives `{ token, project_id }`.\n6. Token is written to `~/.config/shipeasy/config.json` with `chmod 600`. The directory is created `chmod 700`.\n\nFlags:\n\n| Flag             | Effect                                                                                    |\n| ---------------- | ----------------------------------------------------------------------------------------- |\n| `--force`        | Overwrite an existing session instead of aborting.                                        |\n| `--no-browser`   | Print the auth URL; useful on remote / headless machines (paste it into a local browser). |\n\nOther subcommands:\n\n```bash\nshipeasy-mcp whoami      # prints { project_id, user_email, config_path }\nshipeasy-mcp logout      # deletes ~/.config/shipeasy/config.json\nshipeasy-mcp --help      # usage\nshipeasy-mcp --version\n```\n\n### Why is this a CLI subcommand instead of an MCP tool?\n\nThe MCP stdio transport runs inside the AI assistant — it can't block for a browser round-trip, spawn new windows, or receive a browser-delivered callback. Browser-based auth has to run in a terminal the user owns. Once the token is written, **every** MCP server instance on the machine (Claude Code, Cursor, Windsurf, MCP Inspector, etc.) reads the same `~/.config/shipeasy/config.json` — one install, many clients.\n\nThe in-process `auth_login` MCP tool therefore always returns a pointer back to the CLI command rather than trying to launch a browser itself.\n\n### Manual stdio invocation (for testing)\n\n```bash\nnpx -y @shipeasy/mcp\n# or pipe it through MCP Inspector:\nnpx @modelcontextprotocol/inspector npx -y @shipeasy/mcp\n```\n\n---\n\n## Protocol surface\n\nTransport: **stdio** (JSON-RPC 2.0 framed by Content-Length headers per MCP spec).\nCapabilities advertised on initialize:\n\n```json\n{\n  \"tools\": { \"listChanged\": true },\n  \"prompts\": { \"listChanged\": false },\n  \"resources\": { \"subscribe\": true, \"listChanged\": true },\n  \"logging\": {}\n}\n```\n\n- **Tools** — actions the assistant can invoke (the full catalog below).\n- **Prompts** — named, parameterized workflow playbooks (see _Prompts_ section).\n- **Resources** — read-only views of project state the assistant can pull in as context (see _Resources_ section).\n- **Logging** — structured progress and error notifications via `notifications/message`.\n\n---\n\n## Authentication\n\nEvery mutating tool requires a Shipeasy session. Credentials live in `~/.config/shipeasy/config.json` and are shared between `@shipeasy/mcp` and `@shipeasy/cli` — whichever tool the user authenticates in first, both pick up the same session.\n\n1. `shipeasy-mcp install` (terminal) completes the PKCE device flow and writes the config file (see _Step 2 — authenticate_ above).\n2. The MCP stdio server's `auth_check` tool reads the file on every call — no cached state in the server process.\n3. `auth_login` invoked over MCP always returns an actionable error asking the human to run `shipeasy-mcp install` in a terminal (stdio can't open a browser safely).\n4. `auth_logout` removes the file; the CLI equivalent works too.\n\n```\n~/.config/shipeasy/config.json          (mode 0600, parent dir 0700)\n  {\n    \"project_id\":   \"proj_…\",\n    \"cli_token\":    \"sdk_admin_…\",      ← scoped to admin Route Handlers; 90-day rotation\n    \"api_base_url\": \"https://api.shipeasy.ai\",\n    \"app_base_url\": \"https://shipeasy.ai\",\n    \"user_email\":   \"you@example.com\",\n    \"created_at\":   \"2026-04-16T…Z\"\n  }\n```\n\nTool-level auth policy:\n\n| Category                                        | Requires session | Notes                                                  |\n| ----------------------------------------------- | ---------------- | ------------------------------------------------------ |\n| `auth_*`                                        | — / triggers it  |                                                        |\n| `list_*`, `get_*`                               | Yes              | Read-only GETs against `apps/ui` admin Route Handlers. |\n| `create_*`, `update_*`, `delete_*`, `publish_*` | Yes              | Mutations — the CLI enforces `checkLimit` server-side. |\n\n> **Filesystem / AST tools live in the `shipeasy` CLI, not this server.** Project\n> detection and the i18n source scanners / codemods / loader-install / file-based\n> push / local-Anthropic translation were removed from MCP — the server only makes\n> admin-API calls now (plus the auth + `.shipeasy` bind primitives). The\n> authoritative, generated tool reference is [`docs/mcp-reference.md`](docs/mcp-reference.md);\n> the catalog below is design-era narrative and has drifted.\n\n---\n\n## Tool catalog\n\nTools are namespaced by subsystem: `exp_*` (experimentation), `i18n_*` (string manager), unprefixed (shared: auth, resource listing, SDK snippets). Project detection has moved to the `shipeasy` CLI.\n\n### Shared tools\n\n#### `auth_check`\n\n```json\n// input\n{}\n\n// output\n{ \"authenticated\": true, \"project_id\": \"…\", \"base_url\": \"…\", \"user_email\": \"…\" }\n```\n\n#### `auth_login`\n\nSpawns `shipeasy login`, which opens the browser and blocks until the device-auth flow completes. Uses `spawn` (not `execSync`) so the MCP event loop stays responsive. The AI assistant should surface a \"waiting for browser…\" message — the CLI session polls for up to 5 minutes.\n\n```json\n// input\n{}\n// output — same shape as auth_check after success\n```\n\n#### `auth_logout`\n\nDeletes `~/.config/shipeasy/config.json`. No network call.\n\n---\n\n#### `list_resources`\n\nUnified listing across both subsystems.\n\n```json\n// input\n{\n  \"kind\": \"gates|configs|experiments|events|metrics|universes|attributes|profiles|keys|drafts|sdk_keys|all\",\n  \"limit\": 50,\n  \"search\": \"checkout\" // optional name filter\n}\n```\n\nHits the matching `apps/ui` admin Route Handler (e.g. `/api/admin/gates`, `/api/admin/i18n/profiles`) and returns a normalized list:\n\n```json\n{\n  \"kind\": \"experiments\",\n  \"items\": [\n    { \"id\": \"…\", \"name\": \"checkout_button_color\", \"universe\": \"checkout\", \"status\": \"running\", \"allocation\": 10 },\n    ...\n  ],\n  \"next_cursor\": null\n}\n```\n\n#### `get_resource`\n\nFetches a single resource by `{ kind, name_or_id }`. Same routing as `list_resources`.\n\n---\n\n#### `get_sdk_snippet`\n\nReturns ready-to-paste code for the detected language + framework, for either subsystem.\n\n```json\n// input\n{\n  \"domain\": \"experiment | i18n\",\n  \"language\": \"typescript | python | ruby | go | java | php | swift | kotlin\",\n  \"framework\": \"nextjs | react | remix | vue | svelte | angular | nuxt | django | rails | laravel | spring | swiftui | compose | ... | null\",\n  \"type\": \"gate | experiment | config | label_load | label_render | loader_script | provider_setup\",\n  \"name\": \"new_checkout\",\n  \"params\": { \"color\": \"string\" },\n  \"success_event\": \"purchase_completed\",\n  \"success_value\": true\n}\n```\n\n**Output**:\n\n```json\n{\n  \"install\": \"pnpm add shipeasy\",\n  \"env_vars\": [\"SHIPEASY_SERVER_KEY\", \"NEXT_PUBLIC_SHIPEASY_CLIENT_KEY\"],\n  \"init\": \"…code block…\",\n  \"usage\": \"…code block…\",\n  \"tracking\": \"…code block (only for experiments)…\",\n  \"validate_command\": \"pnpm tsc --noEmit\",\n  \"docs_url\": \"https://docs.shipeasy.ai/sdk/typescript/next\"\n}\n```\n\nTemplates are loaded from the installed SDK package (`shipeasy/templates/<language>.js`), not from this MCP bundle — so they track the customer's SDK version. Falls back to bundled templates if the SDK has no `templates/` export or isn't installed yet. See [packages/language_sdks/README.md](../language_sdks/README.md) for the source-of-truth template files per language.\n\n---\n\n#### `list_prompts` / `get_prompt`\n\nStandard MCP — see _Prompts_ section below. These are built into `@modelcontextprotocol/sdk`.\n\n---\n\n### Experimentation tools (`exp_*`)\n\nAll mutations shell out to `@shipeasy/cli` via `execFile` (never `exec` with shell interpolation) with validated, slugified arguments. Names are auto-slugged before validation (`SAFE_NAME_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/`) and a warning is logged if auto-slugging changed the input.\n\n| Tool                      | What it does                                                      | Shells to                                  |\n| ------------------------- | ----------------------------------------------------------------- | ------------------------------------------ |\n| `exp_create_gate`         | Create a feature gate with targeting rules and rollout percentage | `shipeasy gates create`                    |\n| `exp_update_gate`         | Update rules, rollout, killswitch                                 | `shipeasy gates update`                    |\n| `exp_delete_gate`         |                                                                   | `shipeasy gates delete`                    |\n| `exp_create_config`       | Create a static config (sitevar)                                  | `shipeasy configs create`                  |\n| `exp_update_config_value` | Update the live value                                             | `shipeasy configs set`                     |\n| `exp_create_universe`     | Create a universe with holdout %                                  | `shipeasy universes create`                |\n| `exp_create_experiment`   | Create experiment draft with groups, params, targeting gate       | `shipeasy experiments create`              |\n| `exp_start_experiment`    | Transition draft → running                                        | `shipeasy experiments start`               |\n| `exp_stop_experiment`     | Transition running → stopped, promote winning group               | `shipeasy experiments stop`                |\n| `exp_add_metric`          | Attach a metric as goal/guardrail                                 | `shipeasy experiments metric add`          |\n| `exp_create_event`        | Register an event schema                                          | `shipeasy events create`                   |\n| `exp_create_metric`       | Create a metric from an event                                     | `shipeasy metrics create`                  |\n| `exp_experiment_status`   | Current results + ship/hold/wait verdict                          | `GET /api/admin/experiments/:name/results` |\n| `exp_cleanup_winner`      | AST-drop losing branches after shipping                           | Local codemod via `jscodeshift`/`ast-grep` |\n\n**Representative input — `exp_create_experiment`:**\n\n```json\n{\n  \"name\": \"checkout_button_color\",\n  \"description\": \"Test green vs. gray on new checkout\",\n  \"universe\": \"checkout\",\n  \"allocation\": 10,\n  \"groups\": [\n    { \"name\": \"control\", \"weight\": 5000, \"params\": { \"color\": \"gray\" } },\n    { \"name\": \"test\", \"weight\": 5000, \"params\": { \"color\": \"green\" } }\n  ],\n  \"params_schema\": { \"color\": \"string\" },\n  \"targeting_gate\": \"new_checkout\",\n  \"success_event\": \"purchase_completed\",\n  \"success_aggregation\": \"count_users\"\n}\n```\n\n**Output:**\n\n```json\n{\n  \"experiment\": {\n    \"name\": \"checkout_button_color\",\n    \"id\": \"exp_…\",\n    \"status\": \"draft\",\n    \"universe\": \"checkout\"\n  },\n  \"metric\": { \"name\": \"checkout_button_color_purchase_completed\", \"status\": \"created\" },\n  \"snippet\": {\n    /* same shape as get_sdk_snippet */\n  },\n  \"docs_url\": \"https://docs.shipeasy.ai/experiments/create\"\n}\n```\n\n---\n\n### String manager tools (`i18n_*`)\n\nThe i18n **admin API** surface is projected from the spec (tag chain `i18n ▸ Profiles | Keys | Drafts` + `x-cli` verb), exactly like every other resource. The exact, authoritative list is the generated [`docs/mcp-reference.md`](docs/mcp-reference.md); the current tools are:\n\n| Tool                   | What it does                                                                 | Endpoint                                          |\n| ---------------------- | --------------------------------------------------------------------------- | ------------------------------------------------- |\n| `i18n_profiles_list`   | List locale profiles                                                         | `GET /api/admin/i18n/profiles`                    |\n| `i18n_profiles_create` | Create a locale profile (e.g. `fr:prod`)                                     | `POST /api/admin/i18n/profiles`                   |\n| `i18n_profiles_publish`| Publish a profile live (profile-wide KV rebuild + CDN purge)                 | `POST /api/admin/i18n/profiles/{profileId}/publish` |\n| `i18n_keys_list`       | List keys for a profile (filter by prefix / free-text)                       | `GET /api/admin/i18n/keys`                        |\n| `i18n_keys_push`       | Push new keys (insert-only — existing keys are skipped)                      | `POST /api/admin/i18n/keys`                       |\n| `i18n_keys_update`     | Overwrite one existing key's value (by key id)                              | `PUT /api/admin/i18n/keys/{id}`                   |\n| `i18n_keys_set`        | Set one key by **profile name** (omit → default) and publish it live        | `POST /api/admin/i18n/set`                        |\n| `i18n_drafts_list`     | List staged machine-translation drafts                                      | `GET /api/admin/i18n/drafts`                      |\n\nThe **filesystem / AST** i18n tooling — source scanning, codemods, loader install, key validation, site discovery, local-Anthropic draft translation, and file-based bulk push — is **not** part of the MCP surface; it lives in the `shipeasy` CLI (the fs-having consumer). It never hit the admin API, so it carries no spec op.\n\n---\n\n## Prompts (workflow skills)\n\nMCP prompts expose named, parameterized playbooks the AI can `get_prompt()` to load as context. Mirrors the skills bundle in [experiment-platform/11-skills.md](../../experiment-platform/11-skills.md) and [string-manager-platform/plan.md](../../string-manager-platform/plan.md) § Skills.\n\n| Prompt name             | Purpose                                                                   |\n| ----------------------- | ------------------------------------------------------------------------- |\n| `setup_experimentation` | Install the SDK, add env keys, wire a provider, verify with a sample gate |\n| `create_experiment`     | Propose → create → inject code → start → monitor                          |\n| `analyze_experiment`    | Pull results, compute lift + significance, emit ship/hold/wait verdict    |\n| `cleanup_winner`        | Remove losing branches + dead gate code after shipping                    |\n| `rotate_sdk_keys`       | Revoke + re-issue client/server keys and update env vars                  |\n\n(The i18n playbooks `setup_i18n` / `translate_site` / `i18n_health` were removed — they orchestrated the fs/AST tools that now live in the `shipeasy` CLI.)\n\nEach prompt's body is a short markdown playbook embedded in the server bundle. The assistant fetches it once per conversation with `get_prompt({ name })` and follows the steps.\n\n---\n\n## Resources\n\nRead-only project context streamed to the assistant via MCP's `resources/read`. The server advertises resource templates (URI patterns) so the assistant can pull context on demand without the user needing to paste files.\n\n| URI template                                 | Returns                                                             |\n| -------------------------------------------- | ------------------------------------------------------------------- |\n| `shipeasy://project`                         | Cached `detect_project()` output + `auth_check()` output.           |\n| `shipeasy://experiments/{name}`              | Experiment config + latest stats JSON.                              |\n| `shipeasy://gates/{name}`                    | Gate config + rollout state.                                        |\n| `shipeasy://configs/{name}`                  | Config value + history.                                             |\n| `shipeasy://i18n/profiles/{profile}`         | Profile metadata + published strings + coverage %.                  |\n| `shipeasy://i18n/drafts/{draft_id}`          | Draft metadata + per-key diff vs. source profile.                   |\n| `shipeasy://plans/current`                   | Plan tier + current-month usage + remaining quota.                  |\n| `shipeasy://docs/{slug}`                     | Pre-rendered markdown page from `docs.shipeasy.ai` — AI-consumable. |\n\n`resources/subscribe` is supported on `shipeasy://experiments/{name}` — the server pushes `notifications/resources/updated` when cron finishes a new analysis run (detected via long-poll on `/api/admin/experiments/:name/results?since=ts`).\n\n---\n\n## Package structure\n\n```\npackages/mcp/\n  package.json                      ← name: \"@shipeasy/mcp\", bin: \"shipeasy-mcp\"\n  tsconfig.json\n  tsup.config.ts                    ← esm output, single bundle\n  bin/\n    mcp.js                          ← shebang → runs dist/index.js\n  src/\n    index.ts                        ← Server setup, capability advertise, tool routing\n    rpc/\n      list-tools.ts\n      call-tool.ts\n      list-prompts.ts\n      get-prompt.ts\n      list-resources.ts\n      read-resource.ts\n      subscribe-resource.ts\n    tools/\n      schema.ts                     ← TOOLS array — MCP tool definitions\n      shared/\n        detect.ts                   ← detect_project (with realpath sandbox)\n        auth.ts                     ← auth_check, auth_login, auth_logout\n        list-resource.ts            ← list_resources, get_resource\n        snippets.ts                 ← get_sdk_snippet + template loader\n      exp/\n        gates.ts\n        configs.ts\n        universes.ts\n        experiments.ts\n        events.ts\n        metrics.ts\n        status.ts\n        cleanup.ts\n      i18n/\n        scan.ts                     ← i18n_scan_code (ast-grep driver)\n        discover.ts                 ← i18n_discover_site\n        profiles.ts\n        keys.ts\n        drafts.ts\n        translate.ts                ← i18n_translate_draft (Anthropic shell-out)\n        publish.ts\n        usage.ts\n        codemods/\n          nextjs.ts\n          react.ts\n          vue.ts\n          svelte.ts\n          angular.ts\n          rails.ts\n          django.ts\n          index.ts                  ← dispatcher for i18n_codemod_preview/apply\n        validate.ts\n        loader.ts                   ← i18n_install_loader\n    prompts/\n      schema.ts                     ← PROMPTS array\n      setup_experimentation.md\n      create_experiment.md\n      analyze_experiment.md\n      cleanup_winner.md\n      setup_i18n.md\n      translate_site.md\n      i18n_health.md\n      rotate_sdk_keys.md\n    resources/\n      schema.ts                     ← RESOURCE_TEMPLATES\n      project.ts\n      experiments.ts\n      gates.ts\n      configs.ts\n      i18n.ts\n      plans.ts\n      docs.ts\n    util/\n      cli.ts                        ← execFile wrapper with shared error decoding\n      http.ts                       ← fetch wrapper w/ cli_token header\n      slug.ts                       ← autoSlug + SAFE_NAME_RE\n      safe-read.ts                  ← realpath-sandboxed fs reads\n      progress.ts                   ← notifications/progress helper\n      logger.ts                     ← notifications/message helper (respects client log level)\n      compat.ts                     ← semver compatibility check per language\n    templates/                       ← fallback snippets when SDK has no templates/ export\n      typescript.ts\n      python.ts\n      ruby.ts\n      go.ts\n      java.ts\n      php.ts\n      swift.ts\n      kotlin.ts\n  test/\n    rpc/*.test.ts                   ← each request handler covered\n    tools/exp/*.test.ts\n    tools/i18n/*.test.ts\n    tools/shared/detect.test.ts     ← realpath sandbox edge cases\n    fixtures/\n      projects/\n        nextjs-with-sdk/\n        django-clean/\n        rails-with-i18n/\n        astro-plain/\n```\n\n---\n\n## package.json\n\n```json\n{\n  \"name\": \"@shipeasy/mcp\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Model Context Protocol server for the Shipeasy platform (experimentation + i18n)\",\n  \"keywords\": [\n    \"mcp\",\n    \"model-context-protocol\",\n    \"shipeasy\",\n    \"feature-flags\",\n    \"experimentation\",\n    \"i18n\",\n    \"ai\"\n  ],\n  \"type\": \"module\",\n  \"bin\": { \"shipeasy-mcp\": \"./bin/mcp.js\" },\n  \"files\": [\"bin/\", \"dist/\", \"src/prompts/*.md\"],\n  \"engines\": { \"node\": \">=20\" },\n  \"scripts\": {\n    \"build\": \"tsup src/index.ts --format esm --dts --clean\",\n    \"type-check\": \"tsc --noEmit\",\n    \"test\": \"vitest\",\n    \"prepublishOnly\": \"pnpm build\"\n  },\n  \"dependencies\": {\n    \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n    \"@shipeasy/sdk\": \"workspace:*\",\n    \"semver\": \"^7.6.0\",\n    \"zod\": \"^3.23.0\",\n    \"conf\": \"^13.0.0\",\n    \"@ast-grep/napi\": \"^0.22.0\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^20.19.0\",\n    \"@types/semver\": \"^7.5.0\",\n    \"tsup\": \"^8.3.0\",\n    \"typescript\": \"^5.7.0\",\n    \"vitest\": \"^2.0.0\"\n  }\n}\n```\n\nWhy `@ast-grep/napi`? A single, fast, multi-language AST engine used by every codemod (JS/TS/Vue/Svelte/Python/Ruby) instead of per-framework parsers. Keeps the install footprint small — one native dep, prebuilt binaries for common platforms.\n\n---\n\n## Error handling\n\nEvery tool returns one of three shapes:\n\n```typescript\n// Success\n{ content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] }\n\n// Known validation / domain error (isError: true)\n{ content: [{ type: \"text\", text: \"Error: gate 'new_checkout' already exists\" }], isError: true }\n\n// Protocol error — JSON-RPC level\n{ error: { code: -32602, message: \"Invalid params: 'name' required\" } }\n```\n\nRules:\n\n- **Never crash the stdio transport.** Any unexpected exception is converted into an `isError: true` tool result with a redacted message; a structured `notifications/message` log is emitted at `error` level for the operator.\n- **Never include the SDK key, CLI token, or Anthropic key** in any response, error, or log line. The logger has a deny-list of env var names that it redacts before emitting.\n- **Never shell out with `exec` + string interpolation.** All subprocess calls go through `util/cli.ts` which uses `execFile` with an argument array and a 60 s default timeout.\n- **Validate every path input via `util/safe-read.ts`** — path traversal attempts throw a specific error that's shown to the user, not silently followed.\n\n---\n\n## Logging / progress\n\n- Structured logs are sent via `notifications/message`. The assistant honours the client-set log level (`debug`, `info`, `warning`, `error`) advertised at initialize time.\n- Long-running tools (`i18n_translate_draft`, `i18n_codemod_apply` on large repos, `i18n_push_keys`) emit `notifications/progress` with `{ progressToken, progress, total, message }` so the assistant can render a spinner/bar.\n- Every tool call is logged with `{ tool, duration_ms, result_status, error_code }` locally to `~/.cache/shipeasy/mcp.log` (rolling 10 MB, 3 files). No payloads. No secrets.\n\n---\n\n## SDK / template compatibility\n\nEach SDK language declares a compatible template range; the MCP server bundles the template authority and resolves at call time.\n\n```typescript\nconst COMPATIBLE_VERSIONS: Record<Lang, string> = {\n  typescript: \">=1.0.0 <3.0.0\",\n  python: \">=1.0.0\",\n  ruby: \">=1.0.0\",\n  go: \">=1.0.0\",\n  java: \">=1.0.0\",\n  php: \">=1.0.0\",\n  swift: \">=1.0.0\",\n  kotlin: \">=1.0.0\",\n};\n```\n\n`detect_project` sets `template_warning` when the installed SDK is outside the range. `get_sdk_snippet` first tries to import templates from the customer's installed `shipeasy/templates/<lang>.js` and falls back to this MCP server's bundled templates only if the SDK is not present (e.g. during fresh project setup).\n\n---\n\n## Testing\n\n- **Unit tests** — every tool handler in isolation with a mock `fetch` + mocked `execFile`. Target ≥90% coverage on `src/tools/**`.\n- **Fixture projects** — `test/fixtures/projects/` contains minimal Next.js / Django / Rails / Astro projects. `detect_project` runs against each one and asserts the returned shape.\n- **MCP Inspector smoke test** — CI runs `npx @modelcontextprotocol/inspector npx -y ./dist/index.js` and exercises `list_tools`, `list_prompts`, `list_resources`, and one success/one error tool call per domain.\n- **End-to-end** — a Playwright suite under [apps/ui/e2e/auth/mcp/](../../apps/ui/e2e/auth/mcp/) stands up a real worker + UI, spawns the MCP server as a child process, and verifies the full `create_experiment` → `get_sdk_snippet` → `experiment_status` loop writes to D1 and KV correctly. Required per [CLAUDE.md](../../CLAUDE.md).\n- **Cross-SDK snippet verification** — for each language × framework × type tuple, the generated snippet is compiled/parsed (TypeScript → `tsc --noEmit`, Python → `py_compile`, etc.) in a tiny scratch project. Regressions in template strings fail CI instantly.\n\n---\n\n## Versioning\n\nIndependent of the CLI and the SDK:\n\n- **Major** — tool rename/removal, input-schema breaking change, prompt rename.\n- **Minor** — new tool, new prompt, new resource template, additive optional input field.\n- **Patch** — bug fix, template refresh, copy tweak.\n\n`initialize` advertises `serverInfo.version`. The assistant may show a nudge when a newer version is available on npm. `@shipeasy/cli` re-exports `@shipeasy/mcp` at the matching major so `shipeasy mcp start` never runs a mismatched server.\n\n---\n\n## Publish to the MCP Registry\n\nThis server is listed in the [official MCP Registry](https://registry.modelcontextprotocol.io) as **`ai.shipeasy/mcp`**, which is what most MCP directories (Smithery, Glama, PulseMCP, mcp.so, the VS Code / Cursor galleries) ingest from. The registry hosts only metadata — the actual artifact is the `@shipeasy/mcp` npm package.\n\n**Single source of truth:** `package.json`. Its `mcpName` is the registry server name and the npm `name`/`version`/`description`/`repository` feed the rest. `server.json` is generated — never hand-edit it:\n\n```bash\npnpm --filter @shipeasy/mcp registry:gen   # package.json → server.json\n```\n\n**This is automated.** `.github/workflows/publish.yml` publishes to npm on a GitHub Release, then a `publish-registry` job lists the new version on the MCP Registry (it waits for npm to expose the version, regenerates `server.json`, and authenticates via DNS using the `MCP_PRIVATE_KEY` repo secret — the Ed25519 key behind the `shipeasy.ai` TXT proof). GitHub-OIDC auth is **not** usable here: it only grants `io.github.*` namespaces, not our `ai.shipeasy` domain namespace. So the day-to-day flow is just: bump `version`, regen `server.json`, commit, **tag a release** — CI does the rest.\n\nThe manual flow below is the fallback (first-time setup, or republishing out of band).\n\nThe registry verifies ownership by checking that the **published** npm package's `package.json` carries `mcpName: \"ai.shipeasy/mcp\"`. So the order matters — ship npm first, then the registry:\n\n1. **Release the npm version** the registry will verify (it must already include `mcpName`). Bump `version`, tag a release on `shipeasy-ai/mcp`, let CI publish via OIDC. Manual `npm publish` is forbidden (see `## Non-negotiables`).\n2. **Authenticate** under the `ai.shipeasy` namespace (DNS-based, one-time TXT record on `shipeasy.ai`):\n   ```bash\n   openssl genpkey -algorithm Ed25519 -out key.pem\n   PUBLIC_KEY=\"$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)\"\n   # add TXT on shipeasy.ai:  v=MCPv1; k=ed25519; p=$PUBLIC_KEY\n   PRIVATE_KEY=\"$(openssl pkey -in key.pem -noout -text | grep -A3 'priv:' | tail -n +2 | tr -d ' :\\n')\"\n   mcp-publisher login dns --domain shipeasy.ai --private-key \"$PRIVATE_KEY\"\n   ```\n3. **Regenerate + publish:**\n   ```bash\n   pnpm --filter @shipeasy/mcp registry:gen\n   cd packages/mcp && mcp-publisher publish\n   ```\n\nInstall `mcp-publisher` with `brew install mcp-publisher` (or the [release binary](https://github.com/modelcontextprotocol/registry/releases/latest)). Verify after: `curl \"https://registry.modelcontextprotocol.io/v0.1/servers?search=ai.shipeasy/mcp\"`.\n\n---\n\n## Why one MCP server and not two\n\n1. **One auth flow.** The CLI token unlocks both `/api/admin/experiments/*` and `/api/admin/i18n/*`. Two servers would each prompt for login.\n2. **One project detection.** `detect_project` needs to report _both_ experimentation and i18n status; splitting doubles the filesystem walks for every conversation.\n3. **Cross-subsystem prompts.** `translate_site` wants to read experiment config (does the site have an `en` variant gated by a `new_language_picker` flag?) — a single server can `get_resource` from both domains without a cross-server handshake.\n4. **One AI install step.** Customers add one entry to `.claude/settings.json`, not two.\n5. **One shared bundle of templates.** Language + framework templates are co-located; an `i18n_install_loader` call can consult the same detected stack `exp_create_experiment` just used.\n\n---\n\n## Non-negotiables\n\n- Every new tool ships with: input schema in `tools/schema.ts`, Zod validator at call-time, unit test, and an entry in this README's catalog table.\n- Every new prompt ships with: entry in `prompts/schema.ts` + a markdown file under `prompts/*.md` + a one-line description for `list_prompts`.\n- Every mutating tool (`create_*`, `update_*`, `delete_*`, `publish_*`) requires an authenticated session and re-validates limits by letting the `apps/ui` handler call `checkLimit()` — the MCP server never hand-rolls plan enforcement.\n- All subprocess invocations use `execFile` + argument arrays.\n- All filesystem reads go through `util/safe-read.ts`.\n- Secrets (SDK keys, CLI token, Anthropic API key) never appear in tool output, prompt content, resource content, or log lines.\n- Stdio transport stays healthy: unhandled rejections are captured in `index.ts` and converted to `notifications/message` errors — the process never exits on a per-request failure.\n- Template updates are co-versioned with the SDK (`shipeasy/templates/`) and validated in CI with `tsc --noEmit` / `py_compile` / equivalent.\n\n<!-- ci: republish trigger (v2) — publish workflows re-run on the corrected pnpm/action-setup config; no package content change -->\n","readmeFilename":"README.md"}