@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
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Garde d'enforcement réutilisable des policies MCP admin (M1).
|
|
3
|
+
*
|
|
4
|
+
* Trois surfaces, pour trois points d'entrée :
|
|
5
|
+
* - `checkToolPolicy` : décision brute (enabled/rôles/scopes) —
|
|
6
|
+
* utilisable par n'importe quel enforcement
|
|
7
|
+
* marque (ex. TF3 `registerMcpTool`) ;
|
|
8
|
+
* - `createToolPolicyAuthorize`: `McpAuthorizeToolCallFn` composable avec
|
|
9
|
+
* `composeToolPolicies` / `denyCrossLayerToolCall`
|
|
10
|
+
* pour la façade (`createBrandMcpFacade`) ;
|
|
11
|
+
* - `registerGuardedMcpTool` : wrapper serveur MCP SDK — annotations +
|
|
12
|
+
* policy + audit + scopes marque injectés.
|
|
13
|
+
*
|
|
14
|
+
* Aucune donnée marque : la résolution du rôle (`resolveRole`) et la logique
|
|
15
|
+
* scopes marque (`scopeAllows`) sont injectées. Les policies vivent dans la
|
|
16
|
+
* table `mcp_tool_policies` (adapters `configureMcpAdmin`) — mêmes lignes que
|
|
17
|
+
* la page /admin/mcp.
|
|
18
|
+
*/
|
|
19
|
+
import type { McpAuthorizeContext, McpAuthorizeToolCallFn } from "../types.js";
|
|
20
|
+
import { auditMcpAdmin } from "./mcp-admin.js";
|
|
21
|
+
export type ToolPolicyDenialReason = "tool_disabled" | "role_forbidden" | "policy_scope_forbidden";
|
|
22
|
+
/** Vue minimale d'une policy — ce que la garde consomme. */
|
|
23
|
+
export type ToolPolicyView = {
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
allowedRoles: string[];
|
|
26
|
+
allowedScopes: string[];
|
|
27
|
+
};
|
|
28
|
+
export type ToolPolicyActor = {
|
|
29
|
+
userId?: string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Scopes accordés à l'acteur (string séparée espaces/virgules ou tableau).
|
|
32
|
+
* `null`/`undefined` = pas de modèle de scopes sur ce canal → la garde ne
|
|
33
|
+
* vérifie pas les scopes (les canaux OAuth/API key doivent passer `""` au
|
|
34
|
+
* minimum pour forcer la vérification).
|
|
35
|
+
*/
|
|
36
|
+
scopes?: string | readonly string[] | null;
|
|
37
|
+
};
|
|
38
|
+
export type ToolPolicyGuardOptions = {
|
|
39
|
+
/** Résolution de la policy (défaut : table `mcp_tool_policies` des adapters). */
|
|
40
|
+
getPolicy?: (name: string) => ToolPolicyView | null | undefined;
|
|
41
|
+
/** Rôle de l'acteur (injecté par la marque — ex. getUserById(id)?.role). */
|
|
42
|
+
resolveRole?: (userId: string) => string | null | undefined;
|
|
43
|
+
/** Rôle par défaut quand user inconnu / non résolu (défaut "collaborator"). */
|
|
44
|
+
defaultRole?: string;
|
|
45
|
+
/** Scopes « accès complet » qui court-circuitent la policy (défaut ["crm","full"]). */
|
|
46
|
+
fullAccessScopes?: readonly string[];
|
|
47
|
+
/** Audit (défaut `auditMcpAdmin` du kit). */
|
|
48
|
+
audit?: typeof auditMcpAdmin;
|
|
49
|
+
};
|
|
50
|
+
/** Policy stockée, lue directement (indépendante du registre tools marque). */
|
|
51
|
+
export declare function getStoredMcpToolPolicy(name: string): ToolPolicyView | null;
|
|
52
|
+
/**
|
|
53
|
+
* Décision d'enforcement d'un tool pour un acteur.
|
|
54
|
+
* Retourne la raison du deny, ou `null` si autorisé.
|
|
55
|
+
*
|
|
56
|
+
* Sémantique (parité TempoFlow) :
|
|
57
|
+
* - policy absente ou `enabled=false` → "tool_disabled" ;
|
|
58
|
+
* - rôle (resolveRole(userId) sinon defaultRole) hors allowedRoles → "role_forbidden" ;
|
|
59
|
+
* - scopes fournis, aucun full-access ni allowedScope accordé → "policy_scope_forbidden"
|
|
60
|
+
* (allowedScopes vide = aucune restriction de scope configurée).
|
|
61
|
+
*/
|
|
62
|
+
export declare function checkToolPolicy(name: string, actor: ToolPolicyActor, opts?: ToolPolicyGuardOptions): ToolPolicyDenialReason | null;
|
|
63
|
+
export type CreateToolPolicyAuthorizeOptions = ToolPolicyGuardOptions & {
|
|
64
|
+
/**
|
|
65
|
+
* Extraction de l'acteur depuis le contexte façade. Défaut : subject JWT
|
|
66
|
+
* (hors "anonymous"/"opaque-token") comme userId ; scopes depuis les
|
|
67
|
+
* claims (`scope` string OAuth ou `scopes`), sinon `null` (pas de scopes
|
|
68
|
+
* sur ce canal → pas de vérif scopes).
|
|
69
|
+
*/
|
|
70
|
+
resolveActor?: (ctx: McpAuthorizeContext) => ToolPolicyActor;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* `McpAuthorizeToolCallFn` (composable via `composeToolPolicies`) qui applique
|
|
74
|
+
* les policies admin. Opt-in non cassant : si aucun `getPolicy` custom n'est
|
|
75
|
+
* fourni ET que `configureMcpAdmin` n'a pas été câblé, la garde autorise tout
|
|
76
|
+
* (comportement identique à une façade sans admin MCP).
|
|
77
|
+
*/
|
|
78
|
+
export declare function createToolPolicyAuthorize(opts?: CreateToolPolicyAuthorizeOptions): McpAuthorizeToolCallFn;
|
|
79
|
+
/** Surface minimale du serveur MCP SDK (`@modelcontextprotocol/sdk`). */
|
|
80
|
+
export type GuardedMcpServerLike = {
|
|
81
|
+
registerTool(name: string, config: Record<string, unknown>, handler: (input: any) => any): unknown;
|
|
82
|
+
};
|
|
83
|
+
export type GuardedMcpToolContext = {
|
|
84
|
+
userId?: string | null;
|
|
85
|
+
clientId?: string | null;
|
|
86
|
+
scopes?: string | null;
|
|
87
|
+
};
|
|
88
|
+
export type GuardedMcpToolDefinition = {
|
|
89
|
+
name: string;
|
|
90
|
+
requiredScope?: string;
|
|
91
|
+
annotations?: Record<string, boolean>;
|
|
92
|
+
};
|
|
93
|
+
export type RegisterGuardedMcpToolOptions = ToolPolicyGuardOptions & {
|
|
94
|
+
/**
|
|
95
|
+
* Vérification scopes marque supplémentaire (ex. apiKeyAllowsMethod) —
|
|
96
|
+
* deny `insufficient_scope` si false. Injectée par la marque.
|
|
97
|
+
*/
|
|
98
|
+
scopeAllows?: (ctx: GuardedMcpToolContext, def: GuardedMcpToolDefinition) => boolean;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Enregistre un tool sur le serveur MCP SDK avec annotations + policy admin
|
|
102
|
+
* + audit + vérification scopes marque — SoT de l'enforcement TF-like
|
|
103
|
+
* (`registerMcpTool` des marques délègue ici, le registre métier reste marque).
|
|
104
|
+
*/
|
|
105
|
+
export declare function registerGuardedMcpTool(server: GuardedMcpServerLike, ctx: GuardedMcpToolContext, def: GuardedMcpToolDefinition, config: Record<string, unknown>, handler: (input: any) => any, opts?: RegisterGuardedMcpToolOptions): void;
|
|
106
|
+
//# sourceMappingURL=tool-policy-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-policy-guard.d.ts","sourceRoot":"","sources":["../../src/admin/tool-policy-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,sBAAsB,GAC9B,eAAe,GACf,gBAAgB,GAChB,wBAAwB,CAAC;AAE7B,4DAA4D;AAC5D,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,iFAAiF;IACjF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,4EAA4E;IAC5E,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5D,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,aAAa,CAAC;CAC9B,CAAC;AAaF,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAiB1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,sBAA2B,GAChC,sBAAsB,GAAG,IAAI,CAoB/B;AAED,MAAM,MAAM,gCAAgC,GAAG,sBAAsB,GAAG;IACtE;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,eAAe,CAAC;CAC9D,CAAC;AAiBF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,GAAE,gCAAqC,GAC1C,sBAAsB,CAkCxB;AAID,yEAAyE;AACzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE/B,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,GAC3B,OAAO,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,sBAAsB,GAAG;IACnE;;;OAGG;IACH,WAAW,CAAC,EAAE,CACZ,GAAG,EAAE,qBAAqB,EAC1B,GAAG,EAAE,wBAAwB,KAC1B,OAAO,CAAC;CACd,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,GAAG,EAAE,qBAAqB,EAC1B,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE/B,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,EAC5B,IAAI,GAAE,6BAAkC,GACvC,IAAI,CAgDN"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Garde d'enforcement réutilisable des policies MCP admin (M1).
|
|
3
|
+
*
|
|
4
|
+
* Trois surfaces, pour trois points d'entrée :
|
|
5
|
+
* - `checkToolPolicy` : décision brute (enabled/rôles/scopes) —
|
|
6
|
+
* utilisable par n'importe quel enforcement
|
|
7
|
+
* marque (ex. TF3 `registerMcpTool`) ;
|
|
8
|
+
* - `createToolPolicyAuthorize`: `McpAuthorizeToolCallFn` composable avec
|
|
9
|
+
* `composeToolPolicies` / `denyCrossLayerToolCall`
|
|
10
|
+
* pour la façade (`createBrandMcpFacade`) ;
|
|
11
|
+
* - `registerGuardedMcpTool` : wrapper serveur MCP SDK — annotations +
|
|
12
|
+
* policy + audit + scopes marque injectés.
|
|
13
|
+
*
|
|
14
|
+
* Aucune donnée marque : la résolution du rôle (`resolveRole`) et la logique
|
|
15
|
+
* scopes marque (`scopeAllows`) sont injectées. Les policies vivent dans la
|
|
16
|
+
* table `mcp_tool_policies` (adapters `configureMcpAdmin`) — mêmes lignes que
|
|
17
|
+
* la page /admin/mcp.
|
|
18
|
+
*/
|
|
19
|
+
import { getMcpAdminAdapters, isMcpAdminConfigured } from "./adapters.js";
|
|
20
|
+
import { auditMcpAdmin, ensureMcpAdminSchema } from "./mcp-admin.js";
|
|
21
|
+
function splitList(raw) {
|
|
22
|
+
return String(raw || "")
|
|
23
|
+
.split(/[\s,]+/)
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
}
|
|
26
|
+
function grantedScopeSet(scopes) {
|
|
27
|
+
if (Array.isArray(scopes))
|
|
28
|
+
return new Set(scopes.map(String).filter(Boolean));
|
|
29
|
+
return new Set(splitList(String(scopes)));
|
|
30
|
+
}
|
|
31
|
+
/** Policy stockée, lue directement (indépendante du registre tools marque). */
|
|
32
|
+
export function getStoredMcpToolPolicy(name) {
|
|
33
|
+
ensureMcpAdminSchema();
|
|
34
|
+
const row = getMcpAdminAdapters()
|
|
35
|
+
.getDb()
|
|
36
|
+
.prepare(`SELECT enabled, allowed_roles, allowed_scopes
|
|
37
|
+
FROM mcp_tool_policies WHERE tool_name = ?`)
|
|
38
|
+
.get(name);
|
|
39
|
+
if (!row)
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
enabled: row.enabled !== 0,
|
|
43
|
+
allowedRoles: splitList(row.allowed_roles),
|
|
44
|
+
allowedScopes: splitList(row.allowed_scopes),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Décision d'enforcement d'un tool pour un acteur.
|
|
49
|
+
* Retourne la raison du deny, ou `null` si autorisé.
|
|
50
|
+
*
|
|
51
|
+
* Sémantique (parité TempoFlow) :
|
|
52
|
+
* - policy absente ou `enabled=false` → "tool_disabled" ;
|
|
53
|
+
* - rôle (resolveRole(userId) sinon defaultRole) hors allowedRoles → "role_forbidden" ;
|
|
54
|
+
* - scopes fournis, aucun full-access ni allowedScope accordé → "policy_scope_forbidden"
|
|
55
|
+
* (allowedScopes vide = aucune restriction de scope configurée).
|
|
56
|
+
*/
|
|
57
|
+
export function checkToolPolicy(name, actor, opts = {}) {
|
|
58
|
+
const getPolicy = opts.getPolicy || getStoredMcpToolPolicy;
|
|
59
|
+
const policy = getPolicy(name);
|
|
60
|
+
if (!policy?.enabled)
|
|
61
|
+
return "tool_disabled";
|
|
62
|
+
const role = (actor.userId ? opts.resolveRole?.(actor.userId) : null) ||
|
|
63
|
+
opts.defaultRole ||
|
|
64
|
+
"collaborator";
|
|
65
|
+
if (!policy.allowedRoles.includes(role))
|
|
66
|
+
return "role_forbidden";
|
|
67
|
+
if (actor.scopes != null && policy.allowedScopes.length > 0) {
|
|
68
|
+
const granted = grantedScopeSet(actor.scopes);
|
|
69
|
+
const fullAccess = opts.fullAccessScopes || ["crm", "full"];
|
|
70
|
+
if (!fullAccess.some((scope) => granted.has(scope)) &&
|
|
71
|
+
!policy.allowedScopes.some((scope) => granted.has(scope))) {
|
|
72
|
+
return "policy_scope_forbidden";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
function defaultResolveActor(ctx) {
|
|
78
|
+
const claims = ctx.claims || {};
|
|
79
|
+
const claimUserId = typeof claims.userId === "string" && claims.userId ? claims.userId : null;
|
|
80
|
+
const subject = ctx.subject && ctx.subject !== "anonymous" && ctx.subject !== "opaque-token"
|
|
81
|
+
? ctx.subject
|
|
82
|
+
: null;
|
|
83
|
+
let scopes = null;
|
|
84
|
+
if (typeof claims.scope === "string")
|
|
85
|
+
scopes = claims.scope;
|
|
86
|
+
else if (Array.isArray(claims.scopes))
|
|
87
|
+
scopes = claims.scopes.map(String);
|
|
88
|
+
else if (typeof claims.scopes === "string")
|
|
89
|
+
scopes = claims.scopes;
|
|
90
|
+
return { userId: claimUserId ?? subject, scopes };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* `McpAuthorizeToolCallFn` (composable via `composeToolPolicies`) qui applique
|
|
94
|
+
* les policies admin. Opt-in non cassant : si aucun `getPolicy` custom n'est
|
|
95
|
+
* fourni ET que `configureMcpAdmin` n'a pas été câblé, la garde autorise tout
|
|
96
|
+
* (comportement identique à une façade sans admin MCP).
|
|
97
|
+
*/
|
|
98
|
+
export function createToolPolicyAuthorize(opts = {}) {
|
|
99
|
+
const resolveActor = opts.resolveActor || defaultResolveActor;
|
|
100
|
+
const audit = opts.audit || auditMcpAdmin;
|
|
101
|
+
return (ctx) => {
|
|
102
|
+
if (!opts.getPolicy && !isMcpAdminConfigured()) {
|
|
103
|
+
return { allow: true };
|
|
104
|
+
}
|
|
105
|
+
const actor = resolveActor(ctx);
|
|
106
|
+
// Les policies sont stockées sous le nom canonique OU le nom public
|
|
107
|
+
// (alias legacy) selon la surface seedée — on tente les deux.
|
|
108
|
+
const getPolicy = opts.getPolicy || getStoredMcpToolPolicy;
|
|
109
|
+
let denial = checkToolPolicy(ctx.canonicalName, actor, opts);
|
|
110
|
+
if (denial === "tool_disabled" &&
|
|
111
|
+
ctx.name !== ctx.canonicalName &&
|
|
112
|
+
getPolicy(ctx.name)) {
|
|
113
|
+
denial = checkToolPolicy(ctx.name, actor, opts);
|
|
114
|
+
}
|
|
115
|
+
if (denial) {
|
|
116
|
+
try {
|
|
117
|
+
audit("tool_call", {
|
|
118
|
+
actor: actor.userId || null,
|
|
119
|
+
toolName: ctx.name,
|
|
120
|
+
outcome: "denied",
|
|
121
|
+
detail: { reason: denial },
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* audit best-effort côté façade */
|
|
126
|
+
}
|
|
127
|
+
return { allow: false, reason: denial };
|
|
128
|
+
}
|
|
129
|
+
return { allow: true };
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
133
|
+
function errorResult(payload) {
|
|
134
|
+
return {
|
|
135
|
+
content: [{ type: "text", text: JSON.stringify(payload) }],
|
|
136
|
+
isError: true,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Enregistre un tool sur le serveur MCP SDK avec annotations + policy admin
|
|
141
|
+
* + audit + vérification scopes marque — SoT de l'enforcement TF-like
|
|
142
|
+
* (`registerMcpTool` des marques délègue ici, le registre métier reste marque).
|
|
143
|
+
*/
|
|
144
|
+
export function registerGuardedMcpTool(server, ctx, def, config,
|
|
145
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
|
+
handler, opts = {}) {
|
|
147
|
+
const auditFn = opts.audit || auditMcpAdmin;
|
|
148
|
+
server.registerTool(def.name, {
|
|
149
|
+
...config,
|
|
150
|
+
...(def.annotations ? { annotations: def.annotations } : {}),
|
|
151
|
+
},
|
|
152
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
|
+
async (input) => {
|
|
154
|
+
const audit = (outcome, detail) => auditFn("tool_call", {
|
|
155
|
+
actor: ctx.userId ?? null,
|
|
156
|
+
clientId: ctx.clientId ?? null,
|
|
157
|
+
toolName: def.name,
|
|
158
|
+
outcome,
|
|
159
|
+
detail,
|
|
160
|
+
});
|
|
161
|
+
const denial = checkToolPolicy(def.name, { userId: ctx.userId, scopes: ctx.scopes ?? "" }, opts);
|
|
162
|
+
if (denial) {
|
|
163
|
+
audit("denied", { reason: denial });
|
|
164
|
+
return errorResult({ error: denial, tool: def.name });
|
|
165
|
+
}
|
|
166
|
+
if (opts.scopeAllows && !opts.scopeAllows(ctx, def)) {
|
|
167
|
+
audit("denied", { reason: "insufficient_scope" });
|
|
168
|
+
return errorResult({
|
|
169
|
+
error: "insufficient_scope",
|
|
170
|
+
tool: def.name,
|
|
171
|
+
required_scope: def.requiredScope,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const result = await handler(input);
|
|
176
|
+
audit(result?.isError ? "error" : "ok");
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
audit("error", {
|
|
181
|
+
message: error instanceof Error ? error.message.slice(0, 300) : "Erreur tool",
|
|
182
|
+
});
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=tool-policy-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-policy-guard.js","sourceRoot":"","sources":["../../src/admin/tool-policy-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types admin MCP (port TempoFlow — N6).
|
|
3
|
+
* Le registre métier des tools reste injecté par la marque.
|
|
4
|
+
*/
|
|
5
|
+
export type McpToolDefinition = {
|
|
6
|
+
name: string;
|
|
7
|
+
category: string;
|
|
8
|
+
access: "read" | "write";
|
|
9
|
+
requiredScope: string;
|
|
10
|
+
defaultRoles?: string[];
|
|
11
|
+
annotations?: Record<string, boolean>;
|
|
12
|
+
description?: string;
|
|
13
|
+
/** Absent = seed enabled (historique). false = désactivé jusqu'à /admin/mcp. */
|
|
14
|
+
mcpPublishDefault?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type McpAdminSqliteStatement = {
|
|
17
|
+
run(...params: unknown[]): {
|
|
18
|
+
changes: number;
|
|
19
|
+
lastInsertRowid?: number | bigint;
|
|
20
|
+
};
|
|
21
|
+
get(...params: unknown[]): unknown;
|
|
22
|
+
all(...params: unknown[]): unknown[];
|
|
23
|
+
};
|
|
24
|
+
export type McpAdminSqliteDatabase = {
|
|
25
|
+
exec(sql: string): unknown;
|
|
26
|
+
prepare(sql: string): McpAdminSqliteStatement;
|
|
27
|
+
transaction?: <TArgs extends unknown[], TResult>(fn: (...args: TArgs) => TResult) => (...args: TArgs) => TResult;
|
|
28
|
+
};
|
|
29
|
+
export type McpRequestLogEntry = {
|
|
30
|
+
status: number;
|
|
31
|
+
durationMs: number;
|
|
32
|
+
detail: Record<string, unknown>;
|
|
33
|
+
};
|
|
34
|
+
export type McpAdminAdapters = {
|
|
35
|
+
getDb: () => McpAdminSqliteDatabase;
|
|
36
|
+
getWriteDb: () => McpAdminSqliteDatabase;
|
|
37
|
+
tableExists: (name: string) => boolean;
|
|
38
|
+
/** Registre tools métier (seed policies). */
|
|
39
|
+
listTools: () => McpToolDefinition[];
|
|
40
|
+
mcpOauthReady: () => boolean;
|
|
41
|
+
resolveMcpPublicUrl: () => string | null;
|
|
42
|
+
/** Logs process MCP pour métriques (optionnel → métriques vides). */
|
|
43
|
+
listRequestLogs?: (opts: {
|
|
44
|
+
source: string;
|
|
45
|
+
limit: number;
|
|
46
|
+
}) => {
|
|
47
|
+
logs: McpRequestLogEntry[];
|
|
48
|
+
};
|
|
49
|
+
/** Filename export diagnostic (défaut creezio). */
|
|
50
|
+
diagnosticFilenamePrefix?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Rôles acceptés dans `updateMcpToolPolicy` / seed des policies
|
|
53
|
+
* (défaut ["owner","collaborator"] — comportement historique).
|
|
54
|
+
*/
|
|
55
|
+
policyRoleNames?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* Scopes acceptés dans `updateMcpToolPolicy`
|
|
58
|
+
* (défaut ["crm","crm:read","crm:write","full"] — comportement historique).
|
|
59
|
+
*/
|
|
60
|
+
policyScopeNames?: string[];
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/admin/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAClF,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;CAClH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,sBAAsB,CAAC;IACpC,UAAU,EAAE,MAAM,sBAAsB,CAAC;IACzC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,6CAA6C;IAC7C,SAAS,EAAE,MAAM,iBAAiB,EAAE,CAAC;IACrC,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,mBAAmB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACzC,qEAAqE;IACrE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,KAAK;QAAE,IAAI,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;IACrC,mDAAmD;IACnD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/admin/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DX factory marque — remplace le boilerplate create*BrandMcp ×3.
|
|
3
|
+
* La marque fournit api + aliases ; tools module.* générés depuis
|
|
4
|
+
* `api.listOperations()`. `discoverModuleTools` = hook apps optionnel
|
|
5
|
+
* (extras / JWT) — SoT = `operations[]`, pas de `mcpTools` manuscrit.
|
|
6
|
+
*/
|
|
7
|
+
import type { ApiKernel } from "@creezio/api-kernel";
|
|
8
|
+
import { type McpFacade } from "./facade.js";
|
|
9
|
+
import { type CreateToolPolicyAuthorizeOptions } from "./admin/tool-policy-guard.js";
|
|
10
|
+
import type { McpFacadeOptions, McpPublicSurfaceMode, McpRegisteredTool } from "./types.js";
|
|
11
|
+
export type CreateBrandMcpFacadeOptions = Omit<McpFacadeOptions, "discoverToolsBySpace" | "aliases"> & {
|
|
12
|
+
api: ApiKernel;
|
|
13
|
+
/** Aliases legacy métier (surface publique). */
|
|
14
|
+
aliases: Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Hook apps (extras / JWT). Le runtime génère toujours depuis
|
|
17
|
+
* `api.listOperations()` (space module) — SoT = `operations[]`.
|
|
18
|
+
*/
|
|
19
|
+
discoverModuleTools?: (api: ApiKernel) => McpRegisteredTool[] | Promise<McpRegisteredTool[]>;
|
|
20
|
+
/** Discovery plugins (défaut : []). */
|
|
21
|
+
discoverPluginTools?: (api: ApiKernel) => McpRegisteredTool[] | Promise<McpRegisteredTool[]>;
|
|
22
|
+
/** Surface publique (défaut legacy-preferred — compat clients MCP externes). */
|
|
23
|
+
publicSurface?: McpPublicSurfaceMode;
|
|
24
|
+
/** Aliases additionnels fusionnés. */
|
|
25
|
+
extraAliases?: Record<string, string>;
|
|
26
|
+
/**
|
|
27
|
+
* M2 — enforcement des policies admin MCP (`mcp_tool_policies`) sur les
|
|
28
|
+
* tool calls de la façade, composé avec `denyCrossLayerToolCall`. Opt-in
|
|
29
|
+
* et non cassant : sans ce flag (ou si `configureMcpAdmin` n'est pas
|
|
30
|
+
* câblé), comportement identique à aujourd'hui. `true` = défauts ; objet =
|
|
31
|
+
* options de la garde (resolveRole, fullAccessScopes, …). Les tools listés
|
|
32
|
+
* par la façade sont seedés en policies permissives à la première décision
|
|
33
|
+
* (rien ne casse à l'activation).
|
|
34
|
+
*/
|
|
35
|
+
toolPolicyGuard?: boolean | CreateToolPolicyAuthorizeOptions;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Une seule factory listTools/callTool pour Electron / Hono / assistant.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createBrandMcpFacade(options: CreateBrandMcpFacadeOptions): McpFacade;
|
|
41
|
+
//# sourceMappingURL=brand-facade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-facade.d.ts","sourceRoot":"","sources":["../src/brand-facade.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAI9D,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAEV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,gBAAgB,EAChB,sBAAsB,GAAG,SAAS,CACnC,GAAG;IACF,GAAG,EAAE,SAAS,CAAC;IACf,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CACpB,GAAG,EAAE,SAAS,KACX,iBAAiB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,uCAAuC;IACvC,mBAAmB,CAAC,EAAE,CACpB,GAAG,EAAE,SAAS,KACX,iBAAiB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,gFAAgF;IAChF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,gCAAgC,CAAC;CAC9D,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,SAAS,CA0EX"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createMcpFacade } from "./facade.js";
|
|
2
|
+
import { composeToolPolicies } from "./policy.js";
|
|
3
|
+
import { isMcpAdminConfigured } from "./admin/adapters.js";
|
|
4
|
+
import { seedMcpToolPolicies } from "./admin/mcp-admin.js";
|
|
5
|
+
import { createToolPolicyAuthorize, } from "./admin/tool-policy-guard.js";
|
|
6
|
+
import { discoverModuleToolsFromKernel } from "./module-ops-tools.js";
|
|
7
|
+
/**
|
|
8
|
+
* Une seule factory listTools/callTool pour Electron / Hono / assistant.
|
|
9
|
+
*/
|
|
10
|
+
export function createBrandMcpFacade(options) {
|
|
11
|
+
const { api, aliases, discoverModuleTools, discoverPluginTools, extraAliases, publicSurface = "legacy-preferred", toolPolicyGuard, ...rest } = options;
|
|
12
|
+
let facade;
|
|
13
|
+
let authorizeToolCall = rest.authorizeToolCall;
|
|
14
|
+
if (toolPolicyGuard) {
|
|
15
|
+
const guardOpts = typeof toolPolicyGuard === "object" ? toolPolicyGuard : {};
|
|
16
|
+
const policyAuthorize = createToolPolicyAuthorize(guardOpts);
|
|
17
|
+
// Seed permissif des tools exposés par la façade (INSERT OR IGNORE) —
|
|
18
|
+
// lazy à la première décision : la DB admin n'est pas forcément prête
|
|
19
|
+
// à la création de la façade.
|
|
20
|
+
let policySeeded = false;
|
|
21
|
+
const ensurePolicySeed = async () => {
|
|
22
|
+
if (policySeeded || guardOpts.getPolicy || !isMcpAdminConfigured()) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
policySeeded = true;
|
|
26
|
+
try {
|
|
27
|
+
const { tools } = await facade.listTools();
|
|
28
|
+
seedMcpToolPolicies(tools.map((tool) => ({
|
|
29
|
+
name: tool.name,
|
|
30
|
+
defaultRoles: tool.defaultRoles,
|
|
31
|
+
requiredScope: tool.requiredScope,
|
|
32
|
+
mcpPublishDefault: tool.mcpPublishDefault,
|
|
33
|
+
})));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
policySeeded = false; // DB pas prête — retentera au prochain call
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const guardedAuthorize = async (ctx) => {
|
|
40
|
+
await ensurePolicySeed();
|
|
41
|
+
return policyAuthorize(ctx);
|
|
42
|
+
};
|
|
43
|
+
authorizeToolCall = authorizeToolCall
|
|
44
|
+
? composeToolPolicies(authorizeToolCall, guardedAuthorize)
|
|
45
|
+
: guardedAuthorize;
|
|
46
|
+
}
|
|
47
|
+
facade = createMcpFacade({
|
|
48
|
+
allowUnauthenticated: true,
|
|
49
|
+
enforceNamespaces: true,
|
|
50
|
+
publicSurface,
|
|
51
|
+
// defaultCrossLayerDeny=true : la façade compose elle-même
|
|
52
|
+
// denyCrossLayerToolCall AVANT authorizeToolCall (premier deny gagne).
|
|
53
|
+
defaultCrossLayerDeny: true,
|
|
54
|
+
listApiMounts: () => api.listMounts(),
|
|
55
|
+
...rest,
|
|
56
|
+
authorizeToolCall,
|
|
57
|
+
aliases: { ...aliases, ...(extraAliases || {}) },
|
|
58
|
+
discoverToolsBySpace: async () => ({
|
|
59
|
+
module: discoverModuleToolsFromKernel(api, discoverModuleTools ? await discoverModuleTools(api) : []),
|
|
60
|
+
plugin: discoverPluginTools
|
|
61
|
+
? await discoverPluginTools(api)
|
|
62
|
+
: [],
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
return facade;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=brand-facade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-facade.js","sourceRoot":"","sources":["../src/brand-facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools MCP cœur (`creezio.*`) — SoT kit (H1/H4 → M9).
|
|
3
|
+
*
|
|
4
|
+
* Les marques importent les noms / factories ; handlers Hono peuvent
|
|
5
|
+
* rester brand-specific tant que les noms restent alignés.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpRegisteredTool, McpToolsBySpace } from "./types.js";
|
|
8
|
+
export declare const CREEZIO_CORE_MCP_TOOL_NAMES: readonly ["creezio.health", "creezio.architecture", "creezio.admin.list_mounts", "creezio.admin.list_tools_by_space", "creezio.admin.list_aliases"];
|
|
9
|
+
export type CreezioCoreMcpToolName = (typeof CREEZIO_CORE_MCP_TOOL_NAMES)[number];
|
|
10
|
+
export type CreateCoreMcpToolsOptions = {
|
|
11
|
+
architectureVersion?: string;
|
|
12
|
+
brandId?: string;
|
|
13
|
+
listApiMounts?: () => Array<{
|
|
14
|
+
space: string;
|
|
15
|
+
id: string;
|
|
16
|
+
}>;
|
|
17
|
+
listToolsBySpaceSync?: () => McpToolsBySpace;
|
|
18
|
+
listAliasesSync?: () => Record<string, string>;
|
|
19
|
+
};
|
|
20
|
+
/** Factory tools cœur — utilisée par `createMcpFacade`. */
|
|
21
|
+
export declare function createCoreMcpTools(opts?: CreateCoreMcpToolsOptions): McpRegisteredTool[];
|
|
22
|
+
//# sourceMappingURL=core-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-tools.d.ts","sourceRoot":"","sources":["../src/core-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,2BAA2B,qJAM9B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,yBAAyB,GAAG;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,oBAAoB,CAAC,EAAE,MAAM,eAAe,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD,CAAC;AAMF,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,yBAA8B,GACnC,iBAAiB,EAAE,CA2ErB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools MCP cœur (`creezio.*`) — SoT kit (H1/H4 → M9).
|
|
3
|
+
*
|
|
4
|
+
* Les marques importent les noms / factories ; handlers Hono peuvent
|
|
5
|
+
* rester brand-specific tant que les noms restent alignés.
|
|
6
|
+
*/
|
|
7
|
+
import { ARCHITECTURE_VERSION } from "@creezio/platform-core";
|
|
8
|
+
import { API_V1_PREFIX } from "@creezio/api-kernel";
|
|
9
|
+
export const CREEZIO_CORE_MCP_TOOL_NAMES = [
|
|
10
|
+
"creezio.health",
|
|
11
|
+
"creezio.architecture",
|
|
12
|
+
"creezio.admin.list_mounts",
|
|
13
|
+
"creezio.admin.list_tools_by_space",
|
|
14
|
+
"creezio.admin.list_aliases",
|
|
15
|
+
];
|
|
16
|
+
function emptyBySpace() {
|
|
17
|
+
return { core: [], module: [], plugin: [] };
|
|
18
|
+
}
|
|
19
|
+
/** Factory tools cœur — utilisée par `createMcpFacade`. */
|
|
20
|
+
export function createCoreMcpTools(opts = {}) {
|
|
21
|
+
const architectureVersion = opts.architectureVersion ?? ARCHITECTURE_VERSION;
|
|
22
|
+
return [
|
|
23
|
+
{
|
|
24
|
+
name: "creezio.health",
|
|
25
|
+
description: "Ping santé façade MCP / API cœur",
|
|
26
|
+
space: "core",
|
|
27
|
+
inputSchema: { type: "object", properties: {} },
|
|
28
|
+
handler: async () => ({
|
|
29
|
+
ok: true,
|
|
30
|
+
content: { ok: true, brandId: opts.brandId ?? null },
|
|
31
|
+
}),
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "creezio.architecture",
|
|
35
|
+
description: "Version architecture + préfixe API unique",
|
|
36
|
+
space: "core",
|
|
37
|
+
inputSchema: { type: "object", properties: {} },
|
|
38
|
+
handler: async () => ({
|
|
39
|
+
ok: true,
|
|
40
|
+
content: {
|
|
41
|
+
architectureVersion,
|
|
42
|
+
apiPrefix: API_V1_PREFIX,
|
|
43
|
+
note: "Une seule façade MCP = MCP de l'app (proxy unifié H4)",
|
|
44
|
+
toolSpaces: ["core", "module", "plugin"],
|
|
45
|
+
publicSurfaceModes: [
|
|
46
|
+
"canonical",
|
|
47
|
+
"legacy-preferred",
|
|
48
|
+
"both",
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "creezio.admin.list_mounts",
|
|
55
|
+
description: "Liste les montages API modules/plugins connus",
|
|
56
|
+
space: "core",
|
|
57
|
+
inputSchema: { type: "object", properties: {} },
|
|
58
|
+
handler: async () => ({
|
|
59
|
+
ok: true,
|
|
60
|
+
content: {
|
|
61
|
+
mounts: opts.listApiMounts ? opts.listApiMounts() : [],
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "creezio.admin.list_tools_by_space",
|
|
67
|
+
description: "Liste les tools MCP groupés par couche (core / module / plugin)",
|
|
68
|
+
space: "core",
|
|
69
|
+
inputSchema: { type: "object", properties: {} },
|
|
70
|
+
handler: async () => ({
|
|
71
|
+
ok: true,
|
|
72
|
+
content: {
|
|
73
|
+
bySpace: opts.listToolsBySpaceSync
|
|
74
|
+
? opts.listToolsBySpaceSync()
|
|
75
|
+
: emptyBySpace(),
|
|
76
|
+
},
|
|
77
|
+
}),
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "creezio.admin.list_aliases",
|
|
81
|
+
description: "Liste les aliases legacy → tools canoniques (anti double exposition)",
|
|
82
|
+
space: "core",
|
|
83
|
+
inputSchema: { type: "object", properties: {} },
|
|
84
|
+
handler: async () => ({
|
|
85
|
+
ok: true,
|
|
86
|
+
content: {
|
|
87
|
+
aliases: opts.listAliasesSync ? opts.listAliasesSync() : {},
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=core-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-tools.js","sourceRoot":"","sources":["../src/core-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import dynamique type-erased pour les packages `@creezio/*` qui ne sont
|
|
3
|
+
* PAS des dépendances de build de mcp-facade (`@creezio/auth`,
|
|
4
|
+
* `@creezio/tasks` — façade utilisable standalone). Un `import("…")` littéral
|
|
5
|
+
* ferait résoudre les types par tsc → TS2307 selon l'ordre topologique de
|
|
6
|
+
* `scripts/build-workspaces.mjs` (tasks compile APRÈS mcp-facade). Résolution
|
|
7
|
+
* au RUNTIME de l'app hôte, fail-closed chez les appelants — même pattern que
|
|
8
|
+
* `@creezio/mails` (imapflow / nodemailer).
|
|
9
|
+
*/
|
|
10
|
+
type DynImport = (specifier: string) => Promise<unknown>;
|
|
11
|
+
export declare const dynImport: DynImport;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=dyn-import.d.ts.map
|