@creezio/mcp-facade 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +420 -0
- package/dist/.creezio-src-hash.json +4 -0
- package/dist/admin/adapters.d.ts +10 -0
- package/dist/admin/adapters.d.ts.map +1 -0
- package/dist/admin/adapters.js +21 -0
- package/dist/admin/adapters.js.map +1 -0
- package/dist/admin/http-routes.d.ts +11 -0
- package/dist/admin/http-routes.d.ts.map +1 -0
- package/dist/admin/http-routes.js +66 -0
- package/dist/admin/http-routes.js.map +1 -0
- package/dist/admin/index.d.ts +12 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +8 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/mcp-admin.d.ts +165 -0
- package/dist/admin/mcp-admin.d.ts.map +1 -0
- package/dist/admin/mcp-admin.js +419 -0
- package/dist/admin/mcp-admin.js.map +1 -0
- package/dist/admin/tool-policy-guard.d.ts +106 -0
- package/dist/admin/tool-policy-guard.d.ts.map +1 -0
- package/dist/admin/tool-policy-guard.js +187 -0
- package/dist/admin/tool-policy-guard.js.map +1 -0
- package/dist/admin/types.d.ts +62 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +6 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/brand-facade.d.ts +41 -0
- package/dist/brand-facade.d.ts.map +1 -0
- package/dist/brand-facade.js +67 -0
- package/dist/brand-facade.js.map +1 -0
- package/dist/core-tools.d.ts +22 -0
- package/dist/core-tools.d.ts.map +1 -0
- package/dist/core-tools.js +93 -0
- package/dist/core-tools.js.map +1 -0
- package/dist/dyn-import.d.ts +13 -0
- package/dist/dyn-import.d.ts.map +1 -0
- package/dist/dyn-import.js +2 -0
- package/dist/dyn-import.js.map +1 -0
- package/dist/facade.d.ts +40 -0
- package/dist/facade.d.ts.map +1 -0
- package/dist/facade.js +334 -0
- package/dist/facade.js.map +1 -0
- package/dist/hono-bind.d.ts +48 -0
- package/dist/hono-bind.d.ts.map +1 -0
- package/dist/hono-bind.js +70 -0
- package/dist/hono-bind.js.map +1 -0
- package/dist/hono-proxy.d.ts +63 -0
- package/dist/hono-proxy.d.ts.map +1 -0
- package/dist/hono-proxy.js +185 -0
- package/dist/hono-proxy.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +20 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +84 -0
- package/dist/jwt.js.map +1 -0
- package/dist/module-ops-tools.d.ts +43 -0
- package/dist/module-ops-tools.d.ts.map +1 -0
- package/dist/module-ops-tools.js +301 -0
- package/dist/module-ops-tools.js.map +1 -0
- package/dist/namespace.d.ts +23 -0
- package/dist/namespace.d.ts.map +1 -0
- package/dist/namespace.js +51 -0
- package/dist/namespace.js.map +1 -0
- package/dist/oauth/cors-policy.d.ts +3 -0
- package/dist/oauth/cors-policy.d.ts.map +1 -0
- package/dist/oauth/cors-policy.js +25 -0
- package/dist/oauth/cors-policy.js.map +1 -0
- package/dist/oauth/hono-app.d.ts +18 -0
- package/dist/oauth/hono-app.d.ts.map +1 -0
- package/dist/oauth/hono-app.js +175 -0
- package/dist/oauth/hono-app.js.map +1 -0
- package/dist/oauth/index.d.ts +9 -0
- package/dist/oauth/index.d.ts.map +1 -0
- package/dist/oauth/index.js +6 -0
- package/dist/oauth/index.js.map +1 -0
- package/dist/oauth/rate-limit.d.ts +11 -0
- package/dist/oauth/rate-limit.d.ts.map +1 -0
- package/dist/oauth/rate-limit.js +32 -0
- package/dist/oauth/rate-limit.js.map +1 -0
- package/dist/oauth/routes.d.ts +8 -0
- package/dist/oauth/routes.d.ts.map +1 -0
- package/dist/oauth/routes.js +671 -0
- package/dist/oauth/routes.js.map +1 -0
- package/dist/oauth/store.d.ts +113 -0
- package/dist/oauth/store.d.ts.map +1 -0
- package/dist/oauth/store.js +390 -0
- package/dist/oauth/store.js.map +1 -0
- package/dist/oauth/types.d.ts +97 -0
- package/dist/oauth/types.d.ts.map +1 -0
- package/dist/oauth/types.js +5 -0
- package/dist/oauth/types.js.map +1 -0
- package/dist/open-external-tab-host-tools.d.ts +67 -0
- package/dist/open-external-tab-host-tools.d.ts.map +1 -0
- package/dist/open-external-tab-host-tools.js +92 -0
- package/dist/open-external-tab-host-tools.js.map +1 -0
- package/dist/policy.d.ts +59 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +88 -0
- package/dist/policy.js.map +1 -0
- package/dist/runtime.d.ts +22 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +20 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +163 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist-cjs/admin/adapters.js +27 -0
- package/dist-cjs/admin/adapters.js.map +1 -0
- package/dist-cjs/admin/http-routes.js +69 -0
- package/dist-cjs/admin/http-routes.js.map +1 -0
- package/dist-cjs/admin/index.js +40 -0
- package/dist-cjs/admin/index.js.map +1 -0
- package/dist-cjs/admin/mcp-admin.js +441 -0
- package/dist-cjs/admin/mcp-admin.js.map +1 -0
- package/dist-cjs/admin/tool-policy-guard.js +193 -0
- package/dist-cjs/admin/tool-policy-guard.js.map +1 -0
- package/dist-cjs/admin/types.js +7 -0
- package/dist-cjs/admin/types.js.map +1 -0
- package/dist-cjs/brand-facade.js +70 -0
- package/dist-cjs/brand-facade.js.map +1 -0
- package/dist-cjs/core-tools.js +97 -0
- package/dist-cjs/core-tools.js.map +1 -0
- package/dist-cjs/dyn-import.js +5 -0
- package/dist-cjs/dyn-import.js.map +1 -0
- package/dist-cjs/facade.js +337 -0
- package/dist-cjs/facade.js.map +1 -0
- package/dist-cjs/hono-bind.js +74 -0
- package/dist-cjs/hono-bind.js.map +1 -0
- package/dist-cjs/hono-proxy.js +189 -0
- package/dist-cjs/hono-proxy.js.map +1 -0
- package/dist-cjs/index.js +120 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/jwt.js +91 -0
- package/dist-cjs/jwt.js.map +1 -0
- package/dist-cjs/module-ops-tools.js +308 -0
- package/dist-cjs/module-ops-tools.js.map +1 -0
- package/dist-cjs/namespace.js +56 -0
- package/dist-cjs/namespace.js.map +1 -0
- package/dist-cjs/oauth/cors-policy.js +29 -0
- package/dist-cjs/oauth/cors-policy.js.map +1 -0
- package/dist-cjs/oauth/hono-app.js +178 -0
- package/dist-cjs/oauth/hono-app.js.map +1 -0
- package/dist-cjs/oauth/index.js +48 -0
- package/dist-cjs/oauth/index.js.map +1 -0
- package/dist-cjs/oauth/rate-limit.js +37 -0
- package/dist-cjs/oauth/rate-limit.js.map +1 -0
- package/dist-cjs/oauth/routes.js +674 -0
- package/dist-cjs/oauth/routes.js.map +1 -0
- package/dist-cjs/oauth/store.js +418 -0
- package/dist-cjs/oauth/store.js.map +1 -0
- package/dist-cjs/oauth/types.js +6 -0
- package/dist-cjs/oauth/types.js.map +1 -0
- package/dist-cjs/open-external-tab-host-tools.js +96 -0
- package/dist-cjs/open-external-tab-host-tools.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/policy.js +93 -0
- package/dist-cjs/policy.js.map +1 -0
- package/dist-cjs/runtime.js +24 -0
- package/dist-cjs/runtime.js.map +1 -0
- package/dist-cjs/types.js +3 -0
- package/dist-cjs/types.js.map +1 -0
- package/package.json +92 -0
- package/ui/index.ts +5 -0
- package/ui/mcp-admin-client.tsx +270 -0
- package/ui/primitives/badge.tsx +37 -0
- package/ui/primitives/button.tsx +44 -0
- package/ui/primitives/card.tsx +44 -0
- package/ui/primitives/cn.ts +6 -0
- package/ui/primitives/input.tsx +19 -0
- package/ui/primitives/tabs.tsx +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# @creezio/mcp-facade
|
|
2
|
+
|
|
3
|
+
## Rôle
|
|
4
|
+
|
|
5
|
+
`@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`).
|
|
6
|
+
|
|
7
|
+
Le package couvre :
|
|
8
|
+
|
|
9
|
+
- registre dynamique de tools MCP ;
|
|
10
|
+
- namespaces `core.*` / `creezio.*`, `module.<ownerId>.*`, `plugin.<ownerId>.*` ;
|
|
11
|
+
- aliases legacy (`get_panier` -> `module.panier.get`) sans double exposition ;
|
|
12
|
+
- policies d'autorisation et deny cross-layer ;
|
|
13
|
+
- JWT Bearer minimal ;
|
|
14
|
+
- proxy Hono/Streamable HTTP ;
|
|
15
|
+
- OAuth 2.1 MCP avec PKCE, DCR, refresh rotation, well-known metadata et CORS/rate limit ;
|
|
16
|
+
- factory marque `createBrandMcpFacade` ;
|
|
17
|
+
- host tools plateforme dont `open_external_tab` ;
|
|
18
|
+
- admin MCP (policies, clients OAuth, diagnostics, routes et UI).
|
|
19
|
+
|
|
20
|
+
Surfaces publiees :
|
|
21
|
+
|
|
22
|
+
| Import | Usage |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `@creezio/mcp-facade` | façade, namespaces, JWT, OAuth, Hono, host tools, admin |
|
|
25
|
+
| `@creezio/mcp-facade/ui` | UI React admin MCP : `McpAdminClient` |
|
|
26
|
+
|
|
27
|
+
## Périmètre (kit vs marque)
|
|
28
|
+
|
|
29
|
+
Ce qui appartient au kit :
|
|
30
|
+
|
|
31
|
+
- la mécanique MCP commune (`listTools`, `listToolsBySpace`, `callTool`) ;
|
|
32
|
+
- le parsing et l'assertion des namespaces ;
|
|
33
|
+
- la surface publique et les aliases ;
|
|
34
|
+
- les tools coeur `creezio.*` / `core.*` exposes par `createCoreMcpTools` ;
|
|
35
|
+
- le proxy Hono et le binding `bindFacadeToolsToHono` ;
|
|
36
|
+
- OAuth MCP : clients, authorization codes, access/refresh tokens, PKCE S256, scopes, routes, metadata ;
|
|
37
|
+
- le host tool generique `open_external_tab` ;
|
|
38
|
+
- admin MCP : policies, clients, audit/metrics/diagnostics ;
|
|
39
|
+
- UI admin generique.
|
|
40
|
+
|
|
41
|
+
Ce qui reste dans la marque :
|
|
42
|
+
|
|
43
|
+
- handlers metier (`mcp-tools.ts`) : panier, GED, VASP, dossiers, catalogue, etc. ;
|
|
44
|
+
- aliases publics historiques (`mcp-aliases.ts`) ;
|
|
45
|
+
- resolution API Kernel et mounts metier ;
|
|
46
|
+
- session/cookie/auth utilisateur injectes dans OAuth ;
|
|
47
|
+
- DB concrete, migrations et secret JWT ;
|
|
48
|
+
- resolution d'URL metier pour `open_external_tab` ;
|
|
49
|
+
- host tools non MCP-metier : desktop, AI tasks, dispatch vers utilisateurs ;
|
|
50
|
+
- transport concret `StreamableHTTPTransport` et `buildMcpServer`.
|
|
51
|
+
|
|
52
|
+
Regle 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.
|
|
53
|
+
|
|
54
|
+
## Installation / build
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install
|
|
58
|
+
npm run build -w @creezio/mcp-facade
|
|
59
|
+
npm run typecheck -w @creezio/mcp-facade
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Artefacts :
|
|
63
|
+
|
|
64
|
+
- ESM : `dist/`
|
|
65
|
+
- CJS Electron : `dist-cjs/`
|
|
66
|
+
- UI source : `ui/`
|
|
67
|
+
|
|
68
|
+
Dependances directes : `@creezio/api-kernel`, `@creezio/platform-core`, `hono`, `jose`, `zod`. Les dependances React/UI sont optionnelles et ne concernent que `./ui`.
|
|
69
|
+
|
|
70
|
+
## Configuration
|
|
71
|
+
|
|
72
|
+
### Façade de base
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { createMcpFacade } from "@creezio/mcp-facade";
|
|
76
|
+
|
|
77
|
+
const facade = createMcpFacade({
|
|
78
|
+
jwtSecret: process.env.MCP_JWT_SECRET,
|
|
79
|
+
publicSurface: "legacy-preferred",
|
|
80
|
+
aliases: {
|
|
81
|
+
get_panier: "module.panier.get",
|
|
82
|
+
},
|
|
83
|
+
discoverToolsBySpace: async () => ({
|
|
84
|
+
module: await discoverModuleTools(),
|
|
85
|
+
plugin: await discoverPluginTools(),
|
|
86
|
+
}),
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`publicSurface` :
|
|
91
|
+
|
|
92
|
+
| Mode | Effet |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `legacy-preferred` | defaut ; expose l'alias legacy et masque le canonique correspondant |
|
|
95
|
+
| `canonical` | expose uniquement les noms namespaces |
|
|
96
|
+
| `both` | expose alias + canonique ; utile en debug, deconseille en production |
|
|
97
|
+
|
|
98
|
+
### Namespaces
|
|
99
|
+
|
|
100
|
+
Namespaces valides :
|
|
101
|
+
|
|
102
|
+
- `creezio.*` ou `core.*` : coeur reserve au kit ;
|
|
103
|
+
- `module.<ownerId>.*` : modules metier de la marque ;
|
|
104
|
+
- `plugin.<ownerId>.*` : plugins/sidecars rattaches a une organisation ou un owner plugin.
|
|
105
|
+
|
|
106
|
+
`ownerId` doit commencer par une lettre et contenir uniquement lettres, chiffres, `_` ou `-`, longueur max 63.
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import {
|
|
110
|
+
assertNamespacedToolName,
|
|
111
|
+
parseNamespacedToolName,
|
|
112
|
+
} from "@creezio/mcp-facade";
|
|
113
|
+
|
|
114
|
+
const parsed = parseNamespacedToolName("module.panier.get");
|
|
115
|
+
// { space: "module", ownerId: "panier", rest: "get" }
|
|
116
|
+
|
|
117
|
+
assertNamespacedToolName("module", "module.panier.get", "panier");
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Les aliases legacy (`get_panier`) ne passent pas `assertNamespacedToolName`; ils doivent etre declares via `aliases` ou `registerAlias`.
|
|
121
|
+
|
|
122
|
+
### OAuth + `/mcp`
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import {
|
|
126
|
+
configureMcpOAuth,
|
|
127
|
+
createMcpHonoApp,
|
|
128
|
+
createMcpOAuthRoutes,
|
|
129
|
+
ensureMcpAdminSchema,
|
|
130
|
+
resolveMcpCorsOrigin,
|
|
131
|
+
} from "@creezio/mcp-facade";
|
|
132
|
+
import { StreamableHTTPTransport } from "@hono/mcp";
|
|
133
|
+
|
|
134
|
+
configureMcpOAuth({
|
|
135
|
+
getWriteDb,
|
|
136
|
+
tableExists,
|
|
137
|
+
getJwtSecret: () => process.env.MCP_JWT_SECRET!,
|
|
138
|
+
resolvePublicUrl: () =>
|
|
139
|
+
process.env.MCP_PUBLIC_URL ||
|
|
140
|
+
process.env.APP_PUBLIC_URL ||
|
|
141
|
+
process.env.APP_BASE_URL ||
|
|
142
|
+
null,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const oauthRoutes = createMcpOAuthRoutes({
|
|
146
|
+
productName: "Ma Marque CRM",
|
|
147
|
+
resourceName: "Ma Marque CRM MCP",
|
|
148
|
+
consentScopesHtml: "<li>Lire et executer les tools autorises</li>",
|
|
149
|
+
session: {
|
|
150
|
+
getSessionFromContext,
|
|
151
|
+
authenticateUser,
|
|
152
|
+
validateCredentials,
|
|
153
|
+
getOwnerId: () => getOwner()?.id ?? null,
|
|
154
|
+
createSessionCookie,
|
|
155
|
+
},
|
|
156
|
+
resolveCookieSecure,
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
export const mcpApp = createMcpHonoApp({
|
|
160
|
+
oauthRoutes,
|
|
161
|
+
ensureSchema: ensureMcpAdminSchema,
|
|
162
|
+
resolveCorsOrigin: resolveMcpCorsOrigin,
|
|
163
|
+
apiKeyAuth: {
|
|
164
|
+
prefix: "brand_live_",
|
|
165
|
+
verify: verifyApiKey,
|
|
166
|
+
resolveUserId: (key) => key.user_id || getOwner()?.id || null,
|
|
167
|
+
},
|
|
168
|
+
createTransport: () =>
|
|
169
|
+
new StreamableHTTPTransport({
|
|
170
|
+
sessionIdGenerator: undefined,
|
|
171
|
+
enableJsonResponse: true,
|
|
172
|
+
}),
|
|
173
|
+
buildMcpServer,
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Routes OAuth exposees par le kit :
|
|
178
|
+
|
|
179
|
+
- `GET /.well-known/oauth-authorization-server`
|
|
180
|
+
- `GET /.well-known/oauth-protected-resource`
|
|
181
|
+
- `POST /oauth/register`
|
|
182
|
+
- `GET /oauth/authorize`
|
|
183
|
+
- `POST /oauth/authorize`
|
|
184
|
+
- `POST /oauth/token`
|
|
185
|
+
- `ALL /mcp` via `createMcpHonoApp`
|
|
186
|
+
|
|
187
|
+
Scopes : `MCP_SCOPE`, `MCP_SCOPE_LEGACY`, `MCP_SCOPE_READ`, `MCP_SCOPE_WRITE`, `MCP_SCOPES`.
|
|
188
|
+
|
|
189
|
+
## API publique (exports + exemples)
|
|
190
|
+
|
|
191
|
+
### Façade MCP
|
|
192
|
+
|
|
193
|
+
Exports principaux :
|
|
194
|
+
|
|
195
|
+
- `createMcpFacade`, type `McpFacade`
|
|
196
|
+
- types : `McpToolDefinition`, `McpRegisteredTool`, `McpToolHandler`, `McpToolCallResult`, `McpToolSpace`
|
|
197
|
+
- `listTools`, `listToolsBySpace`, `callTool`, `registerTool`, `registerAlias`
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
const mcp = createMcpFacade({
|
|
201
|
+
allowUnauthenticated: true,
|
|
202
|
+
discoverToolsBySpace: async () => ({
|
|
203
|
+
module: [
|
|
204
|
+
{
|
|
205
|
+
name: "module.notes.create",
|
|
206
|
+
description: "Cree une note",
|
|
207
|
+
space: "module",
|
|
208
|
+
ownerId: "notes",
|
|
209
|
+
handler: async (args) => ({ ok: true, content: args }),
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
}),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
await mcp.callTool("module.notes.create", { title: "Hello" });
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Factory marque
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
import { createBrandMcpFacade } from "@creezio/mcp-facade";
|
|
222
|
+
import { BRAND_MCP_ALIASES } from "./mcp-aliases";
|
|
223
|
+
import { createBrandModuleMcpTools } from "./mcp-tools";
|
|
224
|
+
|
|
225
|
+
export function createMyBrandMcp(api, options = {}) {
|
|
226
|
+
return createBrandMcpFacade({
|
|
227
|
+
api,
|
|
228
|
+
aliases: BRAND_MCP_ALIASES,
|
|
229
|
+
discoverModuleTools: createBrandModuleMcpTools,
|
|
230
|
+
discoverPluginTools: createBrandPluginTools,
|
|
231
|
+
publicSurface: "legacy-preferred",
|
|
232
|
+
...options,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
`createBrandMcpFacade` configure par defaut :
|
|
238
|
+
|
|
239
|
+
- `allowUnauthenticated: true` pour compat runtime local ;
|
|
240
|
+
- `enforceNamespaces: true` ;
|
|
241
|
+
- `defaultCrossLayerDeny: true` ;
|
|
242
|
+
- `listApiMounts: () => api.listMounts()` ;
|
|
243
|
+
- tools `module.*` générés depuis `api.listOperations()` (handler = `api.handle`) ;
|
|
244
|
+
- `discoverModuleTools` optionnel = hook apps (extras / JWT) — SoT = `operations[]`, `mcpTools` n'existe plus.
|
|
245
|
+
|
|
246
|
+
### Hono / SDK MCP
|
|
247
|
+
|
|
248
|
+
Exports principaux :
|
|
249
|
+
|
|
250
|
+
- `bindFacadeToolsToHono`
|
|
251
|
+
- `mcpFacadeResultToSdk`
|
|
252
|
+
- `wrapMcpFacadeWithHonoProxy`
|
|
253
|
+
- `MCP_PRODUCT_EXECUTOR`, `resolveMcpFacadeRole`
|
|
254
|
+
|
|
255
|
+
```ts
|
|
256
|
+
import { bindFacadeToolsToHono } from "@creezio/mcp-facade";
|
|
257
|
+
|
|
258
|
+
export async function buildMcpServer(ctx) {
|
|
259
|
+
const server = createSdkMcpServer();
|
|
260
|
+
const facade = createMyBrandMcp(api, { publicSurface: "canonical" });
|
|
261
|
+
await bindFacadeToolsToHono(facade, server.registerTool.bind(server), {
|
|
262
|
+
bearerToken: ctx.accessToken,
|
|
263
|
+
});
|
|
264
|
+
registerHostTools(server, ctx);
|
|
265
|
+
return server;
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### JWT, policies et ACL
|
|
270
|
+
|
|
271
|
+
Exports principaux :
|
|
272
|
+
|
|
273
|
+
- `signMcpJwt`, `verifyMcpBearer`
|
|
274
|
+
- `composeToolPolicies`, `denyCrossLayerToolCall`, `createDenyUnauthorizedPluginToolPolicy`
|
|
275
|
+
- types `McpAuthorizeContext`, `McpToolPolicyDecision`
|
|
276
|
+
|
|
277
|
+
```ts
|
|
278
|
+
const authorize = composeToolPolicies(
|
|
279
|
+
denyCrossLayerToolCall,
|
|
280
|
+
async (ctx) => {
|
|
281
|
+
if (ctx.space === "plugin" && !ctx.orgId) {
|
|
282
|
+
return { allow: false, reason: "missing_org" };
|
|
283
|
+
}
|
|
284
|
+
return { allow: true };
|
|
285
|
+
},
|
|
286
|
+
);
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### OAuth store et routes
|
|
290
|
+
|
|
291
|
+
Exports principaux :
|
|
292
|
+
|
|
293
|
+
- `configureMcpOAuth`, `getMcpOAuthAdapters`, `mcpOauthReady`
|
|
294
|
+
- `registerClient`, `getClient`, `verifyClientSecret`
|
|
295
|
+
- `createAuthCode`, `peekAuthCode`, `consumeAuthCode`, `verifyPkceS256`
|
|
296
|
+
- `createRefreshToken`, `rotateRefreshToken`
|
|
297
|
+
- `signAccessToken`, `verifyAccessToken`
|
|
298
|
+
- `resolveMcpPublicUrl`, `mcpBaseUrl`, `mcpResourceUrl`, `resourceAcceptable`
|
|
299
|
+
- `checkMcpRateLimit`, `rateLimitHeaders`, `resolveMcpCorsOrigin`
|
|
300
|
+
- `createMcpOAuthRoutes`, `createMcpHonoApp`
|
|
301
|
+
|
|
302
|
+
La DB est injectee via `McpOAuthAdapters`; le kit ne choisit pas le fichier SQLite.
|
|
303
|
+
|
|
304
|
+
### Host tools plateforme
|
|
305
|
+
|
|
306
|
+
`CREEZIO_PLATFORM_HOST_MCP_TOOL_NAMES` contient :
|
|
307
|
+
|
|
308
|
+
- `open_external_tab`
|
|
309
|
+
- `list_tools_by_space`
|
|
310
|
+
|
|
311
|
+
`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.
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
import { createOpenExternalTabHostMcpTools } from "@creezio/mcp-facade";
|
|
315
|
+
|
|
316
|
+
createOpenExternalTabHostMcpTools({
|
|
317
|
+
registerTool,
|
|
318
|
+
getActorUserId: () => ctx.userId,
|
|
319
|
+
resolveOpenTabRequest: ({ url, fournisseur_id, outil_slug, title }) =>
|
|
320
|
+
resolveBrandExternalTab({ url, fournisseur_id, outil_slug, title }),
|
|
321
|
+
toOpenTabParams: (resolved) => toDesktopOpenTabParams(resolved),
|
|
322
|
+
dispatchOpenTabAction,
|
|
323
|
+
getUserById,
|
|
324
|
+
getOwner,
|
|
325
|
+
includeOutilSlug: true,
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Le schema accepte `url`, `fournisseur_id`, `title`, `target_user_id`, et optionnellement `outil_slug`. Seul le compte principal owner peut cibler un autre utilisateur.
|
|
330
|
+
|
|
331
|
+
### Admin MCP et UI
|
|
332
|
+
|
|
333
|
+
Exports admin :
|
|
334
|
+
|
|
335
|
+
- `configureMcpAdmin`, `ensureMcpAdminSchema`
|
|
336
|
+
- `listMcpToolPolicies`, `getMcpToolPolicy`, `updateMcpToolPolicy`
|
|
337
|
+
- `listMcpClients`, `setMcpClientEnabled`, `revokeMcpClient`, `rotateMcpClientSecret`
|
|
338
|
+
- `mcpAdminStatus`, `mcpDiagnostics`, `mcpMetrics`, `auditMcpAdmin`, `listMcpAuditLogs`, `exportMcpDiagnostics`
|
|
339
|
+
- `createMcpAdminRoutes`
|
|
340
|
+
- `seedMcpToolPolicies`, `isMcpAdminConfigured`
|
|
341
|
+
|
|
342
|
+
Garde d'enforcement des policies (M1) — `admin/tool-policy-guard` :
|
|
343
|
+
|
|
344
|
+
- `checkToolPolicy(name, actor, opts)` → `"tool_disabled" | "role_forbidden" | "policy_scope_forbidden" | null` (décision brute, réutilisable par l'enforcement marque) ;
|
|
345
|
+
- `createToolPolicyAuthorize(opts)` → `McpAuthorizeToolCallFn` composable via `composeToolPolicies` avec `denyCrossLayerToolCall` (opt-in non cassant : sans `configureMcpAdmin`, autorise tout) ;
|
|
346
|
+
- `registerGuardedMcpTool(server, ctx, def, config, handler, opts)` — wrapper serveur MCP SDK : annotations + policy + audit + vérif scopes marque injectée (`scopeAllows`).
|
|
347
|
+
|
|
348
|
+
Options 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`).
|
|
349
|
+
|
|
350
|
+
Cô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).
|
|
351
|
+
|
|
352
|
+
Gate : `scripts/test-phase-mcp-tool-policy-guard.mjs`.
|
|
353
|
+
|
|
354
|
+
UI :
|
|
355
|
+
|
|
356
|
+
```tsx
|
|
357
|
+
import { McpAdminClient } from "@creezio/mcp-facade/ui";
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## Flux / fonctionnement
|
|
361
|
+
|
|
362
|
+
1. La marque cree ses tools metier namespacies (`module.<owner>.*`) et ses aliases legacy.
|
|
363
|
+
2. `createBrandMcpFacade` regroupe core tools, modules et plugins.
|
|
364
|
+
3. `listTools` applique `publicSurface` pour eviter alias + canonique en double.
|
|
365
|
+
4. `callTool` resout l'alias vers le canonique, verifie le Bearer si necessaire, applique les policies, puis appelle le handler.
|
|
366
|
+
5. Hono `/mcp` construit un serveur SDK, bind la façade, ajoute les host tools et traite le transport Streamable HTTP.
|
|
367
|
+
|
|
368
|
+
### Les deux transports `/mcp` (câblés prod)
|
|
369
|
+
|
|
370
|
+
Deux surfaces distinctes servent le MCP d'une app, avec la même façade
|
|
371
|
+
comme SoT des tools :
|
|
372
|
+
|
|
373
|
+
1. **`/mcp` OAuth Hono** (`src/oauth/hono-app.ts`) — serveur MCP SDK
|
|
374
|
+
complet : OAuth 2.1/PKCE, clés API, transport Streamable HTTP avec
|
|
375
|
+
session. C'est la surface publique (clients MCP externes, tunnels).
|
|
376
|
+
2. **`/mcp` du plane OS** (`listen-brand-os-http.ts` +
|
|
377
|
+
`mcp-jsonrpc.ts`, `@creezio/app-runtime`) — transport JSON simple
|
|
378
|
+
historique `{ok, tools}` / `{name, arguments}` **et** pont JSON-RPC 2.0
|
|
379
|
+
stateless sur la même URL (seuls les corps `jsonrpc:"2.0"` passent par
|
|
380
|
+
le pont) : c'est ce que consomme le client MCP natif de Hermes embarqué
|
|
381
|
+
(`skip_preflight: true`, sans session).
|
|
382
|
+
|
|
383
|
+
Ne pas « unifier » ces transports en en supprimant un : les clients
|
|
384
|
+
existants dépendent des deux formes.
|
|
385
|
+
6. OAuth 2.1 gere en amont l'enregistrement client, l'autorisation utilisateur, le token exchange et les refresh tokens.
|
|
386
|
+
7. Les tools host (`open_external_tab`, AI tasks ailleurs) restent dans le host runtime, pas dans la factory metier.
|
|
387
|
+
|
|
388
|
+
## Intégration marques
|
|
389
|
+
|
|
390
|
+
Checklist :
|
|
391
|
+
|
|
392
|
+
1. Migrer les tables OAuth/admin MCP cote marque et fournir `getWriteDb` / `tableExists`.
|
|
393
|
+
2. Configurer `configureMcpOAuth` avec secret JWT et URL publique resolue.
|
|
394
|
+
3. Creer `createMcpOAuthRoutes` avec session, credentials et cookie injectes.
|
|
395
|
+
4. Creer `createMcpHonoApp` avec transport, API key auth optionnelle et `buildMcpServer`.
|
|
396
|
+
5. Remplacer les registries metier inline par `createBrandMcpFacade`.
|
|
397
|
+
6. Mettre les handlers metier dans `mcp-tools.ts` et aliases dans `mcp-aliases.ts`.
|
|
398
|
+
7. Utiliser `bindFacadeToolsToHono` dans Hono et la meme factory dans Electron/assistant.
|
|
399
|
+
8. Ajouter les host tools explicitement apres la façade (`open_external_tab`, AI tasks via `@creezio/tasks`).
|
|
400
|
+
9. Monter les routes admin MCP sous une protection owner.
|
|
401
|
+
10. Supprimer ou reduire a des reexports/stubs les anciens fichiers locaux OAuth, CORS, rate-limit et app `/mcp`.
|
|
402
|
+
|
|
403
|
+
## Dépendances @creezio/*
|
|
404
|
+
|
|
405
|
+
| Dependance | Rôle |
|
|
406
|
+
|---|---|
|
|
407
|
+
| `@creezio/api-kernel` | API Kernel injecte a `createBrandMcpFacade`, `listMounts()` |
|
|
408
|
+
| `@creezio/platform-core` | version architecture et helpers plateforme |
|
|
409
|
+
|
|
410
|
+
Interactions importantes :
|
|
411
|
+
|
|
412
|
+
- `@creezio/auth` fournit souvent session/cookie/credentials pour OAuth.
|
|
413
|
+
- `@creezio/product-hub` peut fournir l'ACL plugins pour `createDenyUnauthorizedPluginToolPolicy`.
|
|
414
|
+
- `@creezio/tasks` porte les host tools AI tasks, hors façade metier.
|
|
415
|
+
- `@creezio/shell-ui` fournit des helpers de cookie/origin et l'UI admin d'app autour de `McpAdminClient`.
|
|
416
|
+
|
|
417
|
+
## Voir aussi → AGENTS.md + docs/FILES.md
|
|
418
|
+
|
|
419
|
+
- [`AGENTS.md`](./AGENTS.md) : consignes de modification pour agents.
|
|
420
|
+
- [`docs/FILES.md`](./docs/FILES.md) : inventaire fichier par fichier des exports et responsabilites.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injection host pour mcp-admin (évite imports `@/` marque).
|
|
3
|
+
*/
|
|
4
|
+
import type { McpAdminAdapters } from "./types.js";
|
|
5
|
+
export declare function configureMcpAdmin(next: McpAdminAdapters): void;
|
|
6
|
+
export declare function getMcpAdminAdapters(): McpAdminAdapters;
|
|
7
|
+
/** True si `configureMcpAdmin` a été câblé (garde opt-in non cassante). */
|
|
8
|
+
export declare function isMcpAdminConfigured(): boolean;
|
|
9
|
+
export declare function resetMcpAdminAdaptersForTests(): void;
|
|
10
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/admin/adapters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAE9D;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAOtD;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injection host pour mcp-admin (évite imports `@/` marque).
|
|
3
|
+
*/
|
|
4
|
+
let adapters = null;
|
|
5
|
+
export function configureMcpAdmin(next) {
|
|
6
|
+
adapters = next;
|
|
7
|
+
}
|
|
8
|
+
export function getMcpAdminAdapters() {
|
|
9
|
+
if (!adapters) {
|
|
10
|
+
throw new Error("@creezio/mcp-admin: configureMcpAdmin({ getDb, getWriteDb, … }) requis avant usage");
|
|
11
|
+
}
|
|
12
|
+
return adapters;
|
|
13
|
+
}
|
|
14
|
+
/** True si `configureMcpAdmin` a été câblé (garde opt-in non cassante). */
|
|
15
|
+
export function isMcpAdminConfigured() {
|
|
16
|
+
return adapters !== null;
|
|
17
|
+
}
|
|
18
|
+
export function resetMcpAdminAdaptersForTests() {
|
|
19
|
+
adapters = null;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/admin/adapters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,IAAI,QAAQ,GAA4B,IAAI,CAAC;AAE7C,MAAM,UAAU,iBAAiB,CAAC,IAAsB;IACtD,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routes Hono Admin MCP (port TempoFlow — N6).
|
|
3
|
+
* Auth owner reste côté marque (montage sous /admin).
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from "hono";
|
|
6
|
+
export type CreateMcpAdminRoutesOptions = {
|
|
7
|
+
/** Préfixe filename export (sinon adapters.diagnosticFilenamePrefix || creezio). */
|
|
8
|
+
diagnosticFilenamePrefix?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function createMcpAdminRoutes(opts?: CreateMcpAdminRoutesOptions): Hono;
|
|
11
|
+
//# sourceMappingURL=http-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-routes.d.ts","sourceRoot":"","sources":["../../src/admin/http-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgB5B,MAAM,MAAM,2BAA2B,GAAG;IACxC,oFAAoF;IACpF,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,GAAE,2BAAgC,GACrC,IAAI,CA0EN"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routes Hono Admin MCP (port TempoFlow — N6).
|
|
3
|
+
* Auth owner reste côté marque (montage sous /admin).
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from "hono";
|
|
6
|
+
import { listMcpClients, listMcpAuditLogs, listMcpToolPolicies, mcpAdminStatus, mcpDiagnostics, mcpMetrics, revokeMcpClient, rotateMcpClientSecret, setMcpClientEnabled, updateMcpToolPolicy, exportMcpDiagnostics, } from "./mcp-admin.js";
|
|
7
|
+
import { getMcpAdminAdapters } from "./adapters.js";
|
|
8
|
+
export function createMcpAdminRoutes(opts = {}) {
|
|
9
|
+
const app = new Hono();
|
|
10
|
+
app.get("/mcp/status", (c) => c.json(mcpAdminStatus()));
|
|
11
|
+
app.get("/mcp/tools", (c) => c.json({ tools: listMcpToolPolicies() }));
|
|
12
|
+
app.get("/mcp/clients", (c) => c.json({ clients: listMcpClients() }));
|
|
13
|
+
app.get("/mcp/diagnostics", (c) => c.json(mcpDiagnostics()));
|
|
14
|
+
app.get("/mcp/metrics", (c) => c.json(mcpMetrics()));
|
|
15
|
+
app.get("/mcp/audit-logs", (c) => c.json({ logs: listMcpAuditLogs(Number(c.req.query("limit")) || 200) }));
|
|
16
|
+
app.get("/mcp/diagnostics/export", (c) => {
|
|
17
|
+
const prefix = opts.diagnosticFilenamePrefix ||
|
|
18
|
+
getMcpAdminAdapters().diagnosticFilenamePrefix ||
|
|
19
|
+
"creezio";
|
|
20
|
+
c.header("Content-Disposition", `attachment; filename="${prefix}-mcp-diagnostic-${new Date().toISOString().slice(0, 10)}.json"`);
|
|
21
|
+
return c.json(exportMcpDiagnostics());
|
|
22
|
+
});
|
|
23
|
+
app.patch("/mcp/policies/:tool", async (c) => {
|
|
24
|
+
let body;
|
|
25
|
+
try {
|
|
26
|
+
body = await c.req.json();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return c.json({ error: "JSON attendu" }, 400);
|
|
30
|
+
}
|
|
31
|
+
const policy = updateMcpToolPolicy(c.req.param("tool"), body);
|
|
32
|
+
if (!policy)
|
|
33
|
+
return c.json({ error: "Tool inconnu" }, 404);
|
|
34
|
+
return c.json({ policy });
|
|
35
|
+
});
|
|
36
|
+
app.patch("/mcp/clients/:clientId", async (c) => {
|
|
37
|
+
let body;
|
|
38
|
+
try {
|
|
39
|
+
body = await c.req.json();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return c.json({ error: "JSON attendu" }, 400);
|
|
43
|
+
}
|
|
44
|
+
if (typeof body.enabled !== "boolean") {
|
|
45
|
+
return c.json({ error: "enabled booléen requis" }, 400);
|
|
46
|
+
}
|
|
47
|
+
const ok = setMcpClientEnabled(c.req.param("clientId"), body.enabled);
|
|
48
|
+
return ok ? c.json({ ok: true }) : c.json({ error: "Client introuvable" }, 404);
|
|
49
|
+
});
|
|
50
|
+
app.delete("/mcp/clients/:clientId", (c) => {
|
|
51
|
+
const ok = revokeMcpClient(c.req.param("clientId"));
|
|
52
|
+
return ok ? c.json({ ok: true }) : c.json({ error: "Client introuvable" }, 404);
|
|
53
|
+
});
|
|
54
|
+
app.post("/mcp/clients/:clientId/rotate-secret", (c) => {
|
|
55
|
+
const result = rotateMcpClientSecret(c.req.param("clientId"));
|
|
56
|
+
if (!result) {
|
|
57
|
+
return c.json({ error: "Client introuvable, révoqué ou public (sans secret)" }, 400);
|
|
58
|
+
}
|
|
59
|
+
return c.json({
|
|
60
|
+
clientSecret: result.clientSecret,
|
|
61
|
+
warning: "Ce secret ne sera plus affiché. Les refresh tokens précédents sont révoqués.",
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
return app;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=http-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-routes.js","sourceRoot":"","sources":["../../src/admin/http-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP admin — policies, clients OAuth, diagnostics, routes Hono (N6).
|
|
3
|
+
*/
|
|
4
|
+
export type { McpAdminAdapters, McpAdminSqliteDatabase, McpAdminSqliteStatement, McpRequestLogEntry, McpToolDefinition, } from "./types.js";
|
|
5
|
+
export { configureMcpAdmin, getMcpAdminAdapters, isMcpAdminConfigured, resetMcpAdminAdaptersForTests, } from "./adapters.js";
|
|
6
|
+
export type { McpToolPolicy, McpAdminClient, } from "./mcp-admin.js";
|
|
7
|
+
export { ensureMcpAdminSchema, seedMcpToolPolicies, listMcpToolPolicies, getMcpToolPolicy, disabledMcpToolPolicyNames, filterListedToolsByEnabledPolicy, updateMcpToolPolicy, listMcpClients, setMcpClientEnabled, revokeMcpClient, rotateMcpClientSecret, clientCanAuthenticate, touchMcpClient, mcpAdminStatus, mcpDiagnostics, mcpMetrics, auditMcpAdmin, listMcpAuditLogs, pruneMcpAuditLogs, exportMcpDiagnostics, } from "./mcp-admin.js";
|
|
8
|
+
export type { CreateMcpAdminRoutesOptions } from "./http-routes.js";
|
|
9
|
+
export { createMcpAdminRoutes } from "./http-routes.js";
|
|
10
|
+
export type { CreateToolPolicyAuthorizeOptions, GuardedMcpServerLike, GuardedMcpToolContext, GuardedMcpToolDefinition, RegisterGuardedMcpToolOptions, ToolPolicyActor, ToolPolicyDenialReason, ToolPolicyGuardOptions, ToolPolicyView, } from "./tool-policy-guard.js";
|
|
11
|
+
export { checkToolPolicy, createToolPolicyAuthorize, getStoredMcpToolPolicy, registerGuardedMcpTool, } from "./tool-policy-guard.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,gCAAgC,EAChC,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,cAAc,EACd,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIxD,YAAY,EACV,gCAAgC,EAChC,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,6BAA6B,EAC7B,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP admin — policies, clients OAuth, diagnostics, routes Hono (N6).
|
|
3
|
+
*/
|
|
4
|
+
export { configureMcpAdmin, getMcpAdminAdapters, isMcpAdminConfigured, resetMcpAdminAdaptersForTests, } from "./adapters.js";
|
|
5
|
+
export { ensureMcpAdminSchema, seedMcpToolPolicies, listMcpToolPolicies, getMcpToolPolicy, disabledMcpToolPolicyNames, filterListedToolsByEnabledPolicy, updateMcpToolPolicy, listMcpClients, setMcpClientEnabled, revokeMcpClient, rotateMcpClientSecret, clientCanAuthenticate, touchMcpClient, mcpAdminStatus, mcpDiagnostics, mcpMetrics, auditMcpAdmin, listMcpAuditLogs, pruneMcpAuditLogs, exportMcpDiagnostics, } from "./mcp-admin.js";
|
|
6
|
+
export { createMcpAdminRoutes } from "./http-routes.js";
|
|
7
|
+
export { checkToolPolicy, createToolPolicyAuthorize, getStoredMcpToolPolicy, registerGuardedMcpTool, } from "./tool-policy-guard.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,gCAAgC,EAChC,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,cAAc,EACd,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAexD,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
|