@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 @@
|
|
|
1
|
+
{"version":3,"file":"dyn-import.d.ts","sourceRoot":"","sources":["../src/dyn-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,KAAK,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzD,eAAO,MAAM,SAAS,EAGjB,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dyn-import.js","sourceRoot":"","sources":["../src/dyn-import.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,QAAQ,CACnC,WAAW,EACX,0BAA0B,CACd,CAAC"}
|
package/dist/facade.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Façade / proxy MCP unique — tools cœur + discoverTools modules/plugins.
|
|
3
|
+
* H2.3 : discovery / listage scindés par couche (core / module / plugin).
|
|
4
|
+
* H4 : registry dynamique, namespacing, aliases legacy, policies deny
|
|
5
|
+
* cross-layer, surface publique sans double exposition.
|
|
6
|
+
*
|
|
7
|
+
* Pas de MCP « produit Creezio » séparé du MCP de l'app.
|
|
8
|
+
*/
|
|
9
|
+
import type { DiscoverToolsBySpaceFn, DiscoverToolsFn, McpCallToolOpts, McpFacadeOptions, McpListToolsResult, McpPublicSurfaceMode, McpRegisteredTool, McpToolCallResult, McpToolsBySpace, McpToolSpace } from "./types.js";
|
|
10
|
+
export type McpFacade = {
|
|
11
|
+
listTools(opts?: {
|
|
12
|
+
bearerToken?: string | null;
|
|
13
|
+
/** Filtre H2 — une seule couche. */
|
|
14
|
+
space?: McpToolSpace;
|
|
15
|
+
/** Override ponctuel de la surface publique. */
|
|
16
|
+
publicSurface?: McpPublicSurfaceMode;
|
|
17
|
+
}): Promise<McpListToolsResult>;
|
|
18
|
+
/** H2 : tools groupés par couche. */
|
|
19
|
+
listToolsBySpace(opts?: {
|
|
20
|
+
bearerToken?: string | null;
|
|
21
|
+
publicSurface?: McpPublicSurfaceMode;
|
|
22
|
+
}): Promise<McpToolsBySpace>;
|
|
23
|
+
callTool(name: string, args?: Record<string, unknown>, opts?: McpCallToolOpts): Promise<McpToolCallResult>;
|
|
24
|
+
/** Réenregistre / remplace le discoverer plat. */
|
|
25
|
+
setDiscoverTools(fn: DiscoverToolsFn): void;
|
|
26
|
+
/** Réenregistre le discoverer scindé (H2). */
|
|
27
|
+
setDiscoverToolsBySpace(fn: DiscoverToolsBySpaceFn): void;
|
|
28
|
+
/** H4 — enregistre un tool namespacé (module/plugin ; core réservé). */
|
|
29
|
+
registerTool(tool: McpRegisteredTool): void;
|
|
30
|
+
/** H4 — alias legacy → canonique. */
|
|
31
|
+
registerAlias(alias: string, canonicalName: string): void;
|
|
32
|
+
/** H4 — retire un tool du registre dynamique. */
|
|
33
|
+
unregisterTool(name: string): boolean;
|
|
34
|
+
/** H4 — map alias → canonique. */
|
|
35
|
+
listAliases(): Record<string, string>;
|
|
36
|
+
/** H4 — résout alias → nom canonique. */
|
|
37
|
+
resolveToolName(name: string): string;
|
|
38
|
+
};
|
|
39
|
+
export declare function createMcpFacade(options?: McpFacadeOptions): McpFacade;
|
|
40
|
+
//# sourceMappingURL=facade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../src/facade.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EAEf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EAEjB,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,CAAC,IAAI,CAAC,EAAE;QACf,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,oCAAoC;QACpC,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,gDAAgD;QAChD,aAAa,CAAC,EAAE,oBAAoB,CAAC;KACtC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChC,qCAAqC;IACrC,gBAAgB,CAAC,IAAI,CAAC,EAAE;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,aAAa,CAAC,EAAE,oBAAoB,CAAC;KACtC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7B,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,8CAA8C;IAC9C,uBAAuB,CAAC,EAAE,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC1D,wEAAwE;IACxE,YAAY,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,qCAAqC;IACrC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,iDAAiD;IACjD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,kCAAkC;IAClC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,yCAAyC;IACzC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC,CAAC;AA2EF,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CA4RzE"}
|
package/dist/facade.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Façade / proxy MCP unique — tools cœur + discoverTools modules/plugins.
|
|
3
|
+
* H2.3 : discovery / listage scindés par couche (core / module / plugin).
|
|
4
|
+
* H4 : registry dynamique, namespacing, aliases legacy, policies deny
|
|
5
|
+
* cross-layer, surface publique sans double exposition.
|
|
6
|
+
*
|
|
7
|
+
* Pas de MCP « produit Creezio » séparé du MCP de l'app.
|
|
8
|
+
*/
|
|
9
|
+
import { ARCHITECTURE_VERSION } from "@creezio/platform-core";
|
|
10
|
+
import { dynImport } from "./dyn-import.js";
|
|
11
|
+
import { verifyMcpBearer } from "./jwt.js";
|
|
12
|
+
import { assertNamespacedToolName, isLegacyAliasName } from "./namespace.js";
|
|
13
|
+
import { composeToolPolicies, denyCrossLayerToolCall, } from "./policy.js";
|
|
14
|
+
import { createCoreMcpTools } from "./core-tools.js";
|
|
15
|
+
import { isMcpAdminConfigured } from "./admin/adapters.js";
|
|
16
|
+
import { filterListedToolsByEnabledPolicy } from "./admin/mcp-admin.js";
|
|
17
|
+
function emptyBySpace() {
|
|
18
|
+
return { core: [], module: [], plugin: [] };
|
|
19
|
+
}
|
|
20
|
+
function toDef(t) {
|
|
21
|
+
return {
|
|
22
|
+
name: t.name,
|
|
23
|
+
description: t.description,
|
|
24
|
+
space: t.space,
|
|
25
|
+
...(t.ownerId ? { ownerId: t.ownerId } : {}),
|
|
26
|
+
...(t.inputSchema ? { inputSchema: t.inputSchema } : {}),
|
|
27
|
+
...(t.aliasOf ? { aliasOf: t.aliasOf } : {}),
|
|
28
|
+
...(t.defaultRoles?.length ? { defaultRoles: t.defaultRoles } : {}),
|
|
29
|
+
...(typeof t.mcpPublishDefault === "boolean"
|
|
30
|
+
? { mcpPublishDefault: t.mcpPublishDefault }
|
|
31
|
+
: {}),
|
|
32
|
+
...(t.requiredScope ? { requiredScope: t.requiredScope } : {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function groupBySpace(tools) {
|
|
36
|
+
const out = emptyBySpace();
|
|
37
|
+
for (const t of tools) {
|
|
38
|
+
out[t.space].push(t);
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Applique publicSurface : évite de lister à la fois get_panier et
|
|
44
|
+
* module.panier.get quand un alias les relie.
|
|
45
|
+
*/
|
|
46
|
+
function applyPublicSurface(tools, aliases, mode) {
|
|
47
|
+
const canonicalHidden = new Set();
|
|
48
|
+
if (mode === "legacy-preferred") {
|
|
49
|
+
for (const canonical of aliases.values()) {
|
|
50
|
+
canonicalHidden.add(canonical);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const defs = [];
|
|
54
|
+
for (const t of tools) {
|
|
55
|
+
if (mode === "legacy-preferred" && canonicalHidden.has(t.name)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
defs.push(toDef(t));
|
|
59
|
+
}
|
|
60
|
+
if (mode === "legacy-preferred" || mode === "both") {
|
|
61
|
+
const byName = new Map(tools.map((t) => [t.name, t]));
|
|
62
|
+
for (const [alias, canonical] of aliases) {
|
|
63
|
+
const target = byName.get(canonical);
|
|
64
|
+
if (!target)
|
|
65
|
+
continue;
|
|
66
|
+
if (defs.some((d) => d.name === alias))
|
|
67
|
+
continue;
|
|
68
|
+
defs.push({
|
|
69
|
+
name: alias,
|
|
70
|
+
description: `${target.description} (alias → ${canonical})`,
|
|
71
|
+
space: target.space,
|
|
72
|
+
...(target.ownerId ? { ownerId: target.ownerId } : {}),
|
|
73
|
+
...(target.inputSchema ? { inputSchema: target.inputSchema } : {}),
|
|
74
|
+
aliasOf: canonical,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return defs;
|
|
79
|
+
}
|
|
80
|
+
export function createMcpFacade(options = {}) {
|
|
81
|
+
let discover = options.discoverTools || (async () => []);
|
|
82
|
+
let discoverBySpace = options.discoverToolsBySpace || (async () => ({}));
|
|
83
|
+
const architectureVersion = options.architectureVersion ?? ARCHITECTURE_VERSION;
|
|
84
|
+
const enforceNamespaces = options.enforceNamespaces !== false;
|
|
85
|
+
const publicSurfaceDefault = options.publicSurface ?? "legacy-preferred";
|
|
86
|
+
const dynamicTools = new Map();
|
|
87
|
+
const aliases = new Map();
|
|
88
|
+
if (options.aliases) {
|
|
89
|
+
for (const [alias, canonical] of Object.entries(options.aliases)) {
|
|
90
|
+
aliases.set(alias, canonical);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const authorize = (() => {
|
|
94
|
+
const custom = options.authorizeToolCall;
|
|
95
|
+
const useDefault = options.defaultCrossLayerDeny !== false;
|
|
96
|
+
if (custom && useDefault) {
|
|
97
|
+
return composeToolPolicies(denyCrossLayerToolCall, custom);
|
|
98
|
+
}
|
|
99
|
+
if (custom)
|
|
100
|
+
return custom;
|
|
101
|
+
if (useDefault)
|
|
102
|
+
return denyCrossLayerToolCall;
|
|
103
|
+
return async () => ({ allow: true });
|
|
104
|
+
})();
|
|
105
|
+
function registerAlias(alias, canonicalName) {
|
|
106
|
+
if (!alias || !canonicalName) {
|
|
107
|
+
throw new Error("mcp_alias_invalid: alias et canonical requis");
|
|
108
|
+
}
|
|
109
|
+
if (alias === canonicalName) {
|
|
110
|
+
throw new Error("mcp_alias_invalid: alias = canonical");
|
|
111
|
+
}
|
|
112
|
+
if (!isLegacyAliasName(alias) && enforceNamespaces) {
|
|
113
|
+
// Autoriser aussi un alias namespacé (ex. module.panier.get → autre),
|
|
114
|
+
// mais interdire qu'un alias pointe vers rien de valide plus tard.
|
|
115
|
+
}
|
|
116
|
+
aliases.set(alias, canonicalName);
|
|
117
|
+
}
|
|
118
|
+
function registerTool(tool) {
|
|
119
|
+
if (tool.space === "core") {
|
|
120
|
+
throw new Error("mcp_register_core_denied: les tools core sont réservés à la façade");
|
|
121
|
+
}
|
|
122
|
+
if (enforceNamespaces) {
|
|
123
|
+
assertNamespacedToolName(tool.space, tool.name, tool.ownerId);
|
|
124
|
+
}
|
|
125
|
+
dynamicTools.set(tool.name, tool);
|
|
126
|
+
}
|
|
127
|
+
async function auth(bearer) {
|
|
128
|
+
// Bearer opaque (clé API service) : résolution app AVANT le JWT.
|
|
129
|
+
if (options.resolveBearerActor) {
|
|
130
|
+
const token = String(bearer || "")
|
|
131
|
+
.replace(/^Bearer\s+/i, "")
|
|
132
|
+
.trim();
|
|
133
|
+
if (token) {
|
|
134
|
+
try {
|
|
135
|
+
const actor = await options.resolveBearerActor(token);
|
|
136
|
+
if (actor?.subject) {
|
|
137
|
+
return {
|
|
138
|
+
ok: true,
|
|
139
|
+
subject: actor.subject,
|
|
140
|
+
...(actor.orgId ? { orgId: actor.orgId } : {}),
|
|
141
|
+
...(actor.claims ? { claims: actor.claims } : {}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Token inconnu / DB indisponible → fallback JWT inchangé.
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const viaMcp = verifyMcpBearer(bearer, options.jwtSecret, {
|
|
151
|
+
allowUnauthenticated: options.allowUnauthenticated,
|
|
152
|
+
});
|
|
153
|
+
if (viaMcp.ok)
|
|
154
|
+
return viaMcp;
|
|
155
|
+
// Fallback : Bearer JWT session plateforme (chat OS, clients CRM).
|
|
156
|
+
// Un JWT signé AUTH_SECRET n'est pas un JWT MCP (invalid_signature) —
|
|
157
|
+
// on le valide via @creezio/auth, résolu au runtime de l'app (pas de
|
|
158
|
+
// dépendance de build : façade utilisable hors app → verdict inchangé).
|
|
159
|
+
const token = String(bearer || "")
|
|
160
|
+
.replace(/^Bearer\s+/i, "")
|
|
161
|
+
.trim();
|
|
162
|
+
if (token && token.split(".").length === 3) {
|
|
163
|
+
try {
|
|
164
|
+
const authMod = (await dynImport("@creezio/auth"));
|
|
165
|
+
const session = await authMod.verifySessionToken?.(token);
|
|
166
|
+
const sub = session && typeof session.sub === "string" ? session.sub : "";
|
|
167
|
+
if (sub) {
|
|
168
|
+
return {
|
|
169
|
+
ok: true,
|
|
170
|
+
subject: sub,
|
|
171
|
+
claims: session,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// @creezio/auth absent (façade standalone) → verdict MCP inchangé.
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return viaMcp;
|
|
180
|
+
}
|
|
181
|
+
async function discoveredTools() {
|
|
182
|
+
const flat = await discover();
|
|
183
|
+
const bySpace = await discoverBySpace();
|
|
184
|
+
const out = [...flat];
|
|
185
|
+
for (const space of ["module", "plugin"]) {
|
|
186
|
+
for (const t of bySpace[space] || []) {
|
|
187
|
+
out.push({ ...t, space: t.space || space });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const t of dynamicTools.values()) {
|
|
191
|
+
out.push(t);
|
|
192
|
+
}
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
async function allTools() {
|
|
196
|
+
const discovered = await discoveredTools();
|
|
197
|
+
const byName = new Map();
|
|
198
|
+
const core = createCoreMcpTools({
|
|
199
|
+
architectureVersion,
|
|
200
|
+
brandId: options.brandId,
|
|
201
|
+
listApiMounts: options.listApiMounts,
|
|
202
|
+
listToolsBySpaceSync: () => cachedBySpace,
|
|
203
|
+
listAliasesSync: () => Object.fromEntries(aliases),
|
|
204
|
+
});
|
|
205
|
+
let cachedBySpace = emptyBySpace();
|
|
206
|
+
for (const t of core)
|
|
207
|
+
byName.set(t.name, t);
|
|
208
|
+
for (const t of discovered) {
|
|
209
|
+
if (byName.has(t.name)) {
|
|
210
|
+
// Les tools cœur gagnent ; modules/plugins doivent préfixer leur id.
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (t.space === "core") {
|
|
214
|
+
// Interdit : un discoverer ne peut pas injecter un tool core.
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (enforceNamespaces) {
|
|
218
|
+
try {
|
|
219
|
+
assertNamespacedToolName(t.space, t.name, t.ownerId);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Tool non conforme : ignoré (pas de crash discovery).
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
byName.set(t.name, t);
|
|
227
|
+
}
|
|
228
|
+
const all = [...byName.values()];
|
|
229
|
+
cachedBySpace = groupBySpace(all.map(toDef));
|
|
230
|
+
return all;
|
|
231
|
+
}
|
|
232
|
+
function resolveToolName(name) {
|
|
233
|
+
return aliases.get(name) || name;
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
setDiscoverTools(fn) {
|
|
237
|
+
discover = fn;
|
|
238
|
+
},
|
|
239
|
+
setDiscoverToolsBySpace(fn) {
|
|
240
|
+
discoverBySpace = fn;
|
|
241
|
+
},
|
|
242
|
+
registerTool,
|
|
243
|
+
registerAlias,
|
|
244
|
+
unregisterTool(name) {
|
|
245
|
+
return dynamicTools.delete(name);
|
|
246
|
+
},
|
|
247
|
+
listAliases() {
|
|
248
|
+
return Object.fromEntries(aliases);
|
|
249
|
+
},
|
|
250
|
+
resolveToolName,
|
|
251
|
+
async listTools(opts) {
|
|
252
|
+
const a = await auth(opts?.bearerToken);
|
|
253
|
+
if (!a.ok) {
|
|
254
|
+
throw Object.assign(new Error(a.error), { status: a.status });
|
|
255
|
+
}
|
|
256
|
+
const tools = await allTools();
|
|
257
|
+
const mode = opts?.publicSurface ?? publicSurfaceDefault;
|
|
258
|
+
let defs = applyPublicSurface(tools, aliases, mode);
|
|
259
|
+
if (opts?.space) {
|
|
260
|
+
defs = defs.filter((t) => t.space === opts.space);
|
|
261
|
+
}
|
|
262
|
+
if (options.filterPluginToolsForActor) {
|
|
263
|
+
defs = await options.filterPluginToolsForActor(defs, {
|
|
264
|
+
subject: a.subject,
|
|
265
|
+
orgId: a.orgId,
|
|
266
|
+
claims: a.claims,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
if (isMcpAdminConfigured()) {
|
|
270
|
+
defs = filterListedToolsByEnabledPolicy(defs, Object.fromEntries(aliases));
|
|
271
|
+
}
|
|
272
|
+
return { tools: defs };
|
|
273
|
+
},
|
|
274
|
+
async listToolsBySpace(opts) {
|
|
275
|
+
const a = await auth(opts?.bearerToken);
|
|
276
|
+
if (!a.ok) {
|
|
277
|
+
throw Object.assign(new Error(a.error), { status: a.status });
|
|
278
|
+
}
|
|
279
|
+
const tools = await allTools();
|
|
280
|
+
const mode = opts?.publicSurface ?? publicSurfaceDefault;
|
|
281
|
+
let defs = applyPublicSurface(tools, aliases, mode);
|
|
282
|
+
if (options.filterPluginToolsForActor) {
|
|
283
|
+
defs = await options.filterPluginToolsForActor(defs, {
|
|
284
|
+
subject: a.subject,
|
|
285
|
+
orgId: a.orgId,
|
|
286
|
+
claims: a.claims,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (isMcpAdminConfigured()) {
|
|
290
|
+
defs = filterListedToolsByEnabledPolicy(defs, Object.fromEntries(aliases));
|
|
291
|
+
}
|
|
292
|
+
return groupBySpace(defs);
|
|
293
|
+
},
|
|
294
|
+
async callTool(name, args = {}, opts) {
|
|
295
|
+
const a = await auth(opts?.bearerToken);
|
|
296
|
+
if (!a.ok) {
|
|
297
|
+
return { ok: false, error: a.error };
|
|
298
|
+
}
|
|
299
|
+
const canonicalName = resolveToolName(name);
|
|
300
|
+
const isAlias = canonicalName !== name;
|
|
301
|
+
const tools = await allTools();
|
|
302
|
+
const tool = tools.find((t) => t.name === canonicalName);
|
|
303
|
+
if (!tool)
|
|
304
|
+
return { ok: false, error: "tool_not_found" };
|
|
305
|
+
const decision = await authorize({
|
|
306
|
+
name,
|
|
307
|
+
canonicalName,
|
|
308
|
+
space: tool.space,
|
|
309
|
+
ownerId: tool.ownerId,
|
|
310
|
+
subject: a.subject,
|
|
311
|
+
orgId: a.orgId,
|
|
312
|
+
claims: a.claims,
|
|
313
|
+
args,
|
|
314
|
+
isAlias,
|
|
315
|
+
});
|
|
316
|
+
if (!decision.allow) {
|
|
317
|
+
return { ok: false, error: decision.reason };
|
|
318
|
+
}
|
|
319
|
+
// Acteur transmis aux handlers (2ᵉ argument optionnel, rétro-compat).
|
|
320
|
+
// Bearer + headers d'origine : tools `module.*` les recopient sur la
|
|
321
|
+
// ApiRequest synthétique (requireSession cookie/JWT).
|
|
322
|
+
return tool.handler(args, {
|
|
323
|
+
...(a.subject ? { subject: a.subject } : {}),
|
|
324
|
+
...(a.orgId ? { orgId: a.orgId } : {}),
|
|
325
|
+
...(a.claims ? { claims: a.claims } : {}),
|
|
326
|
+
...(opts?.bearerToken ? { bearerToken: opts.bearerToken } : {}),
|
|
327
|
+
...(opts?.headers && Object.keys(opts.headers).length
|
|
328
|
+
? { headers: opts.headers }
|
|
329
|
+
: {}),
|
|
330
|
+
});
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=facade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facade.js","sourceRoot":"","sources":["../src/facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O4r3 — bind Hono `/mcp` (SDK McpServer) → façade `create*BrandMcp`.
|
|
3
|
+
*
|
|
4
|
+
* Un seul SoT handlers : `facade.callTool`. Hono ne garde que transport,
|
|
5
|
+
* auth Bearer, policies admin — pas de second registre métier.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpFacade } from "./facade.js";
|
|
8
|
+
import type { McpPublicSurfaceMode, McpToolCallResult } from "./types.js";
|
|
9
|
+
/** Shape minimal compatible `@modelcontextprotocol/sdk` registerTool result. */
|
|
10
|
+
export type HonoMcpSdkResult = {
|
|
11
|
+
content: Array<{
|
|
12
|
+
type: "text";
|
|
13
|
+
text: string;
|
|
14
|
+
}>;
|
|
15
|
+
isError?: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type HonoMcpToolRegisterFn = (name: string, config: {
|
|
18
|
+
title?: string;
|
|
19
|
+
description: string;
|
|
20
|
+
inputSchema?: Record<string, unknown>;
|
|
21
|
+
}, handler: (input: Record<string, unknown>) => Promise<HonoMcpSdkResult>) => void;
|
|
22
|
+
export type BindFacadeToolsToHonoOptions = {
|
|
23
|
+
/** Surface listTools (défaut legacy-preferred — aligné marques TF/CV/Fidu). */
|
|
24
|
+
publicSurface?: McpPublicSurfaceMode;
|
|
25
|
+
/**
|
|
26
|
+
* Si fourni : n'enregistrer que ces noms (ex. `MCP_TOOL_REGISTRY`).
|
|
27
|
+
* Permet de garder policies admin / scopes sur un sous-ensemble.
|
|
28
|
+
*/
|
|
29
|
+
allowNames?: ReadonlySet<string> | readonly string[];
|
|
30
|
+
/** Exclure des noms même s'ils sont dans listTools (host-only ailleurs). */
|
|
31
|
+
excludeNames?: ReadonlySet<string> | readonly string[];
|
|
32
|
+
/**
|
|
33
|
+
* Hook avant/après callTool — policies, audit (ex. `registerMcpTool` wrap).
|
|
34
|
+
* Si omis : enregistrement direct via `registerTool`.
|
|
35
|
+
*/
|
|
36
|
+
registerTool?: HonoMcpToolRegisterFn;
|
|
37
|
+
};
|
|
38
|
+
/** Convertit `McpToolCallResult` → payload tools/call SDK. */
|
|
39
|
+
export declare function mcpFacadeResultToSdk(result: McpToolCallResult): HonoMcpSdkResult;
|
|
40
|
+
/**
|
|
41
|
+
* Enregistre sur le binder Hono tous les tools publics de la façade.
|
|
42
|
+
* Dispatch = `facade.callTool` (aliases résolus par la façade).
|
|
43
|
+
*/
|
|
44
|
+
export declare function bindFacadeToolsToHono(facade: McpFacade, registerTool: HonoMcpToolRegisterFn, options?: BindFacadeToolsToHonoOptions): Promise<{
|
|
45
|
+
registered: string[];
|
|
46
|
+
skipped: string[];
|
|
47
|
+
}>;
|
|
48
|
+
//# sourceMappingURL=hono-bind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-bind.d.ts","sourceRoot":"","sources":["../src/hono-bind.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IACN,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,gBAAgB,CAAC,KACnE,IAAI,CAAC;AAEV,MAAM,MAAM,4BAA4B,GAAG;IACzC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,MAAM,EAAE,CAAC;IACrD,4EAA4E;IAC5E,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,MAAM,EAAE,CAAC;IACvD;;;OAGG;IACH,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,CAAC;AASF,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,GACxB,gBAAgB,CAoBlB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,qBAAqB,EACnC,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0CtD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O4r3 — bind Hono `/mcp` (SDK McpServer) → façade `create*BrandMcp`.
|
|
3
|
+
*
|
|
4
|
+
* Un seul SoT handlers : `facade.callTool`. Hono ne garde que transport,
|
|
5
|
+
* auth Bearer, policies admin — pas de second registre métier.
|
|
6
|
+
*/
|
|
7
|
+
function toSet(names) {
|
|
8
|
+
if (!names)
|
|
9
|
+
return null;
|
|
10
|
+
return names instanceof Set ? names : new Set(names);
|
|
11
|
+
}
|
|
12
|
+
/** Convertit `McpToolCallResult` → payload tools/call SDK. */
|
|
13
|
+
export function mcpFacadeResultToSdk(result) {
|
|
14
|
+
if (!result.ok) {
|
|
15
|
+
return {
|
|
16
|
+
content: [
|
|
17
|
+
{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: JSON.stringify({ error: result.error || "tool_failed" }),
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
isError: true,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: "text",
|
|
29
|
+
text: JSON.stringify(result.content ?? { ok: true }, null, 1),
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Enregistre sur le binder Hono tous les tools publics de la façade.
|
|
36
|
+
* Dispatch = `facade.callTool` (aliases résolus par la façade).
|
|
37
|
+
*/
|
|
38
|
+
export async function bindFacadeToolsToHono(facade, registerTool, options = {}) {
|
|
39
|
+
const allow = toSet(options.allowNames);
|
|
40
|
+
const exclude = toSet(options.excludeNames);
|
|
41
|
+
const listed = await facade.listTools({
|
|
42
|
+
publicSurface: options.publicSurface ?? "legacy-preferred",
|
|
43
|
+
});
|
|
44
|
+
const registered = [];
|
|
45
|
+
const skipped = [];
|
|
46
|
+
for (const tool of listed.tools) {
|
|
47
|
+
if (allow && !allow.has(tool.name)) {
|
|
48
|
+
skipped.push(tool.name);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (exclude && exclude.has(tool.name)) {
|
|
52
|
+
skipped.push(tool.name);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const description = tool.description || `Tool MCP ${tool.name} (façade marque)`;
|
|
56
|
+
registerTool(tool.name, {
|
|
57
|
+
title: tool.name,
|
|
58
|
+
description,
|
|
59
|
+
// Pas de JSON Schema ici : le SDK MCP attend Zod ; args validés côté handler façade.
|
|
60
|
+
}, async (input) => {
|
|
61
|
+
const result = await facade.callTool(tool.name, (input && typeof input === "object"
|
|
62
|
+
? input
|
|
63
|
+
: {}));
|
|
64
|
+
return mcpFacadeResultToSdk(result);
|
|
65
|
+
});
|
|
66
|
+
registered.push(tool.name);
|
|
67
|
+
}
|
|
68
|
+
return { registered, skipped };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=hono-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-bind.js","sourceRoot":"","sources":["../src/hono-bind.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0CH,SAAS,KAAK,CACZ,KAA0D;IAE1D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAClC,MAAyB;IAEzB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC;iBAC/D;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC9D;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAiB,EACjB,YAAmC,EACnC,UAAwC,EAAE;IAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,kBAAkB;KAC3D,CAAC,CAAC;IACH,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAA4B,EAAE,CAAC;QACvD,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,IAAI,YAAY,IAAI,CAAC,IAAI,kBAAkB,CAAC;QAE9D,YAAY,CACV,IAAI,CAAC,IAAI,EACT;YACE,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,WAAW;YACX,qFAAqF;SACtF,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAClC,IAAI,CAAC,IAAI,EACT,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBACjC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,EAAE,CAA4B,CACnC,CAAC;YACF,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CACF,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy façade Electron → Hono `/mcp` (D1/C2 → M9 SoT kit).
|
|
3
|
+
*
|
|
4
|
+
* Parle le transport Streamable HTTP JSON (même shape que test-mcp-oauth).
|
|
5
|
+
* Si l'upstream est absent ou en erreur et `fallbackLocal`, délègue à la
|
|
6
|
+
* façade locale (brand mounts) — zéro perte offline / tests.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpFacade } from "./facade.js";
|
|
9
|
+
import { type McpFacadeMode, type McpUpstreamRef } from "./runtime.js";
|
|
10
|
+
import type { McpToolCallResult, McpToolDefinition, McpToolsBySpace } from "./types.js";
|
|
11
|
+
export type WrapMcpFacadeWithHonoProxyOptions = {
|
|
12
|
+
local: McpFacade;
|
|
13
|
+
upstream: McpUpstreamRef;
|
|
14
|
+
/** Défaut `hono-preferred` (proxy si upstream, sinon local). */
|
|
15
|
+
mode?: McpFacadeMode;
|
|
16
|
+
/** Si proxy échoue, retomber sur local (défaut true sauf mode hono-proxy strict). */
|
|
17
|
+
fallbackLocal?: boolean;
|
|
18
|
+
/** clientInfo JSON-RPC (défaut creezio-mcp-proxy). */
|
|
19
|
+
clientName?: string;
|
|
20
|
+
clientVersion?: string;
|
|
21
|
+
};
|
|
22
|
+
type JsonRpcOk = {
|
|
23
|
+
result?: {
|
|
24
|
+
tools?: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
}>;
|
|
28
|
+
content?: Array<{
|
|
29
|
+
type: string;
|
|
30
|
+
text?: string;
|
|
31
|
+
}>;
|
|
32
|
+
isError?: boolean;
|
|
33
|
+
serverInfo?: {
|
|
34
|
+
name?: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
error?: {
|
|
38
|
+
message?: string;
|
|
39
|
+
code?: number;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
declare function mcpJsonRpc(baseUrl: string, apiKey: string | null, body: Record<string, unknown>): Promise<{
|
|
43
|
+
status: number;
|
|
44
|
+
json: JsonRpcOk | null;
|
|
45
|
+
text: string;
|
|
46
|
+
}>;
|
|
47
|
+
declare function honoListTools(baseUrl: string, apiKey: string | null, clientName: string, clientVersion: string): Promise<McpToolDefinition[]>;
|
|
48
|
+
declare function honoCallTool(baseUrl: string, apiKey: string | null, name: string, args: Record<string, unknown>, clientName: string, clientVersion: string): Promise<McpToolCallResult>;
|
|
49
|
+
declare function groupBySpace(defs: McpToolDefinition[]): McpToolsBySpace;
|
|
50
|
+
/**
|
|
51
|
+
* Enrobe une façade locale : dès qu'un upstream Hono est disponible
|
|
52
|
+
* (mode hono-proxy / hono-preferred), list/call passent par `/mcp`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function wrapMcpFacadeWithHonoProxy(opts: WrapMcpFacadeWithHonoProxyOptions): McpFacade;
|
|
55
|
+
/** Helpers testables sans façade complète. */
|
|
56
|
+
export declare const __mcpHonoProxyTest: {
|
|
57
|
+
honoListTools: typeof honoListTools;
|
|
58
|
+
honoCallTool: typeof honoCallTool;
|
|
59
|
+
groupBySpace: typeof groupBySpace;
|
|
60
|
+
mcpJsonRpc: typeof mcpJsonRpc;
|
|
61
|
+
};
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=hono-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-proxy.d.ts","sourceRoot":"","sources":["../src/hono-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iCAAiC,GAAG;IAC9C,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACtD,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjD,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAChC,CAAC;IACF,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,iBAAe,UAAU,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBnE;AAaD,iBAAe,aAAa,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4B9B;AAED,iBAAe,YAAY,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAyC5B;AAED,iBAAS,YAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAWhE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,iCAAiC,GACtC,SAAS,CAkEX;AAED,8CAA8C;AAC9C,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC"}
|