@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":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Injection host pour mcp-admin (évite imports `@/` marque).
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.configureMcpAdmin = configureMcpAdmin;
|
|
7
|
+
exports.getMcpAdminAdapters = getMcpAdminAdapters;
|
|
8
|
+
exports.isMcpAdminConfigured = isMcpAdminConfigured;
|
|
9
|
+
exports.resetMcpAdminAdaptersForTests = resetMcpAdminAdaptersForTests;
|
|
10
|
+
let adapters = null;
|
|
11
|
+
function configureMcpAdmin(next) {
|
|
12
|
+
adapters = next;
|
|
13
|
+
}
|
|
14
|
+
function getMcpAdminAdapters() {
|
|
15
|
+
if (!adapters) {
|
|
16
|
+
throw new Error("@creezio/mcp-admin: configureMcpAdmin({ getDb, getWriteDb, … }) requis avant usage");
|
|
17
|
+
}
|
|
18
|
+
return adapters;
|
|
19
|
+
}
|
|
20
|
+
/** True si `configureMcpAdmin` a été câblé (garde opt-in non cassante). */
|
|
21
|
+
function isMcpAdminConfigured() {
|
|
22
|
+
return adapters !== null;
|
|
23
|
+
}
|
|
24
|
+
function resetMcpAdminAdaptersForTests() {
|
|
25
|
+
adapters = null;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/admin/adapters.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,8CAEC;AAED,kDAOC;AAGD,oDAEC;AAED,sEAEC;AAtBD,IAAI,QAAQ,GAA4B,IAAI,CAAC;AAE7C,SAAgB,iBAAiB,CAAC,IAAsB;IACtD,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,SAAgB,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,SAAgB,oBAAoB;IAClC,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED,SAAgB,6BAA6B;IAC3C,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpAdminRoutes = createMcpAdminRoutes;
|
|
4
|
+
/**
|
|
5
|
+
* Routes Hono Admin MCP (port TempoFlow — N6).
|
|
6
|
+
* Auth owner reste côté marque (montage sous /admin).
|
|
7
|
+
*/
|
|
8
|
+
const hono_1 = require("hono");
|
|
9
|
+
const mcp_admin_js_1 = require("./mcp-admin.js");
|
|
10
|
+
const adapters_js_1 = require("./adapters.js");
|
|
11
|
+
function createMcpAdminRoutes(opts = {}) {
|
|
12
|
+
const app = new hono_1.Hono();
|
|
13
|
+
app.get("/mcp/status", (c) => c.json((0, mcp_admin_js_1.mcpAdminStatus)()));
|
|
14
|
+
app.get("/mcp/tools", (c) => c.json({ tools: (0, mcp_admin_js_1.listMcpToolPolicies)() }));
|
|
15
|
+
app.get("/mcp/clients", (c) => c.json({ clients: (0, mcp_admin_js_1.listMcpClients)() }));
|
|
16
|
+
app.get("/mcp/diagnostics", (c) => c.json((0, mcp_admin_js_1.mcpDiagnostics)()));
|
|
17
|
+
app.get("/mcp/metrics", (c) => c.json((0, mcp_admin_js_1.mcpMetrics)()));
|
|
18
|
+
app.get("/mcp/audit-logs", (c) => c.json({ logs: (0, mcp_admin_js_1.listMcpAuditLogs)(Number(c.req.query("limit")) || 200) }));
|
|
19
|
+
app.get("/mcp/diagnostics/export", (c) => {
|
|
20
|
+
const prefix = opts.diagnosticFilenamePrefix ||
|
|
21
|
+
(0, adapters_js_1.getMcpAdminAdapters)().diagnosticFilenamePrefix ||
|
|
22
|
+
"creezio";
|
|
23
|
+
c.header("Content-Disposition", `attachment; filename="${prefix}-mcp-diagnostic-${new Date().toISOString().slice(0, 10)}.json"`);
|
|
24
|
+
return c.json((0, mcp_admin_js_1.exportMcpDiagnostics)());
|
|
25
|
+
});
|
|
26
|
+
app.patch("/mcp/policies/:tool", async (c) => {
|
|
27
|
+
let body;
|
|
28
|
+
try {
|
|
29
|
+
body = await c.req.json();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return c.json({ error: "JSON attendu" }, 400);
|
|
33
|
+
}
|
|
34
|
+
const policy = (0, mcp_admin_js_1.updateMcpToolPolicy)(c.req.param("tool"), body);
|
|
35
|
+
if (!policy)
|
|
36
|
+
return c.json({ error: "Tool inconnu" }, 404);
|
|
37
|
+
return c.json({ policy });
|
|
38
|
+
});
|
|
39
|
+
app.patch("/mcp/clients/:clientId", async (c) => {
|
|
40
|
+
let body;
|
|
41
|
+
try {
|
|
42
|
+
body = await c.req.json();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return c.json({ error: "JSON attendu" }, 400);
|
|
46
|
+
}
|
|
47
|
+
if (typeof body.enabled !== "boolean") {
|
|
48
|
+
return c.json({ error: "enabled booléen requis" }, 400);
|
|
49
|
+
}
|
|
50
|
+
const ok = (0, mcp_admin_js_1.setMcpClientEnabled)(c.req.param("clientId"), body.enabled);
|
|
51
|
+
return ok ? c.json({ ok: true }) : c.json({ error: "Client introuvable" }, 404);
|
|
52
|
+
});
|
|
53
|
+
app.delete("/mcp/clients/:clientId", (c) => {
|
|
54
|
+
const ok = (0, mcp_admin_js_1.revokeMcpClient)(c.req.param("clientId"));
|
|
55
|
+
return ok ? c.json({ ok: true }) : c.json({ error: "Client introuvable" }, 404);
|
|
56
|
+
});
|
|
57
|
+
app.post("/mcp/clients/:clientId/rotate-secret", (c) => {
|
|
58
|
+
const result = (0, mcp_admin_js_1.rotateMcpClientSecret)(c.req.param("clientId"));
|
|
59
|
+
if (!result) {
|
|
60
|
+
return c.json({ error: "Client introuvable, révoqué ou public (sans secret)" }, 400);
|
|
61
|
+
}
|
|
62
|
+
return c.json({
|
|
63
|
+
clientSecret: result.clientSecret,
|
|
64
|
+
warning: "Ce secret ne sera plus affiché. Les refresh tokens précédents sont révoqués.",
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
return app;
|
|
68
|
+
}
|
|
69
|
+
//# 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,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP admin — policies, clients OAuth, diagnostics, routes Hono (N6).
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerGuardedMcpTool = exports.getStoredMcpToolPolicy = exports.createToolPolicyAuthorize = exports.checkToolPolicy = exports.createMcpAdminRoutes = exports.exportMcpDiagnostics = exports.pruneMcpAuditLogs = exports.listMcpAuditLogs = exports.auditMcpAdmin = exports.mcpMetrics = exports.mcpDiagnostics = exports.mcpAdminStatus = exports.touchMcpClient = exports.clientCanAuthenticate = exports.rotateMcpClientSecret = exports.revokeMcpClient = exports.setMcpClientEnabled = exports.listMcpClients = exports.updateMcpToolPolicy = exports.filterListedToolsByEnabledPolicy = exports.disabledMcpToolPolicyNames = exports.getMcpToolPolicy = exports.listMcpToolPolicies = exports.seedMcpToolPolicies = exports.ensureMcpAdminSchema = exports.resetMcpAdminAdaptersForTests = exports.isMcpAdminConfigured = exports.getMcpAdminAdapters = exports.configureMcpAdmin = void 0;
|
|
7
|
+
var adapters_js_1 = require("./adapters.js");
|
|
8
|
+
Object.defineProperty(exports, "configureMcpAdmin", { enumerable: true, get: function () { return adapters_js_1.configureMcpAdmin; } });
|
|
9
|
+
Object.defineProperty(exports, "getMcpAdminAdapters", { enumerable: true, get: function () { return adapters_js_1.getMcpAdminAdapters; } });
|
|
10
|
+
Object.defineProperty(exports, "isMcpAdminConfigured", { enumerable: true, get: function () { return adapters_js_1.isMcpAdminConfigured; } });
|
|
11
|
+
Object.defineProperty(exports, "resetMcpAdminAdaptersForTests", { enumerable: true, get: function () { return adapters_js_1.resetMcpAdminAdaptersForTests; } });
|
|
12
|
+
var mcp_admin_js_1 = require("./mcp-admin.js");
|
|
13
|
+
Object.defineProperty(exports, "ensureMcpAdminSchema", { enumerable: true, get: function () { return mcp_admin_js_1.ensureMcpAdminSchema; } });
|
|
14
|
+
Object.defineProperty(exports, "seedMcpToolPolicies", { enumerable: true, get: function () { return mcp_admin_js_1.seedMcpToolPolicies; } });
|
|
15
|
+
Object.defineProperty(exports, "listMcpToolPolicies", { enumerable: true, get: function () { return mcp_admin_js_1.listMcpToolPolicies; } });
|
|
16
|
+
Object.defineProperty(exports, "getMcpToolPolicy", { enumerable: true, get: function () { return mcp_admin_js_1.getMcpToolPolicy; } });
|
|
17
|
+
Object.defineProperty(exports, "disabledMcpToolPolicyNames", { enumerable: true, get: function () { return mcp_admin_js_1.disabledMcpToolPolicyNames; } });
|
|
18
|
+
Object.defineProperty(exports, "filterListedToolsByEnabledPolicy", { enumerable: true, get: function () { return mcp_admin_js_1.filterListedToolsByEnabledPolicy; } });
|
|
19
|
+
Object.defineProperty(exports, "updateMcpToolPolicy", { enumerable: true, get: function () { return mcp_admin_js_1.updateMcpToolPolicy; } });
|
|
20
|
+
Object.defineProperty(exports, "listMcpClients", { enumerable: true, get: function () { return mcp_admin_js_1.listMcpClients; } });
|
|
21
|
+
Object.defineProperty(exports, "setMcpClientEnabled", { enumerable: true, get: function () { return mcp_admin_js_1.setMcpClientEnabled; } });
|
|
22
|
+
Object.defineProperty(exports, "revokeMcpClient", { enumerable: true, get: function () { return mcp_admin_js_1.revokeMcpClient; } });
|
|
23
|
+
Object.defineProperty(exports, "rotateMcpClientSecret", { enumerable: true, get: function () { return mcp_admin_js_1.rotateMcpClientSecret; } });
|
|
24
|
+
Object.defineProperty(exports, "clientCanAuthenticate", { enumerable: true, get: function () { return mcp_admin_js_1.clientCanAuthenticate; } });
|
|
25
|
+
Object.defineProperty(exports, "touchMcpClient", { enumerable: true, get: function () { return mcp_admin_js_1.touchMcpClient; } });
|
|
26
|
+
Object.defineProperty(exports, "mcpAdminStatus", { enumerable: true, get: function () { return mcp_admin_js_1.mcpAdminStatus; } });
|
|
27
|
+
Object.defineProperty(exports, "mcpDiagnostics", { enumerable: true, get: function () { return mcp_admin_js_1.mcpDiagnostics; } });
|
|
28
|
+
Object.defineProperty(exports, "mcpMetrics", { enumerable: true, get: function () { return mcp_admin_js_1.mcpMetrics; } });
|
|
29
|
+
Object.defineProperty(exports, "auditMcpAdmin", { enumerable: true, get: function () { return mcp_admin_js_1.auditMcpAdmin; } });
|
|
30
|
+
Object.defineProperty(exports, "listMcpAuditLogs", { enumerable: true, get: function () { return mcp_admin_js_1.listMcpAuditLogs; } });
|
|
31
|
+
Object.defineProperty(exports, "pruneMcpAuditLogs", { enumerable: true, get: function () { return mcp_admin_js_1.pruneMcpAuditLogs; } });
|
|
32
|
+
Object.defineProperty(exports, "exportMcpDiagnostics", { enumerable: true, get: function () { return mcp_admin_js_1.exportMcpDiagnostics; } });
|
|
33
|
+
var http_routes_js_1 = require("./http-routes.js");
|
|
34
|
+
Object.defineProperty(exports, "createMcpAdminRoutes", { enumerable: true, get: function () { return http_routes_js_1.createMcpAdminRoutes; } });
|
|
35
|
+
var tool_policy_guard_js_1 = require("./tool-policy-guard.js");
|
|
36
|
+
Object.defineProperty(exports, "checkToolPolicy", { enumerable: true, get: function () { return tool_policy_guard_js_1.checkToolPolicy; } });
|
|
37
|
+
Object.defineProperty(exports, "createToolPolicyAuthorize", { enumerable: true, get: function () { return tool_policy_guard_js_1.createToolPolicyAuthorize; } });
|
|
38
|
+
Object.defineProperty(exports, "getStoredMcpToolPolicy", { enumerable: true, get: function () { return tool_policy_guard_js_1.getStoredMcpToolPolicy; } });
|
|
39
|
+
Object.defineProperty(exports, "registerGuardedMcpTool", { enumerable: true, get: function () { return tool_policy_guard_js_1.registerGuardedMcpTool; } });
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAUH,6CAKuB;AAJrB,gHAAA,iBAAiB,OAAA;AACjB,kHAAA,mBAAmB,OAAA;AACnB,mHAAA,oBAAoB,OAAA;AACpB,4HAAA,6BAA6B,OAAA;AAQ/B,+CAqBwB;AApBtB,oHAAA,oBAAoB,OAAA;AACpB,mHAAA,mBAAmB,OAAA;AACnB,mHAAA,mBAAmB,OAAA;AACnB,gHAAA,gBAAgB,OAAA;AAChB,0HAAA,0BAA0B,OAAA;AAC1B,gIAAA,gCAAgC,OAAA;AAChC,mHAAA,mBAAmB,OAAA;AACnB,8GAAA,cAAc,OAAA;AACd,mHAAA,mBAAmB,OAAA;AACnB,+GAAA,eAAe,OAAA;AACf,qHAAA,qBAAqB,OAAA;AACrB,qHAAA,qBAAqB,OAAA;AACrB,8GAAA,cAAc,OAAA;AACd,8GAAA,cAAc,OAAA;AACd,8GAAA,cAAc,OAAA;AACd,0GAAA,UAAU,OAAA;AACV,6GAAA,aAAa,OAAA;AACb,gHAAA,gBAAgB,OAAA;AAChB,iHAAA,iBAAiB,OAAA;AACjB,oHAAA,oBAAoB,OAAA;AAItB,mDAAwD;AAA/C,sHAAA,oBAAoB,OAAA;AAe7B,+DAKgC;AAJ9B,uHAAA,eAAe,OAAA;AACf,iIAAA,yBAAyB,OAAA;AACzB,8HAAA,sBAAsB,OAAA;AACtB,8HAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureMcpAdminSchema = ensureMcpAdminSchema;
|
|
4
|
+
exports.seedMcpToolPolicies = seedMcpToolPolicies;
|
|
5
|
+
exports.listMcpToolPolicies = listMcpToolPolicies;
|
|
6
|
+
exports.getMcpToolPolicy = getMcpToolPolicy;
|
|
7
|
+
exports.disabledMcpToolPolicyNames = disabledMcpToolPolicyNames;
|
|
8
|
+
exports.filterListedToolsByEnabledPolicy = filterListedToolsByEnabledPolicy;
|
|
9
|
+
exports.updateMcpToolPolicy = updateMcpToolPolicy;
|
|
10
|
+
exports.listMcpClients = listMcpClients;
|
|
11
|
+
exports.setMcpClientEnabled = setMcpClientEnabled;
|
|
12
|
+
exports.revokeMcpClient = revokeMcpClient;
|
|
13
|
+
exports.rotateMcpClientSecret = rotateMcpClientSecret;
|
|
14
|
+
exports.clientCanAuthenticate = clientCanAuthenticate;
|
|
15
|
+
exports.touchMcpClient = touchMcpClient;
|
|
16
|
+
exports.mcpAdminStatus = mcpAdminStatus;
|
|
17
|
+
exports.mcpDiagnostics = mcpDiagnostics;
|
|
18
|
+
exports.mcpMetrics = mcpMetrics;
|
|
19
|
+
exports.auditMcpAdmin = auditMcpAdmin;
|
|
20
|
+
exports.listMcpAuditLogs = listMcpAuditLogs;
|
|
21
|
+
exports.pruneMcpAuditLogs = pruneMcpAuditLogs;
|
|
22
|
+
exports.exportMcpDiagnostics = exportMcpDiagnostics;
|
|
23
|
+
const node_crypto_1 = require("node:crypto");
|
|
24
|
+
const adapters_js_1 = require("./adapters.js");
|
|
25
|
+
function getDb() {
|
|
26
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().getDb();
|
|
27
|
+
}
|
|
28
|
+
function getWriteDb() {
|
|
29
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().getWriteDb();
|
|
30
|
+
}
|
|
31
|
+
function tableExists(name) {
|
|
32
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().tableExists(name);
|
|
33
|
+
}
|
|
34
|
+
function MCP_TOOL_REGISTRY() {
|
|
35
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().listTools();
|
|
36
|
+
}
|
|
37
|
+
function mcpOauthReady() {
|
|
38
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().mcpOauthReady();
|
|
39
|
+
}
|
|
40
|
+
function resolveMcpPublicUrl() {
|
|
41
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().resolveMcpPublicUrl();
|
|
42
|
+
}
|
|
43
|
+
function listRequestLogs(opts) {
|
|
44
|
+
const fn = (0, adapters_js_1.getMcpAdminAdapters)().listRequestLogs;
|
|
45
|
+
return fn ? fn(opts) : { logs: [] };
|
|
46
|
+
}
|
|
47
|
+
let schemaEnsured = false;
|
|
48
|
+
/** Rôles acceptés dans les policies (adapters, défaut historique). */
|
|
49
|
+
function policyRoleNames() {
|
|
50
|
+
return (0, adapters_js_1.getMcpAdminAdapters)().policyRoleNames || ["owner", "collaborator"];
|
|
51
|
+
}
|
|
52
|
+
/** Scopes acceptés dans les policies (adapters, défaut historique). */
|
|
53
|
+
function policyScopeNames() {
|
|
54
|
+
return ((0, adapters_js_1.getMcpAdminAdapters)().policyScopeNames || [
|
|
55
|
+
"crm",
|
|
56
|
+
"crm:read",
|
|
57
|
+
"crm:write",
|
|
58
|
+
"full",
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
function hasColumn(table, column) {
|
|
62
|
+
if (!tableExists(table))
|
|
63
|
+
return false;
|
|
64
|
+
return getDb()
|
|
65
|
+
.prepare(`PRAGMA table_info("${table.replaceAll('"', '""')}")`)
|
|
66
|
+
.all().some((item) => item.name === column);
|
|
67
|
+
}
|
|
68
|
+
function ensureMcpAdminSchema() {
|
|
69
|
+
if (schemaEnsured)
|
|
70
|
+
return;
|
|
71
|
+
const db = getWriteDb();
|
|
72
|
+
if (tableExists("mcp_oauth_clients")) {
|
|
73
|
+
if (!hasColumn("mcp_oauth_clients", "enabled")) {
|
|
74
|
+
db.exec(`ALTER TABLE mcp_oauth_clients ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1`);
|
|
75
|
+
}
|
|
76
|
+
if (!hasColumn("mcp_oauth_clients", "revoked_at")) {
|
|
77
|
+
db.exec(`ALTER TABLE mcp_oauth_clients ADD COLUMN revoked_at TEXT`);
|
|
78
|
+
}
|
|
79
|
+
if (!hasColumn("mcp_oauth_clients", "last_used_at")) {
|
|
80
|
+
db.exec(`ALTER TABLE mcp_oauth_clients ADD COLUMN last_used_at TEXT`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (tableExists("mcp_tool_policies") &&
|
|
84
|
+
!hasColumn("mcp_tool_policies", "admin_override")) {
|
|
85
|
+
db.exec(`ALTER TABLE mcp_tool_policies ADD COLUMN admin_override INTEGER NOT NULL DEFAULT 0`);
|
|
86
|
+
}
|
|
87
|
+
db.exec(`
|
|
88
|
+
CREATE TABLE IF NOT EXISTS mcp_tool_policies (
|
|
89
|
+
tool_name TEXT PRIMARY KEY,
|
|
90
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
91
|
+
allowed_roles TEXT NOT NULL DEFAULT 'owner,collaborator',
|
|
92
|
+
allowed_scopes TEXT NOT NULL DEFAULT '',
|
|
93
|
+
-- 1 si l'admin a explicitement fixé enabled (updateMcpToolPolicy) —
|
|
94
|
+
-- distingue une désactivation admin du seed par défaut
|
|
95
|
+
-- (mcpPublishDefault=false → enabled=0 « non publié par défaut »).
|
|
96
|
+
admin_override INTEGER NOT NULL DEFAULT 0,
|
|
97
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
98
|
+
);
|
|
99
|
+
CREATE TABLE IF NOT EXISTS mcp_audit_logs (
|
|
100
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
101
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
102
|
+
event TEXT NOT NULL,
|
|
103
|
+
actor TEXT,
|
|
104
|
+
client_id TEXT,
|
|
105
|
+
tool_name TEXT,
|
|
106
|
+
outcome TEXT NOT NULL DEFAULT 'ok',
|
|
107
|
+
detail_json TEXT
|
|
108
|
+
);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_mcp_audit_created ON mcp_audit_logs(created_at);
|
|
110
|
+
`);
|
|
111
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO mcp_tool_policies
|
|
112
|
+
(tool_name, enabled, allowed_roles, allowed_scopes)
|
|
113
|
+
VALUES (?, ?, ?, ?)`);
|
|
114
|
+
const seedFn = () => {
|
|
115
|
+
for (const tool of MCP_TOOL_REGISTRY()) {
|
|
116
|
+
const roles = (tool.defaultRoles || policyRoleNames()).join(",");
|
|
117
|
+
const enabled = tool.mcpPublishDefault === false ? 0 : 1;
|
|
118
|
+
insert.run(tool.name, enabled, roles, tool.requiredScope);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
if (db.transaction)
|
|
122
|
+
db.transaction(seedFn)();
|
|
123
|
+
else
|
|
124
|
+
seedFn();
|
|
125
|
+
pruneMcpAuditLogs();
|
|
126
|
+
schemaEnsured = true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Seed permissif (INSERT OR IGNORE) de policies pour des tools hors registre
|
|
130
|
+
* adapters — ex. tools de `facade.listTools()` quand la garde M2 est activée
|
|
131
|
+
* sur une façade marque. Ne modifie JAMAIS une policy existante.
|
|
132
|
+
*/
|
|
133
|
+
function seedMcpToolPolicies(tools) {
|
|
134
|
+
ensureMcpAdminSchema();
|
|
135
|
+
const db = getWriteDb();
|
|
136
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO mcp_tool_policies
|
|
137
|
+
(tool_name, enabled, allowed_roles, allowed_scopes)
|
|
138
|
+
VALUES (?, ?, ?, ?)`);
|
|
139
|
+
const run = () => {
|
|
140
|
+
for (const tool of tools) {
|
|
141
|
+
if (!tool?.name)
|
|
142
|
+
continue;
|
|
143
|
+
const roles = (tool.defaultRoles || policyRoleNames()).join(",");
|
|
144
|
+
const enabled = tool.mcpPublishDefault === false ? 0 : 1;
|
|
145
|
+
insert.run(tool.name, enabled, roles, tool.requiredScope || "");
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
if (db.transaction)
|
|
149
|
+
db.transaction(run)();
|
|
150
|
+
else
|
|
151
|
+
run();
|
|
152
|
+
}
|
|
153
|
+
function listMcpToolPolicies() {
|
|
154
|
+
ensureMcpAdminSchema();
|
|
155
|
+
const rows = getDb()
|
|
156
|
+
.prepare(`SELECT tool_name, enabled, allowed_roles, allowed_scopes, updated_at
|
|
157
|
+
FROM mcp_tool_policies`)
|
|
158
|
+
.all();
|
|
159
|
+
const policy = new Map(rows.map((row) => [row.tool_name, row]));
|
|
160
|
+
return MCP_TOOL_REGISTRY().map((tool) => {
|
|
161
|
+
const row = policy.get(tool.name);
|
|
162
|
+
const defaultEnabled = tool.mcpPublishDefault !== false;
|
|
163
|
+
return {
|
|
164
|
+
...tool,
|
|
165
|
+
enabled: row ? row.enabled !== 0 : defaultEnabled,
|
|
166
|
+
allowedRoles: (row?.allowed_roles || policyRoleNames().join(","))
|
|
167
|
+
.split(",")
|
|
168
|
+
.filter(Boolean),
|
|
169
|
+
allowedScopes: (row?.allowed_scopes || tool.requiredScope).split(/[\s,]+/).filter(Boolean),
|
|
170
|
+
updatedAt: row?.updated_at || null,
|
|
171
|
+
};
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function getMcpToolPolicy(name) {
|
|
175
|
+
return listMcpToolPolicies().find((tool) => tool.name === name) || null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Noms désactivés PAR L'ADMIN (`enabled=0` ET `admin_override=1`).
|
|
179
|
+
*
|
|
180
|
+
* Les lignes `enabled=0` seedées par défaut (`mcpPublishDefault=false` —
|
|
181
|
+
* ex. toute op module sans opt-in publish, cf.
|
|
182
|
+
* `generateModuleToolsFromOperations`) ne comptent PAS : elles signifient
|
|
183
|
+
* « non publié par défaut aux clients MCP externes », pas « désactivé » —
|
|
184
|
+
* les masquer vidait `listTools`/`GET /mcp` des tools métier (régression
|
|
185
|
+
* 0.17.1, vue par les gates module des marques). Admin non câblé / erreur
|
|
186
|
+
* DB → ensemble vide (pas de filtre).
|
|
187
|
+
*/
|
|
188
|
+
function disabledMcpToolPolicyNames() {
|
|
189
|
+
try {
|
|
190
|
+
ensureMcpAdminSchema();
|
|
191
|
+
const rows = getDb()
|
|
192
|
+
.prepare(`SELECT tool_name FROM mcp_tool_policies
|
|
193
|
+
WHERE enabled = 0 AND admin_override = 1`)
|
|
194
|
+
.all();
|
|
195
|
+
return new Set(rows.map((row) => row.tool_name));
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return new Set();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** Retire de `listTools` les tools (et alias) désactivés en admin MCP. */
|
|
202
|
+
function filterListedToolsByEnabledPolicy(tools, aliases = {}) {
|
|
203
|
+
const disabled = disabledMcpToolPolicyNames();
|
|
204
|
+
if (disabled.size === 0)
|
|
205
|
+
return tools;
|
|
206
|
+
for (const [alias, canonical] of Object.entries(aliases)) {
|
|
207
|
+
if (disabled.has(alias))
|
|
208
|
+
disabled.add(canonical);
|
|
209
|
+
if (disabled.has(canonical))
|
|
210
|
+
disabled.add(alias);
|
|
211
|
+
}
|
|
212
|
+
return tools.filter((tool) => !disabled.has(tool.name) &&
|
|
213
|
+
!(tool.aliasOf && disabled.has(tool.aliasOf)));
|
|
214
|
+
}
|
|
215
|
+
function updateMcpToolPolicy(name, input) {
|
|
216
|
+
ensureMcpAdminSchema();
|
|
217
|
+
if (!MCP_TOOL_REGISTRY().some((tool) => tool.name === name))
|
|
218
|
+
return null;
|
|
219
|
+
const current = getMcpToolPolicy(name);
|
|
220
|
+
// Rôles/scopes acceptés : injectés par la marque via les adapters
|
|
221
|
+
// (défauts = comportement historique TempoFlow, zéro breaking change).
|
|
222
|
+
const roles = (input.allowedRoles || current.allowedRoles).filter((role) => policyRoleNames().includes(role));
|
|
223
|
+
const scopes = (input.allowedScopes || current.allowedScopes).filter((scope) => policyScopeNames().includes(scope));
|
|
224
|
+
// `admin_override` ne se pose QUE sur une action explicite sur `enabled`
|
|
225
|
+
// (une édition rôles/scopes ne requalifie pas un seed par défaut en
|
|
226
|
+
// désactivation admin) — consommé par disabledMcpToolPolicyNames().
|
|
227
|
+
getWriteDb()
|
|
228
|
+
.prepare(`UPDATE mcp_tool_policies
|
|
229
|
+
SET enabled = ?, allowed_roles = ?, allowed_scopes = ?,
|
|
230
|
+
admin_override = MAX(admin_override, ?),
|
|
231
|
+
updated_at = datetime('now')
|
|
232
|
+
WHERE tool_name = ?`)
|
|
233
|
+
.run((input.enabled ?? current.enabled) ? 1 : 0, roles.join(","), scopes.join(","), input.enabled === undefined ? 0 : 1, name);
|
|
234
|
+
auditMcpAdmin("tool_policy_updated", {
|
|
235
|
+
toolName: name,
|
|
236
|
+
detail: { enabled: input.enabled ?? current.enabled, roles, scopes },
|
|
237
|
+
});
|
|
238
|
+
return getMcpToolPolicy(name);
|
|
239
|
+
}
|
|
240
|
+
function listMcpClients() {
|
|
241
|
+
ensureMcpAdminSchema();
|
|
242
|
+
if (!mcpOauthReady())
|
|
243
|
+
return [];
|
|
244
|
+
const rows = getDb()
|
|
245
|
+
.prepare(`SELECT c.client_id, c.client_name, c.redirect_uris,
|
|
246
|
+
c.token_endpoint_auth_method, c.scope, c.created_at,
|
|
247
|
+
c.enabled, c.revoked_at, c.last_used_at,
|
|
248
|
+
SUM(CASE WHEN r.revoked_at IS NULL AND r.expires_at > unixepoch() THEN 1 ELSE 0 END)
|
|
249
|
+
AS active_refresh_tokens
|
|
250
|
+
FROM mcp_oauth_clients c
|
|
251
|
+
LEFT JOIN mcp_oauth_refresh_tokens r ON r.client_id = c.client_id
|
|
252
|
+
GROUP BY c.client_id
|
|
253
|
+
ORDER BY c.created_at DESC`)
|
|
254
|
+
.all();
|
|
255
|
+
return rows.map((row) => ({
|
|
256
|
+
...row,
|
|
257
|
+
enabled: row.enabled !== 0 && !row.revoked_at,
|
|
258
|
+
redirect_uris: safeStringArray(row.redirect_uris),
|
|
259
|
+
active_refresh_tokens: Number(row.active_refresh_tokens || 0),
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
function safeStringArray(raw) {
|
|
263
|
+
try {
|
|
264
|
+
const parsed = JSON.parse(raw);
|
|
265
|
+
return Array.isArray(parsed) ? parsed.map(String) : [];
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return [];
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function setMcpClientEnabled(clientId, enabled) {
|
|
272
|
+
ensureMcpAdminSchema();
|
|
273
|
+
const result = getWriteDb()
|
|
274
|
+
.prepare(`UPDATE mcp_oauth_clients SET enabled = ? WHERE client_id = ? AND revoked_at IS NULL`)
|
|
275
|
+
.run(enabled ? 1 : 0, clientId);
|
|
276
|
+
if (result.changes) {
|
|
277
|
+
if (!enabled)
|
|
278
|
+
revokeClientTokens(clientId);
|
|
279
|
+
auditMcpAdmin(enabled ? "client_enabled" : "client_disabled", { clientId });
|
|
280
|
+
}
|
|
281
|
+
return result.changes > 0;
|
|
282
|
+
}
|
|
283
|
+
function revokeMcpClient(clientId) {
|
|
284
|
+
ensureMcpAdminSchema();
|
|
285
|
+
const result = getWriteDb()
|
|
286
|
+
.prepare(`UPDATE mcp_oauth_clients
|
|
287
|
+
SET enabled = 0, revoked_at = COALESCE(revoked_at, datetime('now'))
|
|
288
|
+
WHERE client_id = ?`)
|
|
289
|
+
.run(clientId);
|
|
290
|
+
revokeClientTokens(clientId);
|
|
291
|
+
if (result.changes)
|
|
292
|
+
auditMcpAdmin("client_revoked", { clientId });
|
|
293
|
+
return result.changes > 0;
|
|
294
|
+
}
|
|
295
|
+
function rotateMcpClientSecret(clientId) {
|
|
296
|
+
ensureMcpAdminSchema();
|
|
297
|
+
const client = getDb()
|
|
298
|
+
.prepare(`SELECT token_endpoint_auth_method, revoked_at
|
|
299
|
+
FROM mcp_oauth_clients WHERE client_id = ?`)
|
|
300
|
+
.get(clientId);
|
|
301
|
+
if (!client || client.revoked_at || client.token_endpoint_auth_method === "none")
|
|
302
|
+
return null;
|
|
303
|
+
const clientSecret = (0, node_crypto_1.randomBytes)(32).toString("base64url");
|
|
304
|
+
const hash = (0, node_crypto_1.createHash)("sha256").update(clientSecret, "utf8").digest("hex");
|
|
305
|
+
getWriteDb()
|
|
306
|
+
.prepare(`UPDATE mcp_oauth_clients SET client_secret_hash = ? WHERE client_id = ?`)
|
|
307
|
+
.run(hash, clientId);
|
|
308
|
+
revokeClientTokens(clientId);
|
|
309
|
+
auditMcpAdmin("client_secret_rotated", { clientId });
|
|
310
|
+
return { clientSecret };
|
|
311
|
+
}
|
|
312
|
+
function revokeClientTokens(clientId) {
|
|
313
|
+
getWriteDb()
|
|
314
|
+
.prepare(`UPDATE mcp_oauth_refresh_tokens
|
|
315
|
+
SET revoked_at = COALESCE(revoked_at, unixepoch())
|
|
316
|
+
WHERE client_id = ?`)
|
|
317
|
+
.run(clientId);
|
|
318
|
+
}
|
|
319
|
+
function clientCanAuthenticate(clientId) {
|
|
320
|
+
ensureMcpAdminSchema();
|
|
321
|
+
const row = getDb()
|
|
322
|
+
.prepare(`SELECT enabled, revoked_at FROM mcp_oauth_clients WHERE client_id = ?`)
|
|
323
|
+
.get(clientId);
|
|
324
|
+
return Boolean(row && row.enabled !== 0 && !row.revoked_at);
|
|
325
|
+
}
|
|
326
|
+
function touchMcpClient(clientId) {
|
|
327
|
+
ensureMcpAdminSchema();
|
|
328
|
+
getWriteDb()
|
|
329
|
+
.prepare(`UPDATE mcp_oauth_clients SET last_used_at = datetime('now') WHERE client_id = ?`)
|
|
330
|
+
.run(clientId);
|
|
331
|
+
}
|
|
332
|
+
function mcpAdminStatus() {
|
|
333
|
+
const publicUrl = resolveMcpPublicUrl();
|
|
334
|
+
const clients = listMcpClients();
|
|
335
|
+
const tools = listMcpToolPolicies();
|
|
336
|
+
return {
|
|
337
|
+
ready: mcpOauthReady(),
|
|
338
|
+
publicUrl,
|
|
339
|
+
mcpUrl: publicUrl ? `${publicUrl}/mcp` : null,
|
|
340
|
+
oauthReady: mcpOauthReady(),
|
|
341
|
+
jwtConfigured: Boolean(process.env.MCP_JWT_SECRET),
|
|
342
|
+
toolCount: tools.length,
|
|
343
|
+
enabledToolCount: tools.filter((tool) => tool.enabled).length,
|
|
344
|
+
clientCount: clients.length,
|
|
345
|
+
enabledClientCount: clients.filter((client) => client.enabled).length,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function mcpDiagnostics() {
|
|
349
|
+
const status = mcpAdminStatus();
|
|
350
|
+
const checks = [
|
|
351
|
+
{ id: "oauth_schema", ok: status.oauthReady, message: "Tables OAuth MCP" },
|
|
352
|
+
{ id: "jwt_secret", ok: status.jwtConfigured, message: "Secret JWT MCP configuré" },
|
|
353
|
+
{ id: "public_url", ok: Boolean(status.publicUrl), message: "URL publique / tunnel" },
|
|
354
|
+
{ id: "tools", ok: status.enabledToolCount > 0, message: "Au moins un tool actif" },
|
|
355
|
+
];
|
|
356
|
+
return { status, checks, healthy: checks.every((check) => check.ok) };
|
|
357
|
+
}
|
|
358
|
+
function mcpMetrics() {
|
|
359
|
+
const logs = listRequestLogs({ source: "mcp", limit: 1000 }).logs;
|
|
360
|
+
const errors = logs.filter((log) => log.status >= 400 || log.detail.ok === false);
|
|
361
|
+
const durations = logs.map((log) => log.durationMs).sort((a, b) => a - b);
|
|
362
|
+
return {
|
|
363
|
+
window: "process",
|
|
364
|
+
requests: logs.length,
|
|
365
|
+
errors: errors.length,
|
|
366
|
+
errorRate: logs.length ? errors.length / logs.length : 0,
|
|
367
|
+
averageDurationMs: logs.length
|
|
368
|
+
? Math.round(logs.reduce((sum, log) => sum + log.durationMs, 0) / logs.length)
|
|
369
|
+
: 0,
|
|
370
|
+
p95DurationMs: durations.length
|
|
371
|
+
? durations[Math.min(durations.length - 1, Math.floor(durations.length * 0.95))]
|
|
372
|
+
: 0,
|
|
373
|
+
byTool: Object.fromEntries(MCP_TOOL_REGISTRY().map((tool) => [
|
|
374
|
+
tool.name,
|
|
375
|
+
logs.filter((log) => log.detail.tool === tool.name).length,
|
|
376
|
+
])),
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
function auditMcpAdmin(event, options = {}) {
|
|
380
|
+
ensureMcpAdminSchema();
|
|
381
|
+
getWriteDb()
|
|
382
|
+
.prepare(`INSERT INTO mcp_audit_logs
|
|
383
|
+
(event, actor, client_id, tool_name, outcome, detail_json)
|
|
384
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
385
|
+
.run(event, options.actor || null, options.clientId || null, options.toolName || null, options.outcome || "ok", options.detail == null ? null : JSON.stringify(options.detail));
|
|
386
|
+
}
|
|
387
|
+
function listMcpAuditLogs(limit = 200) {
|
|
388
|
+
ensureMcpAdminSchema();
|
|
389
|
+
return getDb()
|
|
390
|
+
.prepare(`SELECT id, created_at, event, actor, client_id, tool_name, outcome, detail_json
|
|
391
|
+
FROM mcp_audit_logs ORDER BY id DESC LIMIT ?`)
|
|
392
|
+
.all(Math.min(1000, Math.max(1, limit)));
|
|
393
|
+
}
|
|
394
|
+
function pruneMcpAuditLogs(retentionDays = Number(process.env.MCP_AUDIT_RETENTION_DAYS || 30)) {
|
|
395
|
+
if (!tableExists("mcp_audit_logs"))
|
|
396
|
+
return 0;
|
|
397
|
+
const days = Number.isFinite(retentionDays)
|
|
398
|
+
? Math.min(365, Math.max(1, Math.floor(retentionDays)))
|
|
399
|
+
: 30;
|
|
400
|
+
return getWriteDb()
|
|
401
|
+
.prepare(`DELETE FROM mcp_audit_logs WHERE created_at < datetime('now', ?)`)
|
|
402
|
+
.run(`-${days} days`).changes;
|
|
403
|
+
}
|
|
404
|
+
function exportMcpDiagnostics() {
|
|
405
|
+
const clients = listMcpClients().map((client) => ({
|
|
406
|
+
idPrefix: client.client_id.slice(0, 12),
|
|
407
|
+
name: client.client_name,
|
|
408
|
+
redirectHosts: client.redirect_uris.map((uri) => {
|
|
409
|
+
try {
|
|
410
|
+
return new URL(uri).host;
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return "invalid";
|
|
414
|
+
}
|
|
415
|
+
}),
|
|
416
|
+
scope: client.scope,
|
|
417
|
+
enabled: client.enabled,
|
|
418
|
+
revoked: Boolean(client.revoked_at),
|
|
419
|
+
lastUsedAt: client.last_used_at,
|
|
420
|
+
}));
|
|
421
|
+
return {
|
|
422
|
+
generatedAt: new Date().toISOString(),
|
|
423
|
+
diagnostics: mcpDiagnostics(),
|
|
424
|
+
metrics: mcpMetrics(),
|
|
425
|
+
tools: listMcpToolPolicies().map((tool) => ({
|
|
426
|
+
name: tool.name,
|
|
427
|
+
enabled: tool.enabled,
|
|
428
|
+
requiredScope: tool.requiredScope,
|
|
429
|
+
allowedRoles: tool.allowedRoles,
|
|
430
|
+
allowedScopes: tool.allowedScopes,
|
|
431
|
+
})),
|
|
432
|
+
clients,
|
|
433
|
+
auditRetentionDays: Number(process.env.MCP_AUDIT_RETENTION_DAYS || 30),
|
|
434
|
+
configuration: {
|
|
435
|
+
corsConfigured: Boolean(process.env.MCP_CORS_ORIGINS?.trim()),
|
|
436
|
+
publicUrlConfigured: Boolean(resolveMcpPublicUrl()),
|
|
437
|
+
jwtConfigured: Boolean(process.env.MCP_JWT_SECRET),
|
|
438
|
+
},
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=mcp-admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-admin.js","sourceRoot":"","sources":["../../src/admin/mcp-admin.ts"],"names":[],"mappings":"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"}
|