{"_id":"@creezio/mcp-facade","_rev":"6-35b7713cba56bc8423908f460047b67e","name":"@creezio/mcp-facade","dist-tags":{"latest":"0.26.0"},"versions":{"0.22.0":{"name":"@creezio/mcp-facade","version":"0.22.0","license":"UNLICENSED","_id":"@creezio/mcp-facade@0.22.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"706930e5c817cda28131a8af831d2a26714d7252","tarball":"https://registry.npmjs.org/@creezio/mcp-facade/-/mcp-facade-0.22.0.tgz","fileCount":174,"integrity":"sha512-Uccp6dYtBz3MBXsbPlqak74NTT6+rPb4XTtBSX8h6IhSLmm/RhdViYwoJk3KQpufLK51py8attQahmKcldetoQ==","signatures":[{"sig":"MEQCIFaVlYP61ETNDlRrak2fk1iSEgMz9oOYvrzDVnD5AFcyAiBAyrExprhVjYQFYy9KF4S+0/TSvxC/Zo6cPMYJcFkb3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":673363},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"544bc16fbe31e3a3721b24d2d17a377f1dc11e1c","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"_npmVersion":"10.9.8","description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","hono":"^4.12.32","jose":"^6.2.5","@creezio/api-kernel":"^0.22.0","@creezio/platform-core":"^0.22.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"clsx":"^2.0.0","react":"^18.0.0 || ^19.0.0","sonner":">=1.0.0","lucide-react":">=0.400.0","tailwind-merge":"^2.0.0 || ^3.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.0","class-variance-authority":"^0.7.0"},"peerDependenciesMeta":{"clsx":{"optional":true},"react":{"optional":true},"sonner":{"optional":true},"lucide-react":{"optional":true},"tailwind-merge":{"optional":true},"@radix-ui/react-slot":{"optional":true},"@radix-ui/react-tabs":{"optional":true},"class-variance-authority":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-facade_0.22.0_1788206230021_0.6966844718717422","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@creezio/mcp-facade","version":"0.23.0","license":"UNLICENSED","_id":"@creezio/mcp-facade@0.23.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"c340ec77430794548be99a408e9cc0b89afee028","tarball":"https://registry.npmjs.org/@creezio/mcp-facade/-/mcp-facade-0.23.0.tgz","fileCount":174,"integrity":"sha512-cxQyTtKuCsoP6vOlOGgDN1asN5tJFtdpfHc7n/ruAdmtEVtwTSmfM5kMKFdlHVvMxgGAlSFmfqEWW1SpDepO7A==","signatures":[{"sig":"MEUCIQCwT3XTZ8+SjAWhOkwmLpFqWeyuKPaXw9b4ToIlIdnS1wIgeTu24E4B6Tg9UTo7JIkNvQs0GrzTZbHpyuNy1jlaHvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCF/qQQZKDX47DqBWk6fimtAPbZ9FFRkLKgBIL335bQlQIgPILMconwUra870lDa7Ti/pLAzlzJkZBhVZ7gnWl97uM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":673363},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"55f391b610619648ca8b633a0509ac2ce9d2d784","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"_npmVersion":"10.9.8","description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","hono":"^4.12.32","jose":"^6.2.5","@creezio/api-kernel":"^0.23.0","@creezio/platform-core":"^0.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"clsx":"^2.0.0","react":"^18.0.0 || ^19.0.0","sonner":">=1.0.0","lucide-react":">=0.400.0","tailwind-merge":"^2.0.0 || ^3.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.0","class-variance-authority":"^0.7.0"},"peerDependenciesMeta":{"clsx":{"optional":true},"react":{"optional":true},"sonner":{"optional":true},"lucide-react":{"optional":true},"tailwind-merge":{"optional":true},"@radix-ui/react-slot":{"optional":true},"@radix-ui/react-tabs":{"optional":true},"class-variance-authority":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-facade_0.23.0_1788354178322_0.7160167954312604","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@creezio/mcp-facade","version":"0.24.0","license":"UNLICENSED","_id":"@creezio/mcp-facade@0.24.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"9b3141c4cb99f49e890515acb382071fe8af7619","tarball":"https://registry.npmjs.org/@creezio/mcp-facade/-/mcp-facade-0.24.0.tgz","fileCount":174,"integrity":"sha512-ZGupzfBRYcFgzlqbxfjF2w8lEP6NSETjjjPraFqn58gPVpuwF5gVfRdF5UWm5GLl5Aj7J5YW3zq4orkBL5uFRw==","signatures":[{"sig":"MEQCIGr/rtpw4E589TUzVUCicyk1w+naSC3UNb1+nWkdHuflAiBV9xomFeYgwJ62WUpNd1xFz1PNXoMUiMjxKhutnl9wEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDVwckYFnBQs3gMF7ND4T1KkgWM0wYioGITMogYIgy8zAiEA2+JtA/ZZKc2Rqt0kVq7k+wrl2L55LLd9Y45XRxLjmwE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":673363},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"55da99cacf142cd8af97487d70cc8dc54586db26","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"_npmVersion":"10.9.8","description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","hono":"^4.12.32","jose":"^6.2.5","@creezio/api-kernel":"^0.24.0","@creezio/platform-core":"^0.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"clsx":"^2.0.0","react":"^18.0.0 || ^19.0.0","sonner":">=1.0.0","lucide-react":">=0.400.0","tailwind-merge":"^2.0.0 || ^3.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.0","class-variance-authority":"^0.7.0"},"peerDependenciesMeta":{"clsx":{"optional":true},"react":{"optional":true},"sonner":{"optional":true},"lucide-react":{"optional":true},"tailwind-merge":{"optional":true},"@radix-ui/react-slot":{"optional":true},"@radix-ui/react-tabs":{"optional":true},"class-variance-authority":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-facade_0.24.0_1788360316683_0.7857353648479046","host":"s3://npm-registry-packages-npm-production"}},"0.24.1":{"name":"@creezio/mcp-facade","version":"0.24.1","license":"UNLICENSED","_id":"@creezio/mcp-facade@0.24.1","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"d2f689dd3becfd4244e29206abb26ea6bf688f0a","tarball":"https://registry.npmjs.org/@creezio/mcp-facade/-/mcp-facade-0.24.1.tgz","fileCount":174,"integrity":"sha512-bBJZnP62orhOmp1Gp07IA6VOWprN8/1lMbEQrZa8XtORfQ/+qCxHj3ZF5qZVAfbIF5isbWUeVbm28wv76ogHtA==","signatures":[{"sig":"MEUCIQDqI3sMq7ALlfR3wvvY0GCrvkvi1+UXsU9dndg/q+6QGAIgMTJJvFbJgIcj+ZGRGVy6OOmHbseLQ1an0e0Gv4CWwxQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFkY1wb9sUk8j1bzTrjwCX2tWm1DMe66rmTxSRr8atdDAiEAwDpU5o8RByAaLb+vWFn5wVjGnrB7aZq/Jq3gKmjtdYs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":673363},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"0b0add380e7244b9f1502eea4609dfda3fdca05d","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"_npmVersion":"10.9.8","description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","hono":"^4.12.32","jose":"^6.2.5","@creezio/api-kernel":"^0.24.1","@creezio/platform-core":"^0.24.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"clsx":"^2.0.0","react":"^18.0.0 || ^19.0.0","sonner":">=1.0.0","lucide-react":">=0.400.0","tailwind-merge":"^2.0.0 || ^3.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.0","class-variance-authority":"^0.7.0"},"peerDependenciesMeta":{"clsx":{"optional":true},"react":{"optional":true},"sonner":{"optional":true},"lucide-react":{"optional":true},"tailwind-merge":{"optional":true},"@radix-ui/react-slot":{"optional":true},"@radix-ui/react-tabs":{"optional":true},"class-variance-authority":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-facade_0.24.1_1788365488644_0.3304212684498793","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@creezio/mcp-facade","version":"0.25.0","license":"UNLICENSED","_id":"@creezio/mcp-facade@0.25.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"5ee8cec6e4d7399114ee70765583ea2f95939650","tarball":"https://registry.npmjs.org/@creezio/mcp-facade/-/mcp-facade-0.25.0.tgz","fileCount":174,"integrity":"sha512-37vx1F6IJU3PRRvF2q4RPWuNEoCiG4kxUFxZC7Hspye/u/IM0bL7Z6q4XYleCoifgNXNU1RQ5s6dOQFiHEDpSg==","signatures":[{"sig":"MEUCIERqvjKPp+ErI9PSEZ2vxGn2QMc/PD94RUzgaNx751fuAiEA+dXp/TI4wvOZd4jg7z1ER4wrOtj9Khp4DgkZmgo3DQk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD7qiqOG/Snkmmp0Zmf5UEnBjY3fkkyKniyXkjESAXapwIgc+ssyGKVUjGRJMgCFMDmn8kTZFDmfmpXdJUdq/6KBfU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":673225},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"72ee394172d7a01bc0a51e0f8e4db3bbc5be8f31","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"_npmVersion":"10.9.8","description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","hono":"^4.12.32","jose":"^6.2.5","@creezio/api-kernel":"^0.25.0","@creezio/platform-core":"^0.25.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"clsx":"^2.0.0","react":"^18.0.0 || ^19.0.0","sonner":">=1.0.0","lucide-react":">=0.400.0","tailwind-merge":"^2.0.0 || ^3.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.0","class-variance-authority":"^0.7.0"},"peerDependenciesMeta":{"clsx":{"optional":true},"react":{"optional":true},"sonner":{"optional":true},"lucide-react":{"optional":true},"tailwind-merge":{"optional":true},"@radix-ui/react-slot":{"optional":true},"@radix-ui/react-tabs":{"optional":true},"class-variance-authority":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-facade_0.25.0_1788373800930_0.9121323230861491","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"_id":"@creezio/mcp-facade@0.26.0","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"04f53ecb8bb10a6564af8f2a13611388e9f4bd89","tarball":"https://registry.npmjs.org/@creezio/mcp-facade/-/mcp-facade-0.26.0.tgz","fileCount":174,"integrity":"sha512-NXYs9HMkfP0ifsfGV+tiW1g1amQldHkYoPPhh2zTTAWdSQlYVxbaaZVMvAygI0fzkW20h8H2A6EJGAYa5YUwBg==","signatures":[{"sig":"MEYCIQC2yLtylYXV0oN29uMZibmUZDLNmyvNPIVExe+c0YjGLAIhAM2BegZl8LxDTONas9ppCEj388+EBPjy8Cow6bF7n/wf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDT7X1hDlU08IFrT0kcCHzsSSpJWWPZee50mIbSXPpktgIhAPF7gEalsgMFyTD3ASJG5QdgvJ6ITKcrIJjLQLcYu/V7"}],"unpackedSize":673225},"main":"./dist-cjs/index.js","name":"@creezio/mcp-facade","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"fef880ebe9665ef996cfbabbe551dbd2a823a875","license":"UNLICENSED","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"0.26.0","_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"homepage":"https://github.com/creezio/creezio#readme","repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"_npmVersion":"10.9.8","description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","directories":{},"maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","hono":"^4.12.32","jose":"^6.2.5","@creezio/api-kernel":"^0.26.0","@creezio/platform-core":"^0.26.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"clsx":"^2.0.0","react":"^18.0.0 || ^19.0.0","sonner":">=1.0.0","lucide-react":">=0.400.0","tailwind-merge":"^2.0.0 || ^3.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.0","class-variance-authority":"^0.7.0"},"peerDependenciesMeta":{"clsx":{"optional":true},"react":{"optional":true},"sonner":{"optional":true},"lucide-react":{"optional":true},"tailwind-merge":{"optional":true},"@radix-ui/react-slot":{"optional":true},"@radix-ui/react-tabs":{"optional":true},"class-variance-authority":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-facade_0.26.0_1788381553100_0.5852323434336149"}}},"time":{"created":"2026-08-31T19:57:09.854Z","modified":"2026-09-02T20:39:13.401Z","0.22.0":"2026-08-31T19:57:10.147Z","0.23.0":"2026-09-02T13:02:58.404Z","0.24.0":"2026-09-02T14:45:16.767Z","0.24.1":"2026-09-02T16:11:28.785Z","0.25.0":"2026-09-02T18:30:01.053Z","0.26.0":"2026-09-02T20:39:13.196Z"},"bugs":{"url":"https://github.com/creezio/creezio/issues"},"license":"UNLICENSED","homepage":"https://github.com/creezio/creezio#readme","repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/mcp-facade"},"description":"MCP proxy unifié H4 + admin policies/clients/UI (N6)","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"readme":"# @creezio/mcp-facade\n\n## Rôle\n\n`@creezio/mcp-facade` fournit la façade MCP unique d'une app Creezio. Il n'y a pas un \"MCP produit Creezio\" separe : Electron, Hono `/mcp` et le bridge assistant doivent s'appuyer sur la meme factory et exposer le meme ensemble metier, modulo la surface publique (`canonical`, `legacy-preferred`, `both`).\n\nLe package couvre :\n\n- registre dynamique de tools MCP ;\n- namespaces `core.*` / `creezio.*`, `module.<ownerId>.*`, `plugin.<ownerId>.*` ;\n- aliases legacy (`get_panier` -> `module.panier.get`) sans double exposition ;\n- policies d'autorisation et deny cross-layer ;\n- JWT Bearer minimal ;\n- proxy Hono/Streamable HTTP ;\n- OAuth 2.1 MCP avec PKCE, DCR, refresh rotation, well-known metadata et CORS/rate limit ;\n- factory marque `createBrandMcpFacade` ;\n- host tools plateforme dont `open_external_tab` ;\n- admin MCP (policies, clients OAuth, diagnostics, routes et UI).\n\nSurfaces publiees :\n\n| Import | Usage |\n|---|---|\n| `@creezio/mcp-facade` | façade, namespaces, JWT, OAuth, Hono, host tools, admin |\n| `@creezio/mcp-facade/ui` | UI React admin MCP : `McpAdminClient` |\n\n## Périmètre (kit vs marque)\n\nCe qui appartient au kit :\n\n- la mécanique MCP commune (`listTools`, `listToolsBySpace`, `callTool`) ;\n- le parsing et l'assertion des namespaces ;\n- la surface publique et les aliases ;\n- les tools coeur `creezio.*` / `core.*` exposes par `createCoreMcpTools` ;\n- le proxy Hono et le binding `bindFacadeToolsToHono` ;\n- OAuth MCP : clients, authorization codes, access/refresh tokens, PKCE S256, scopes, routes, metadata ;\n- le host tool generique `open_external_tab` ;\n- admin MCP : policies, clients, audit/metrics/diagnostics ;\n- UI admin generique.\n\nCe qui reste dans la marque :\n\n- handlers metier (`mcp-tools.ts`) : panier, GED, VASP, dossiers, catalogue, etc. ;\n- aliases publics historiques (`mcp-aliases.ts`) ;\n- resolution API Kernel et mounts metier ;\n- session/cookie/auth utilisateur injectes dans OAuth ;\n- DB concrete, migrations et secret JWT ;\n- resolution d'URL metier pour `open_external_tab` ;\n- host tools non MCP-metier : desktop, AI tasks, dispatch vers utilisateurs ;\n- transport concret `StreamableHTTPTransport` et `buildMcpServer`.\n\nRegle importante : les host tools (desktop, AI tasks, introspection) restent hors factory metier. Ne dupliquer aucun handler panier/GED/VASP dans Hono si la façade sait deja le decouvrir.\n\n## Installation / build\n\n```bash\nnpm install\nnpm run build -w @creezio/mcp-facade\nnpm run typecheck -w @creezio/mcp-facade\n```\n\nArtefacts :\n\n- ESM : `dist/`\n- CJS Electron : `dist-cjs/`\n- UI source : `ui/`\n\nDependances directes : `@creezio/api-kernel`, `@creezio/platform-core`, `hono`, `jose`, `zod`. Les dependances React/UI sont optionnelles et ne concernent que `./ui`.\n\n## Configuration\n\n### Façade de base\n\n```ts\nimport { createMcpFacade } from \"@creezio/mcp-facade\";\n\nconst facade = createMcpFacade({\n  jwtSecret: process.env.MCP_JWT_SECRET,\n  publicSurface: \"legacy-preferred\",\n  aliases: {\n    get_panier: \"module.panier.get\",\n  },\n  discoverToolsBySpace: async () => ({\n    module: await discoverModuleTools(),\n    plugin: await discoverPluginTools(),\n  }),\n});\n```\n\n`publicSurface` :\n\n| Mode | Effet |\n|---|---|\n| `legacy-preferred` | defaut ; expose l'alias legacy et masque le canonique correspondant |\n| `canonical` | expose uniquement les noms namespaces |\n| `both` | expose alias + canonique ; utile en debug, deconseille en production |\n\n### Namespaces\n\nNamespaces valides :\n\n- `creezio.*` ou `core.*` : coeur reserve au kit ;\n- `module.<ownerId>.*` : modules metier de la marque ;\n- `plugin.<ownerId>.*` : plugins/sidecars rattaches a une organisation ou un owner plugin.\n\n`ownerId` doit commencer par une lettre et contenir uniquement lettres, chiffres, `_` ou `-`, longueur max 63.\n\n```ts\nimport {\n  assertNamespacedToolName,\n  parseNamespacedToolName,\n} from \"@creezio/mcp-facade\";\n\nconst parsed = parseNamespacedToolName(\"module.panier.get\");\n// { space: \"module\", ownerId: \"panier\", rest: \"get\" }\n\nassertNamespacedToolName(\"module\", \"module.panier.get\", \"panier\");\n```\n\nLes aliases legacy (`get_panier`) ne passent pas `assertNamespacedToolName`; ils doivent etre declares via `aliases` ou `registerAlias`.\n\n### OAuth + `/mcp`\n\n```ts\nimport {\n  configureMcpOAuth,\n  createMcpHonoApp,\n  createMcpOAuthRoutes,\n  ensureMcpAdminSchema,\n  resolveMcpCorsOrigin,\n} from \"@creezio/mcp-facade\";\nimport { StreamableHTTPTransport } from \"@hono/mcp\";\n\nconfigureMcpOAuth({\n  getWriteDb,\n  tableExists,\n  getJwtSecret: () => process.env.MCP_JWT_SECRET!,\n  resolvePublicUrl: () =>\n    process.env.MCP_PUBLIC_URL ||\n    process.env.APP_PUBLIC_URL ||\n    process.env.APP_BASE_URL ||\n    null,\n});\n\nconst oauthRoutes = createMcpOAuthRoutes({\n  productName: \"Ma Marque CRM\",\n  resourceName: \"Ma Marque CRM MCP\",\n  consentScopesHtml: \"<li>Lire et executer les tools autorises</li>\",\n  session: {\n    getSessionFromContext,\n    authenticateUser,\n    validateCredentials,\n    getOwnerId: () => getOwner()?.id ?? null,\n    createSessionCookie,\n  },\n  resolveCookieSecure,\n});\n\nexport const mcpApp = createMcpHonoApp({\n  oauthRoutes,\n  ensureSchema: ensureMcpAdminSchema,\n  resolveCorsOrigin: resolveMcpCorsOrigin,\n  apiKeyAuth: {\n    prefix: \"brand_live_\",\n    verify: verifyApiKey,\n    resolveUserId: (key) => key.user_id || getOwner()?.id || null,\n  },\n  createTransport: () =>\n    new StreamableHTTPTransport({\n      sessionIdGenerator: undefined,\n      enableJsonResponse: true,\n    }),\n  buildMcpServer,\n});\n```\n\nRoutes OAuth exposees par le kit :\n\n- `GET /.well-known/oauth-authorization-server`\n- `GET /.well-known/oauth-protected-resource`\n- `POST /oauth/register`\n- `GET /oauth/authorize`\n- `POST /oauth/authorize`\n- `POST /oauth/token`\n- `ALL /mcp` via `createMcpHonoApp`\n\nScopes : `MCP_SCOPE`, `MCP_SCOPE_LEGACY`, `MCP_SCOPE_READ`, `MCP_SCOPE_WRITE`, `MCP_SCOPES`.\n\n## API publique (exports + exemples)\n\n### Façade MCP\n\nExports principaux :\n\n- `createMcpFacade`, type `McpFacade`\n- types : `McpToolDefinition`, `McpRegisteredTool`, `McpToolHandler`, `McpToolCallResult`, `McpToolSpace`\n- `listTools`, `listToolsBySpace`, `callTool`, `registerTool`, `registerAlias`\n\n```ts\nconst mcp = createMcpFacade({\n  allowUnauthenticated: true,\n  discoverToolsBySpace: async () => ({\n    module: [\n      {\n        name: \"module.notes.create\",\n        description: \"Cree une note\",\n        space: \"module\",\n        ownerId: \"notes\",\n        handler: async (args) => ({ ok: true, content: args }),\n      },\n    ],\n  }),\n});\n\nawait mcp.callTool(\"module.notes.create\", { title: \"Hello\" });\n```\n\n### Factory marque\n\n```ts\nimport { createBrandMcpFacade } from \"@creezio/mcp-facade\";\nimport { BRAND_MCP_ALIASES } from \"./mcp-aliases\";\nimport { createBrandModuleMcpTools } from \"./mcp-tools\";\n\nexport function createMyBrandMcp(api, options = {}) {\n  return createBrandMcpFacade({\n    api,\n    aliases: BRAND_MCP_ALIASES,\n    discoverModuleTools: createBrandModuleMcpTools,\n    discoverPluginTools: createBrandPluginTools,\n    publicSurface: \"legacy-preferred\",\n    ...options,\n  });\n}\n```\n\n`createBrandMcpFacade` configure par defaut :\n\n- `allowUnauthenticated: true` pour compat runtime local ;\n- `enforceNamespaces: true` ;\n- `defaultCrossLayerDeny: true` ;\n- `listApiMounts: () => api.listMounts()` ;\n- tools `module.*` générés depuis `api.listOperations()` (handler = `api.handle`) ;\n- `discoverModuleTools` optionnel = hook apps (extras / JWT) — SoT = `operations[]`, `mcpTools` n'existe plus.\n\n### Hono / SDK MCP\n\nExports principaux :\n\n- `bindFacadeToolsToHono`\n- `mcpFacadeResultToSdk`\n- `wrapMcpFacadeWithHonoProxy`\n- `MCP_PRODUCT_EXECUTOR`, `resolveMcpFacadeRole`\n\n```ts\nimport { bindFacadeToolsToHono } from \"@creezio/mcp-facade\";\n\nexport async function buildMcpServer(ctx) {\n  const server = createSdkMcpServer();\n  const facade = createMyBrandMcp(api, { publicSurface: \"canonical\" });\n  await bindFacadeToolsToHono(facade, server.registerTool.bind(server), {\n    bearerToken: ctx.accessToken,\n  });\n  registerHostTools(server, ctx);\n  return server;\n}\n```\n\n### JWT, policies et ACL\n\nExports principaux :\n\n- `signMcpJwt`, `verifyMcpBearer`\n- `composeToolPolicies`, `denyCrossLayerToolCall`, `createDenyUnauthorizedPluginToolPolicy`\n- types `McpAuthorizeContext`, `McpToolPolicyDecision`\n\n```ts\nconst authorize = composeToolPolicies(\n  denyCrossLayerToolCall,\n  async (ctx) => {\n    if (ctx.space === \"plugin\" && !ctx.orgId) {\n      return { allow: false, reason: \"missing_org\" };\n    }\n    return { allow: true };\n  },\n);\n```\n\n### OAuth store et routes\n\nExports principaux :\n\n- `configureMcpOAuth`, `getMcpOAuthAdapters`, `mcpOauthReady`\n- `registerClient`, `getClient`, `verifyClientSecret`\n- `createAuthCode`, `peekAuthCode`, `consumeAuthCode`, `verifyPkceS256`\n- `createRefreshToken`, `rotateRefreshToken`\n- `signAccessToken`, `verifyAccessToken`\n- `resolveMcpPublicUrl`, `mcpBaseUrl`, `mcpResourceUrl`, `resourceAcceptable`\n- `checkMcpRateLimit`, `rateLimitHeaders`, `resolveMcpCorsOrigin`\n- `createMcpOAuthRoutes`, `createMcpHonoApp`\n\nLa DB est injectee via `McpOAuthAdapters`; le kit ne choisit pas le fichier SQLite.\n\n### Host tools plateforme\n\n`CREEZIO_PLATFORM_HOST_MCP_TOOL_NAMES` contient :\n\n- `open_external_tab`\n- `list_tools_by_space`\n\n`open_external_tab` est enregistre par `createOpenExternalTabHostMcpTools`. Le kit fournit le schema et les garde-fous owner/target user ; la marque fournit resolution et dispatch.\n\n```ts\nimport { createOpenExternalTabHostMcpTools } from \"@creezio/mcp-facade\";\n\ncreateOpenExternalTabHostMcpTools({\n  registerTool,\n  getActorUserId: () => ctx.userId,\n  resolveOpenTabRequest: ({ url, fournisseur_id, outil_slug, title }) =>\n    resolveBrandExternalTab({ url, fournisseur_id, outil_slug, title }),\n  toOpenTabParams: (resolved) => toDesktopOpenTabParams(resolved),\n  dispatchOpenTabAction,\n  getUserById,\n  getOwner,\n  includeOutilSlug: true,\n});\n```\n\nLe schema accepte `url`, `fournisseur_id`, `title`, `target_user_id`, et optionnellement `outil_slug`. Seul le compte principal owner peut cibler un autre utilisateur.\n\n### Admin MCP et UI\n\nExports admin :\n\n- `configureMcpAdmin`, `ensureMcpAdminSchema`\n- `listMcpToolPolicies`, `getMcpToolPolicy`, `updateMcpToolPolicy`\n- `listMcpClients`, `setMcpClientEnabled`, `revokeMcpClient`, `rotateMcpClientSecret`\n- `mcpAdminStatus`, `mcpDiagnostics`, `mcpMetrics`, `auditMcpAdmin`, `listMcpAuditLogs`, `exportMcpDiagnostics`\n- `createMcpAdminRoutes`\n- `seedMcpToolPolicies`, `isMcpAdminConfigured`\n\nGarde d'enforcement des policies (M1) — `admin/tool-policy-guard` :\n\n- `checkToolPolicy(name, actor, opts)` → `\"tool_disabled\" | \"role_forbidden\" | \"policy_scope_forbidden\" | null` (décision brute, réutilisable par l'enforcement marque) ;\n- `createToolPolicyAuthorize(opts)` → `McpAuthorizeToolCallFn` composable via `composeToolPolicies` avec `denyCrossLayerToolCall` (opt-in non cassant : sans `configureMcpAdmin`, autorise tout) ;\n- `registerGuardedMcpTool(server, ctx, def, config, handler, opts)` — wrapper serveur MCP SDK : annotations + policy + audit + vérif scopes marque injectée (`scopeAllows`).\n\nOptions injectables : `getPolicy` (défaut table `mcp_tool_policies`), `resolveRole` (rôle marque de l'acteur), `defaultRole` (défaut `collaborator`), `fullAccessScopes` (défaut `[\"crm\",\"full\"]`), `audit` (défaut `auditMcpAdmin`).\n\nCôté façade marque, `createBrandMcpFacade({ toolPolicyGuard: true })` active l'enforcement (M2) et seed des policies permissives pour les tools listés. Rôles/scopes acceptés par `updateMcpToolPolicy` sont dé-hardcodés via les adapters (`policyRoleNames`, `policyScopeNames` — défauts historiques).\n\nGate : `scripts/test-phase-mcp-tool-policy-guard.mjs`.\n\nUI :\n\n```tsx\nimport { McpAdminClient } from \"@creezio/mcp-facade/ui\";\n```\n\n## Flux / fonctionnement\n\n1. La marque cree ses tools metier namespacies (`module.<owner>.*`) et ses aliases legacy.\n2. `createBrandMcpFacade` regroupe core tools, modules et plugins.\n3. `listTools` applique `publicSurface` pour eviter alias + canonique en double.\n4. `callTool` resout l'alias vers le canonique, verifie le Bearer si necessaire, applique les policies, puis appelle le handler.\n5. Hono `/mcp` construit un serveur SDK, bind la façade, ajoute les host tools et traite le transport Streamable HTTP.\n\n### Les deux transports `/mcp` (câblés prod)\n\nDeux surfaces distinctes servent le MCP d'une app, avec la même façade\ncomme SoT des tools :\n\n1. **`/mcp` OAuth Hono** (`src/oauth/hono-app.ts`) — serveur MCP SDK\n   complet : OAuth 2.1/PKCE, clés API, transport Streamable HTTP avec\n   session. C'est la surface publique (clients MCP externes, tunnels).\n2. **`/mcp` du plane OS** (`listen-brand-os-http.ts` +\n   `mcp-jsonrpc.ts`, `@creezio/app-runtime`) — transport JSON simple\n   historique `{ok, tools}` / `{name, arguments}` **et** pont JSON-RPC 2.0\n   stateless sur la même URL (seuls les corps `jsonrpc:\"2.0\"` passent par\n   le pont) : c'est ce que consomme le client MCP natif de Hermes embarqué\n   (`skip_preflight: true`, sans session).\n\nNe pas « unifier » ces transports en en supprimant un : les clients\nexistants dépendent des deux formes.\n6. OAuth 2.1 gere en amont l'enregistrement client, l'autorisation utilisateur, le token exchange et les refresh tokens.\n7. Les tools host (`open_external_tab`, AI tasks ailleurs) restent dans le host runtime, pas dans la factory metier.\n\n## Intégration marques\n\nChecklist :\n\n1. Migrer les tables OAuth/admin MCP cote marque et fournir `getWriteDb` / `tableExists`.\n2. Configurer `configureMcpOAuth` avec secret JWT et URL publique resolue.\n3. Creer `createMcpOAuthRoutes` avec session, credentials et cookie injectes.\n4. Creer `createMcpHonoApp` avec transport, API key auth optionnelle et `buildMcpServer`.\n5. Remplacer les registries metier inline par `createBrandMcpFacade`.\n6. Mettre les handlers metier dans `mcp-tools.ts` et aliases dans `mcp-aliases.ts`.\n7. Utiliser `bindFacadeToolsToHono` dans Hono et la meme factory dans Electron/assistant.\n8. Ajouter les host tools explicitement apres la façade (`open_external_tab`, AI tasks via `@creezio/tasks`).\n9. Monter les routes admin MCP sous une protection owner.\n10. Supprimer ou reduire a des reexports/stubs les anciens fichiers locaux OAuth, CORS, rate-limit et app `/mcp`.\n\n## Dépendances @creezio/*\n\n| Dependance | Rôle |\n|---|---|\n| `@creezio/api-kernel` | API Kernel injecte a `createBrandMcpFacade`, `listMounts()` |\n| `@creezio/platform-core` | version architecture et helpers plateforme |\n\nInteractions importantes :\n\n- `@creezio/auth` fournit souvent session/cookie/credentials pour OAuth.\n- `@creezio/product-hub` peut fournir l'ACL plugins pour `createDenyUnauthorizedPluginToolPolicy`.\n- `@creezio/tasks` porte les host tools AI tasks, hors façade metier.\n- `@creezio/shell-ui` fournit des helpers de cookie/origin et l'UI admin d'app autour de `McpAdminClient`.\n\n## Voir aussi → AGENTS.md + docs/FILES.md\n\n- [`AGENTS.md`](./AGENTS.md) : consignes de modification pour agents.\n- [`docs/FILES.md`](./docs/FILES.md) : inventaire fichier par fichier des exports et responsabilites.\n","readmeFilename":"README.md"}