@strapi/core 5.46.1 → 5.47.1
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/dist/Strapi.d.ts.map +1 -1
- package/dist/Strapi.js +12 -3
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +12 -3
- package/dist/Strapi.mjs.map +1 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +12 -5
- package/dist/compile.js.map +1 -1
- package/dist/compile.mjs +12 -5
- package/dist/compile.mjs.map +1 -1
- package/dist/core-api/routes/index.js +2 -0
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +2 -0
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +13 -1
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +15 -2
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +15 -2
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/middlewares/session.d.ts +2 -2
- package/dist/middlewares/session.d.ts.map +1 -1
- package/dist/middlewares/session.js +1 -1
- package/dist/middlewares/session.js.map +1 -1
- package/dist/middlewares/session.mjs +2 -2
- package/dist/middlewares/session.mjs.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -1
- package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.js +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
- package/dist/migrations/database/5.0.0-discard-drafts.mjs +41 -30
- package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
- package/dist/package.json.js +16 -15
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +16 -15
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +3 -1
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/mcp.d.ts +3 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +39 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/mcp.mjs +37 -0
- package/dist/providers/mcp.mjs.map +1 -0
- package/dist/providers/session-manager.d.ts.map +1 -1
- package/dist/providers/session-manager.js +3 -0
- package/dist/providers/session-manager.js.map +1 -1
- package/dist/providers/session-manager.mjs +3 -0
- package/dist/providers/session-manager.mjs.map +1 -1
- package/dist/services/ai.d.ts.map +1 -1
- package/dist/services/ai.js +3 -0
- package/dist/services/ai.js.map +1 -1
- package/dist/services/ai.mjs +3 -0
- package/dist/services/ai.mjs.map +1 -1
- package/dist/services/cron.d.ts +1 -1
- package/dist/services/cron.d.ts.map +1 -1
- package/dist/services/cron.js +10 -2
- package/dist/services/cron.js.map +1 -1
- package/dist/services/cron.mjs +10 -2
- package/dist/services/cron.mjs.map +1 -1
- package/dist/services/document-service/draft-and-publish.d.ts +2 -16
- package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
- package/dist/services/document-service/draft-and-publish.js +0 -53
- package/dist/services/document-service/draft-and-publish.js.map +1 -1
- package/dist/services/document-service/draft-and-publish.mjs +2 -53
- package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
- package/dist/services/document-service/params.d.ts +2 -2
- package/dist/services/document-service/params.d.ts.map +1 -1
- package/dist/services/document-service/publication-filter.d.ts +6 -0
- package/dist/services/document-service/publication-filter.d.ts.map +1 -0
- package/dist/services/document-service/publication-filter.js +20 -0
- package/dist/services/document-service/publication-filter.js.map +1 -0
- package/dist/services/document-service/publication-filter.mjs +15 -0
- package/dist/services/document-service/publication-filter.mjs.map +1 -0
- package/dist/services/document-service/transform/query.d.ts +1 -1
- package/dist/services/document-service/transform/query.d.ts.map +1 -1
- package/dist/services/document-service/transform/query.js +32 -19
- package/dist/services/document-service/transform/query.js.map +1 -1
- package/dist/services/document-service/transform/query.mjs +33 -20
- package/dist/services/document-service/transform/query.mjs.map +1 -1
- package/dist/services/entity-validator/blocks-validator.js +1 -1
- package/dist/services/entity-validator/blocks-validator.js.map +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs +1 -1
- package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
- package/dist/services/mcp/authentication.d.ts +23 -0
- package/dist/services/mcp/authentication.d.ts.map +1 -0
- package/dist/services/mcp/authentication.js +45 -0
- package/dist/services/mcp/authentication.js.map +1 -0
- package/dist/services/mcp/authentication.mjs +43 -0
- package/dist/services/mcp/authentication.mjs.map +1 -0
- package/dist/services/mcp/handlers/handlePost.d.ts +4 -0
- package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -0
- package/dist/services/mcp/handlers/handlePost.js +59 -0
- package/dist/services/mcp/handlers/handlePost.js.map +1 -0
- package/dist/services/mcp/handlers/handlePost.mjs +57 -0
- package/dist/services/mcp/handlers/handlePost.mjs.map +1 -0
- package/dist/services/mcp/handlers/types.d.ts +12 -0
- package/dist/services/mcp/handlers/types.d.ts.map +1 -0
- package/dist/services/mcp/index.d.ts +6 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +101 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/index.mjs +99 -0
- package/dist/services/mcp/index.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts +13 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js +53 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs +51 -0
- package/dist/services/mcp/internal/McpCapabilityDefinitionRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +43 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js +108 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs +106 -0
- package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts +11 -0
- package/dist/services/mcp/internal/McpConfiguration.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.js +34 -0
- package/dist/services/mcp/internal/McpConfiguration.js.map +1 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs +32 -0
- package/dist/services/mcp/internal/McpConfiguration.mjs.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts +37 -0
- package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.js +71 -0
- package/dist/services/mcp/internal/McpServerFactory.js.map +1 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs +69 -0
- package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts +21 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.d.ts.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js +76 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.js.map +1 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs +73 -0
- package/dist/services/mcp/internal/syncMcpSessionCapabilities.mjs.map +1 -0
- package/dist/services/mcp/metrics/metrics.d.ts +29 -0
- package/dist/services/mcp/metrics/metrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/metrics.js +97 -0
- package/dist/services/mcp/metrics/metrics.js.map +1 -0
- package/dist/services/mcp/metrics/metrics.mjs +88 -0
- package/dist/services/mcp/metrics/metrics.mjs.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts +11 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.d.ts.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js +10 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.js.map +1 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs +8 -0
- package/dist/services/mcp/metrics/normalizeMcpCapability.mjs.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts +4 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.d.ts.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js +27 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.js.map +1 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs +25 -0
- package/dist/services/mcp/metrics/wrapCapabilityHandlerForMetrics.mjs.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts +3 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.d.ts.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js +47 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.js.map +1 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs +45 -0
- package/dist/services/mcp/middleware/oauthDiscoveryFallback.mjs.map +1 -0
- package/dist/services/mcp/prompt-registry.d.ts +16 -0
- package/dist/services/mcp/prompt-registry.d.ts.map +1 -0
- package/dist/services/mcp/prompt-registry.js +77 -0
- package/dist/services/mcp/prompt-registry.js.map +1 -0
- package/dist/services/mcp/prompt-registry.mjs +75 -0
- package/dist/services/mcp/prompt-registry.mjs.map +1 -0
- package/dist/services/mcp/resource-registry.d.ts +14 -0
- package/dist/services/mcp/resource-registry.d.ts.map +1 -0
- package/dist/services/mcp/resource-registry.js +67 -0
- package/dist/services/mcp/resource-registry.js.map +1 -0
- package/dist/services/mcp/resource-registry.mjs +65 -0
- package/dist/services/mcp/resource-registry.mjs.map +1 -0
- package/dist/services/mcp/routes.d.ts +11 -0
- package/dist/services/mcp/routes.d.ts.map +1 -0
- package/dist/services/mcp/routes.js +58 -0
- package/dist/services/mcp/routes.js.map +1 -0
- package/dist/services/mcp/routes.mjs +56 -0
- package/dist/services/mcp/routes.mjs.map +1 -0
- package/dist/services/mcp/tool-registry.d.ts +25 -0
- package/dist/services/mcp/tool-registry.d.ts.map +1 -0
- package/dist/services/mcp/tool-registry.js +102 -0
- package/dist/services/mcp/tool-registry.js.map +1 -0
- package/dist/services/mcp/tool-registry.mjs +99 -0
- package/dist/services/mcp/tool-registry.mjs.map +1 -0
- package/dist/services/mcp/tools/log.d.ts +87 -0
- package/dist/services/mcp/tools/log.d.ts.map +1 -0
- package/dist/services/mcp/tools/log.js +88 -0
- package/dist/services/mcp/tools/log.js.map +1 -0
- package/dist/services/mcp/tools/log.mjs +86 -0
- package/dist/services/mcp/tools/log.mjs.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts +36 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.d.ts.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js +59 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.js.map +1 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs +56 -0
- package/dist/services/mcp/utils/createSafeCapabilityRegistration.mjs.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts +22 -0
- package/dist/services/mcp/utils/jsonRpcErrors.d.ts.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js +25 -0
- package/dist/services/mcp/utils/jsonRpcErrors.js.map +1 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs +23 -0
- package/dist/services/mcp/utils/jsonRpcErrors.mjs.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts +18 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.d.ts.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js +29 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.js.map +1 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs +27 -0
- package/dist/services/mcp/utils/safeHandlerWrapper.mjs.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts +5 -0
- package/dist/services/mcp/utils/sendJsonRpcError.d.ts.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js +23 -0
- package/dist/services/mcp/utils/sendJsonRpcError.js.map +1 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs +21 -0
- package/dist/services/mcp/utils/sendJsonRpcError.mjs.map +1 -0
- package/dist/services/mcp/utils/withTimeout.d.ts +7 -0
- package/dist/services/mcp/utils/withTimeout.d.ts.map +1 -0
- package/dist/services/mcp/utils/withTimeout.js +23 -0
- package/dist/services/mcp/utils/withTimeout.js.map +1 -0
- package/dist/services/mcp/utils/withTimeout.mjs +21 -0
- package/dist/services/mcp/utils/withTimeout.mjs.map +1 -0
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +9 -6
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +9 -6
- package/dist/services/metrics/index.mjs.map +1 -1
- package/dist/services/metrics/sender.d.ts.map +1 -1
- package/dist/services/metrics/sender.js +11 -3
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/metrics/sender.mjs +11 -3
- package/dist/services/metrics/sender.mjs.map +1 -1
- package/package.json +16 -15
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createMcpAdminTokenAuthenticator } from './authentication.mjs';
|
|
2
|
+
import { createPostHandler } from './handlers/handlePost.mjs';
|
|
3
|
+
import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry.mjs';
|
|
4
|
+
import { McpConfiguration } from './internal/McpConfiguration.mjs';
|
|
5
|
+
import { createMcpServerWithRegistries } from './internal/McpServerFactory.mjs';
|
|
6
|
+
import { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback.mjs';
|
|
7
|
+
import { createMcpRoutes } from './routes.mjs';
|
|
8
|
+
import { sendDidStartMcpServer } from './metrics/metrics.mjs';
|
|
9
|
+
import { logToolDefinition } from './tools/log.mjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates an MCP service instance for Strapi Core
|
|
13
|
+
*/ const createMcpService = (strapi)=>{
|
|
14
|
+
// Initialize configuration
|
|
15
|
+
const config = new McpConfiguration(strapi);
|
|
16
|
+
const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);
|
|
17
|
+
// Status tracking
|
|
18
|
+
let serverStatus = 'idle';
|
|
19
|
+
// Definition registries
|
|
20
|
+
const toolDefinitions = new McpCapabilityDefinitionRegistry('tool');
|
|
21
|
+
const promptDefinitions = new McpCapabilityDefinitionRegistry('prompt');
|
|
22
|
+
const resourceDefinitions = new McpCapabilityDefinitionRegistry('resource');
|
|
23
|
+
// Prepare handler dependencies
|
|
24
|
+
const handlerDependencies = {
|
|
25
|
+
strapi,
|
|
26
|
+
authenticationStrategy,
|
|
27
|
+
config,
|
|
28
|
+
createServerWithRegistries: createMcpServerWithRegistries,
|
|
29
|
+
capabilityDefinitions: {
|
|
30
|
+
tools: toolDefinitions,
|
|
31
|
+
prompts: promptDefinitions,
|
|
32
|
+
resources: resourceDefinitions
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
// Create HTTP handlers
|
|
36
|
+
const handlePost = createPostHandler(handlerDependencies);
|
|
37
|
+
const service = {
|
|
38
|
+
isEnabled () {
|
|
39
|
+
return config.isEnabled();
|
|
40
|
+
},
|
|
41
|
+
isRunning () {
|
|
42
|
+
return serverStatus === 'running';
|
|
43
|
+
},
|
|
44
|
+
registerTool (tool) {
|
|
45
|
+
if (serverStatus !== 'idle') {
|
|
46
|
+
throw new Error('[MCP] Cannot register tools after the MCP server has started.');
|
|
47
|
+
}
|
|
48
|
+
toolDefinitions.define(tool);
|
|
49
|
+
},
|
|
50
|
+
registerPrompt (prompt) {
|
|
51
|
+
if (serverStatus !== 'idle') {
|
|
52
|
+
throw new Error('[MCP] Cannot register prompts after the MCP server has started.');
|
|
53
|
+
}
|
|
54
|
+
promptDefinitions.define(prompt);
|
|
55
|
+
},
|
|
56
|
+
registerResource (resource) {
|
|
57
|
+
if (serverStatus !== 'idle') {
|
|
58
|
+
throw new Error('[MCP] Cannot register resources after the MCP server has started.');
|
|
59
|
+
}
|
|
60
|
+
resourceDefinitions.define(resource);
|
|
61
|
+
},
|
|
62
|
+
async start () {
|
|
63
|
+
if (service.isEnabled() === false) {
|
|
64
|
+
strapi.log.debug('[MCP] Server is disabled');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (serverStatus === 'error') {
|
|
68
|
+
throw new Error('[MCP] Cannot start server: previous error state');
|
|
69
|
+
}
|
|
70
|
+
if (serverStatus !== 'idle') {
|
|
71
|
+
throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);
|
|
72
|
+
}
|
|
73
|
+
serverStatus = 'starting';
|
|
74
|
+
strapi.server.use(createOAuthDiscoveryFallbackMiddleware());
|
|
75
|
+
const routes = createMcpRoutes(config, {
|
|
76
|
+
handlePost
|
|
77
|
+
});
|
|
78
|
+
strapi.server.routes(routes);
|
|
79
|
+
serverStatus = 'running';
|
|
80
|
+
sendDidStartMcpServer(strapi, {
|
|
81
|
+
path: config.path,
|
|
82
|
+
numberOfTools: toolDefinitions.size,
|
|
83
|
+
numberOfPrompts: promptDefinitions.size,
|
|
84
|
+
numberOfResources: resourceDefinitions.size
|
|
85
|
+
});
|
|
86
|
+
const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');
|
|
87
|
+
strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);
|
|
88
|
+
},
|
|
89
|
+
async stop () {
|
|
90
|
+
serverStatus = 'idle';
|
|
91
|
+
strapi.log.info('[MCP] Service stopped');
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
service.registerTool(logToolDefinition);
|
|
95
|
+
return service;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { createMcpService };
|
|
99
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\nimport { createMcpAdminTokenAuthenticator } from './authentication';\nimport { createPostHandler } from './handlers/handlePost';\nimport type { McpHandlerDependencies } from './handlers/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { createMcpServerWithRegistries } from './internal/McpServerFactory';\nimport { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback';\nimport { createMcpRoutes } from './routes';\nimport { sendDidStartMcpServer } from './metrics/metrics';\nimport { logToolDefinition } from './tools/log';\n\n/**\n * Creates an MCP service instance for Strapi Core\n */\nexport const createMcpService = (strapi: Core.Strapi): Modules.MCP.McpService => {\n // Initialize configuration\n const config = new McpConfiguration(strapi);\n\n const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);\n\n // Status tracking\n let serverStatus: Modules.MCP.McpServiceStatus = 'idle';\n\n // Definition registries\n const toolDefinitions = new McpCapabilityDefinitionRegistry<\n 'tool',\n Modules.MCP.McpToolDefinition\n >('tool');\n\n const promptDefinitions = new McpCapabilityDefinitionRegistry<\n 'prompt',\n Modules.MCP.McpPromptDefinition\n >('prompt');\n\n const resourceDefinitions = new McpCapabilityDefinitionRegistry<\n 'resource',\n Modules.MCP.McpResourceDefinition\n >('resource');\n\n // Prepare handler dependencies\n const handlerDependencies: McpHandlerDependencies = {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries: createMcpServerWithRegistries,\n capabilityDefinitions: {\n tools: toolDefinitions,\n prompts: promptDefinitions,\n resources: resourceDefinitions,\n },\n };\n\n // Create HTTP handlers\n const handlePost = createPostHandler(handlerDependencies);\n\n const service: Modules.MCP.McpService = {\n isEnabled() {\n return config.isEnabled();\n },\n\n isRunning() {\n return serverStatus === 'running';\n },\n\n registerTool(tool: Modules.MCP.McpToolDefinition) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register tools after the MCP server has started.');\n }\n\n toolDefinitions.define(tool);\n },\n\n registerPrompt(prompt) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register prompts after the MCP server has started.');\n }\n promptDefinitions.define(prompt);\n },\n\n registerResource(resource) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register resources after the MCP server has started.');\n }\n resourceDefinitions.define(resource);\n },\n\n async start() {\n if (service.isEnabled() === false) {\n strapi.log.debug('[MCP] Server is disabled');\n return;\n }\n if (serverStatus === 'error') {\n throw new Error('[MCP] Cannot start server: previous error state');\n }\n if (serverStatus !== 'idle') {\n throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);\n }\n serverStatus = 'starting';\n\n strapi.server.use(createOAuthDiscoveryFallbackMiddleware());\n\n const routes = createMcpRoutes(config, { handlePost });\n strapi.server.routes(routes);\n\n serverStatus = 'running';\n\n sendDidStartMcpServer(strapi, {\n path: config.path,\n numberOfTools: toolDefinitions.size,\n numberOfPrompts: promptDefinitions.size,\n numberOfResources: resourceDefinitions.size,\n });\n\n const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');\n strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);\n },\n\n async stop() {\n serverStatus = 'idle';\n strapi.log.info('[MCP] Service stopped');\n },\n };\n\n service.registerTool(logToolDefinition);\n\n return service;\n};\n"],"names":["createMcpService","strapi","config","McpConfiguration","authenticationStrategy","createMcpAdminTokenAuthenticator","serverStatus","toolDefinitions","McpCapabilityDefinitionRegistry","promptDefinitions","resourceDefinitions","handlerDependencies","createServerWithRegistries","createMcpServerWithRegistries","capabilityDefinitions","tools","prompts","resources","handlePost","createPostHandler","service","isEnabled","isRunning","registerTool","tool","Error","define","registerPrompt","prompt","registerResource","resource","start","log","debug","server","use","createOAuthDiscoveryFallbackMiddleware","routes","createMcpRoutes","sendDidStartMcpServer","path","numberOfTools","size","numberOfPrompts","numberOfResources","baseUrl","get","info","stop","logToolDefinition"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Modules } from '@strapi/types';
|
|
2
|
+
export declare class McpCapabilityDefinitionRegistry<CapabilityName extends 'tool' | 'prompt' | 'resource', Definition extends Modules.MCP.McpCapabilityDefinition> {
|
|
3
|
+
#private;
|
|
4
|
+
capability: CapabilityName;
|
|
5
|
+
constructor(capability: CapabilityName);
|
|
6
|
+
get size(): number;
|
|
7
|
+
define(definition: Definition): void;
|
|
8
|
+
get(name: string): Definition | undefined;
|
|
9
|
+
delete(name: string): boolean;
|
|
10
|
+
getAll(): Definition[];
|
|
11
|
+
forEach(callback: (definition: Definition) => void): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=McpCapabilityDefinitionRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpCapabilityDefinitionRegistry.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpCapabilityDefinitionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,+BAA+B,CAC1C,cAAc,SAAS,MAAM,GAAG,QAAQ,GAAG,UAAU,EACrD,UAAU,SAAS,OAAO,CAAC,GAAG,CAAC,uBAAuB;;IAEtD,UAAU,EAAE,cAAc,CAAC;gBAIf,UAAU,EAAE,cAAc;IAItC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,UAAU,EAAE,UAAU;IAuB7B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,MAAM,IAAI,UAAU,EAAE;IAItB,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI;CAGnD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
4
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
5
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
6
|
+
}
|
|
7
|
+
return receiver;
|
|
8
|
+
}
|
|
9
|
+
var id = 0;
|
|
10
|
+
function _class_private_field_loose_key(name) {
|
|
11
|
+
return "__private_" + id++ + "_" + name;
|
|
12
|
+
}
|
|
13
|
+
var _definitions = /*#__PURE__*/ _class_private_field_loose_key("_definitions");
|
|
14
|
+
class McpCapabilityDefinitionRegistry {
|
|
15
|
+
get size() {
|
|
16
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].size;
|
|
17
|
+
}
|
|
18
|
+
define(definition) {
|
|
19
|
+
const existing = _class_private_field_loose_base(this, _definitions)[_definitions].get(definition.name);
|
|
20
|
+
if (existing !== undefined) {
|
|
21
|
+
throw new Error(`[MCP] ${this.capability} with name "${definition.name}" is already registered. Names must be unique.`);
|
|
22
|
+
}
|
|
23
|
+
if (definition.devModeOnly !== true) {
|
|
24
|
+
if (definition.auth === undefined || definition.auth.policies.length === 0 || definition.auth.policies.some((p)=>p.action === '')) {
|
|
25
|
+
throw new Error(`[MCP] ${this.capability} with name "${definition.name}" must declare auth policies or be devModeOnly.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
_class_private_field_loose_base(this, _definitions)[_definitions].set(definition.name, definition);
|
|
29
|
+
}
|
|
30
|
+
get(name) {
|
|
31
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].get(name);
|
|
32
|
+
}
|
|
33
|
+
delete(name) {
|
|
34
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].delete(name);
|
|
35
|
+
}
|
|
36
|
+
getAll() {
|
|
37
|
+
return Array.from(_class_private_field_loose_base(this, _definitions)[_definitions].values());
|
|
38
|
+
}
|
|
39
|
+
forEach(callback) {
|
|
40
|
+
_class_private_field_loose_base(this, _definitions)[_definitions].forEach(callback);
|
|
41
|
+
}
|
|
42
|
+
constructor(capability){
|
|
43
|
+
Object.defineProperty(this, _definitions, {
|
|
44
|
+
writable: true,
|
|
45
|
+
value: void 0
|
|
46
|
+
});
|
|
47
|
+
_class_private_field_loose_base(this, _definitions)[_definitions] = new Map();
|
|
48
|
+
this.capability = capability;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
exports.McpCapabilityDefinitionRegistry = McpCapabilityDefinitionRegistry;
|
|
53
|
+
//# sourceMappingURL=McpCapabilityDefinitionRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpCapabilityDefinitionRegistry.js","sources":["../../../../src/services/mcp/internal/McpCapabilityDefinitionRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n\nexport class McpCapabilityDefinitionRegistry<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n> {\n capability: CapabilityName;\n\n #definitions = new Map<string, Definition>();\n\n constructor(capability: CapabilityName) {\n this.capability = capability;\n }\n\n get size(): number {\n return this.#definitions.size;\n }\n\n define(definition: Definition) {\n const existing = this.#definitions.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n if (definition.devModeOnly !== true) {\n if (\n definition.auth === undefined ||\n definition.auth.policies.length === 0 ||\n definition.auth.policies.some((p) => p.action === '')\n ) {\n throw new Error(\n `[MCP] ${this.capability} with name \"${definition.name}\" must declare auth policies or be devModeOnly.`\n );\n }\n }\n\n this.#definitions.set(definition.name, definition);\n }\n\n get(name: string): Definition | undefined {\n return this.#definitions.get(name);\n }\n\n delete(name: string): boolean {\n return this.#definitions.delete(name);\n }\n\n getAll(): Definition[] {\n return Array.from(this.#definitions.values());\n }\n\n forEach(callback: (definition: Definition) => void) {\n this.#definitions.forEach(callback);\n }\n}\n"],"names":["McpCapabilityDefinitionRegistry","size","define","definition","existing","get","name","undefined","Error","capability","devModeOnly","auth","policies","length","some","p","action","set","delete","getAll","Array","from","values","forEach","callback","Map"],"mappings":";;;;;;;;;;;;AAQE,IAAA,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA;AANK,MAAMA,+BAAAA,CAAAA;AAYX,IAAA,IAAIC,IAAAA,GAAe;AACjB,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,cAAaA,IAAI;AAC/B,IAAA;AAEAC,IAAAA,MAAAA,CAAOC,UAAsB,EAAE;QAC7B,MAAMC,QAAAA,GAAW,gCAAA,IAAI,EAAC,cAAA,YAAA,CAAA,CAAaC,GAAG,CAACF,UAAAA,CAAWG,IAAI,CAAA;AACtD,QAAA,IAAIF,aAAaG,SAAAA,EAAW;AAC1B,YAAA,MAAM,IAAIC,KAAAA,CACR,CAAC,MAAM,EAAE,IAAI,CAACC,UAAU,CAAC,YAAY,EAAEN,UAAAA,CAAWG,IAAI,CAAC,8CAA8C,CAAC,CAAA;AAE1G,QAAA;QAEA,IAAIH,UAAAA,CAAWO,WAAW,KAAK,IAAA,EAAM;YACnC,IACEP,UAAAA,CAAWQ,IAAI,KAAKJ,SAAAA,IACpBJ,UAAAA,CAAWQ,IAAI,CAACC,QAAQ,CAACC,MAAM,KAAK,CAAA,IACpCV,WAAWQ,IAAI,CAACC,QAAQ,CAACE,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,MAAM,KAAK,EAAA,CAAA,EAClD;AACA,gBAAA,MAAM,IAAIR,KAAAA,CACR,CAAC,MAAM,EAAE,IAAI,CAACC,UAAU,CAAC,YAAY,EAAEN,UAAAA,CAAWG,IAAI,CAAC,+CAA+C,CAAC,CAAA;AAE3G,YAAA;AACF,QAAA;QAEA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaW,GAAG,CAACd,UAAAA,CAAWG,IAAI,EAAEH,UAAAA,CAAAA;AACzC,IAAA;AAEAE,IAAAA,GAAAA,CAAIC,IAAY,EAA0B;AACxC,QAAA,OAAO,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaD,GAAG,CAACC,IAAAA,CAAAA;AAC/B,IAAA;AAEAY,IAAAA,MAAAA,CAAOZ,IAAY,EAAW;AAC5B,QAAA,OAAO,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaY,MAAM,CAACZ,IAAAA,CAAAA;AAClC,IAAA;IAEAa,MAAAA,GAAuB;QACrB,OAAOC,KAAAA,CAAMC,IAAI,CAAC,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,cAAaC,MAAM,EAAA,CAAA;AAC5C,IAAA;AAEAC,IAAAA,OAAAA,CAAQC,QAA0C,EAAE;AAClD,QAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaD,OAAO,CAACC,QAAAA,CAAAA;AAC5B,IAAA;AA7CA,IAAA,WAAA,CAAYf,UAA0B,CAAE;QAFxC,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;AAAA,QAAA,+BAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA,gBAAe,IAAIgB,GAAAA,EAAAA;QAGjB,IAAI,CAAChB,UAAU,GAAGA,UAAAA;AACpB,IAAA;AA4CF;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
2
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
3
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
4
|
+
}
|
|
5
|
+
return receiver;
|
|
6
|
+
}
|
|
7
|
+
var id = 0;
|
|
8
|
+
function _class_private_field_loose_key(name) {
|
|
9
|
+
return "__private_" + id++ + "_" + name;
|
|
10
|
+
}
|
|
11
|
+
var _definitions = /*#__PURE__*/ _class_private_field_loose_key("_definitions");
|
|
12
|
+
class McpCapabilityDefinitionRegistry {
|
|
13
|
+
get size() {
|
|
14
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].size;
|
|
15
|
+
}
|
|
16
|
+
define(definition) {
|
|
17
|
+
const existing = _class_private_field_loose_base(this, _definitions)[_definitions].get(definition.name);
|
|
18
|
+
if (existing !== undefined) {
|
|
19
|
+
throw new Error(`[MCP] ${this.capability} with name "${definition.name}" is already registered. Names must be unique.`);
|
|
20
|
+
}
|
|
21
|
+
if (definition.devModeOnly !== true) {
|
|
22
|
+
if (definition.auth === undefined || definition.auth.policies.length === 0 || definition.auth.policies.some((p)=>p.action === '')) {
|
|
23
|
+
throw new Error(`[MCP] ${this.capability} with name "${definition.name}" must declare auth policies or be devModeOnly.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
_class_private_field_loose_base(this, _definitions)[_definitions].set(definition.name, definition);
|
|
27
|
+
}
|
|
28
|
+
get(name) {
|
|
29
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].get(name);
|
|
30
|
+
}
|
|
31
|
+
delete(name) {
|
|
32
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].delete(name);
|
|
33
|
+
}
|
|
34
|
+
getAll() {
|
|
35
|
+
return Array.from(_class_private_field_loose_base(this, _definitions)[_definitions].values());
|
|
36
|
+
}
|
|
37
|
+
forEach(callback) {
|
|
38
|
+
_class_private_field_loose_base(this, _definitions)[_definitions].forEach(callback);
|
|
39
|
+
}
|
|
40
|
+
constructor(capability){
|
|
41
|
+
Object.defineProperty(this, _definitions, {
|
|
42
|
+
writable: true,
|
|
43
|
+
value: void 0
|
|
44
|
+
});
|
|
45
|
+
_class_private_field_loose_base(this, _definitions)[_definitions] = new Map();
|
|
46
|
+
this.capability = capability;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { McpCapabilityDefinitionRegistry };
|
|
51
|
+
//# sourceMappingURL=McpCapabilityDefinitionRegistry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpCapabilityDefinitionRegistry.mjs","sources":["../../../../src/services/mcp/internal/McpCapabilityDefinitionRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n\nexport class McpCapabilityDefinitionRegistry<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n> {\n capability: CapabilityName;\n\n #definitions = new Map<string, Definition>();\n\n constructor(capability: CapabilityName) {\n this.capability = capability;\n }\n\n get size(): number {\n return this.#definitions.size;\n }\n\n define(definition: Definition) {\n const existing = this.#definitions.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n if (definition.devModeOnly !== true) {\n if (\n definition.auth === undefined ||\n definition.auth.policies.length === 0 ||\n definition.auth.policies.some((p) => p.action === '')\n ) {\n throw new Error(\n `[MCP] ${this.capability} with name \"${definition.name}\" must declare auth policies or be devModeOnly.`\n );\n }\n }\n\n this.#definitions.set(definition.name, definition);\n }\n\n get(name: string): Definition | undefined {\n return this.#definitions.get(name);\n }\n\n delete(name: string): boolean {\n return this.#definitions.delete(name);\n }\n\n getAll(): Definition[] {\n return Array.from(this.#definitions.values());\n }\n\n forEach(callback: (definition: Definition) => void) {\n this.#definitions.forEach(callback);\n }\n}\n"],"names":["McpCapabilityDefinitionRegistry","size","define","definition","existing","get","name","undefined","Error","capability","devModeOnly","auth","policies","length","some","p","action","set","delete","getAll","Array","from","values","forEach","callback","Map"],"mappings":";;;;;;;;;;AAQE,IAAA,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA;AANK,MAAMA,+BAAAA,CAAAA;AAYX,IAAA,IAAIC,IAAAA,GAAe;AACjB,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,cAAaA,IAAI;AAC/B,IAAA;AAEAC,IAAAA,MAAAA,CAAOC,UAAsB,EAAE;QAC7B,MAAMC,QAAAA,GAAW,gCAAA,IAAI,EAAC,cAAA,YAAA,CAAA,CAAaC,GAAG,CAACF,UAAAA,CAAWG,IAAI,CAAA;AACtD,QAAA,IAAIF,aAAaG,SAAAA,EAAW;AAC1B,YAAA,MAAM,IAAIC,KAAAA,CACR,CAAC,MAAM,EAAE,IAAI,CAACC,UAAU,CAAC,YAAY,EAAEN,UAAAA,CAAWG,IAAI,CAAC,8CAA8C,CAAC,CAAA;AAE1G,QAAA;QAEA,IAAIH,UAAAA,CAAWO,WAAW,KAAK,IAAA,EAAM;YACnC,IACEP,UAAAA,CAAWQ,IAAI,KAAKJ,SAAAA,IACpBJ,UAAAA,CAAWQ,IAAI,CAACC,QAAQ,CAACC,MAAM,KAAK,CAAA,IACpCV,WAAWQ,IAAI,CAACC,QAAQ,CAACE,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,MAAM,KAAK,EAAA,CAAA,EAClD;AACA,gBAAA,MAAM,IAAIR,KAAAA,CACR,CAAC,MAAM,EAAE,IAAI,CAACC,UAAU,CAAC,YAAY,EAAEN,UAAAA,CAAWG,IAAI,CAAC,+CAA+C,CAAC,CAAA;AAE3G,YAAA;AACF,QAAA;QAEA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaW,GAAG,CAACd,UAAAA,CAAWG,IAAI,EAAEH,UAAAA,CAAAA;AACzC,IAAA;AAEAE,IAAAA,GAAAA,CAAIC,IAAY,EAA0B;AACxC,QAAA,OAAO,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaD,GAAG,CAACC,IAAAA,CAAAA;AAC/B,IAAA;AAEAY,IAAAA,MAAAA,CAAOZ,IAAY,EAAW;AAC5B,QAAA,OAAO,gCAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaY,MAAM,CAACZ,IAAAA,CAAAA;AAClC,IAAA;IAEAa,MAAAA,GAAuB;QACrB,OAAOC,KAAAA,CAAMC,IAAI,CAAC,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,cAAaC,MAAM,EAAA,CAAA;AAC5C,IAAA;AAEAC,IAAAA,OAAAA,CAAQC,QAA0C,EAAE;AAClD,QAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAaD,OAAO,CAACC,QAAAA,CAAAA;AAC5B,IAAA;AA7CA,IAAA,WAAA,CAAYf,UAA0B,CAAE;QAFxC,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;AAAA,QAAA,+BAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA,gBAAe,IAAIgB,GAAAA,EAAAA;QAGjB,IAAI,CAAChB,UAAU,GAAGA,UAAAA;AACpB,IAAA;AA4CF;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Modules } from '@strapi/types';
|
|
2
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';
|
|
4
|
+
export interface McpCapabilityRegistry {
|
|
5
|
+
bind: (mcpServer: McpServer) => void;
|
|
6
|
+
}
|
|
7
|
+
/** Read-only registry surface for external consumers (plugins, handlers). */
|
|
8
|
+
export type McpCapabilityRegistryReadonly = Pick<McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>, 'list' | 'status'>;
|
|
9
|
+
export type RegisteredCapability = {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
enable(): void;
|
|
12
|
+
disable(): void;
|
|
13
|
+
remove(): void;
|
|
14
|
+
};
|
|
15
|
+
export declare class McpCapabilityRegistryBase<CapabilityName extends 'tool' | 'prompt' | 'resource', Definition extends Modules.MCP.McpCapabilityDefinition, Registered extends RegisteredCapability> {
|
|
16
|
+
#private;
|
|
17
|
+
constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>);
|
|
18
|
+
protected register<LocallyRegistered extends Registered>(registerFn: (definition: Definition) => LocallyRegistered): void;
|
|
19
|
+
list(ctx?: {
|
|
20
|
+
filter?: {
|
|
21
|
+
status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];
|
|
22
|
+
};
|
|
23
|
+
}): {
|
|
24
|
+
name: string;
|
|
25
|
+
status: 'enabled' | 'disabled' | 'defined' | 'undefined';
|
|
26
|
+
devModeOnly: boolean;
|
|
27
|
+
auth: Definition['auth'] | undefined;
|
|
28
|
+
}[];
|
|
29
|
+
status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined';
|
|
30
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */
|
|
31
|
+
enable(name: string): void;
|
|
32
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */
|
|
33
|
+
enableAll(): void;
|
|
34
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */
|
|
35
|
+
disable(name: string): void;
|
|
36
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */
|
|
37
|
+
disableAll(): void;
|
|
38
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */
|
|
39
|
+
remove(name: string): void;
|
|
40
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */
|
|
41
|
+
removeAll(): void;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=McpCapabilityRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpCapabilityRegistry.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED,6EAA6E;AAC7E,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAC5F,MAAM,GAAG,QAAQ,CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAEF,qBAAa,yBAAyB,CACpC,cAAc,SAAS,MAAM,GAAG,QAAQ,GAAG,UAAU,EACrD,UAAU,SAAS,OAAO,CAAC,GAAG,CAAC,uBAAuB,EACtD,UAAU,SAAS,oBAAoB;;gBAM3B,WAAW,EAAE,+BAA+B,CAAC,cAAc,EAAE,UAAU,CAAC;IAIpF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,SAAS,UAAU,EACrD,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,iBAAiB;IAoB3D,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;SAC/D,CAAC;KACH;cAIW,MAAM;gBACJ,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW;qBAC3C,OAAO;cACd,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS;;IAY1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW;IAYtE,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,MAAM;IAUnB,yFAAyF;IACzF,SAAS;IAMT,yFAAyF;IACzF,OAAO,CAAC,IAAI,EAAE,MAAM;IAUpB,yFAAyF;IACzF,UAAU;IAMV,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,MAAM;IAWnB,yFAAyF;IACzF,SAAS;CAMV"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
4
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
5
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
6
|
+
}
|
|
7
|
+
return receiver;
|
|
8
|
+
}
|
|
9
|
+
var id = 0;
|
|
10
|
+
function _class_private_field_loose_key(name) {
|
|
11
|
+
return "__private_" + id++ + "_" + name;
|
|
12
|
+
}
|
|
13
|
+
var _definitions = /*#__PURE__*/ _class_private_field_loose_key("_definitions"), _registered = /*#__PURE__*/ _class_private_field_loose_key("_registered");
|
|
14
|
+
class McpCapabilityRegistryBase {
|
|
15
|
+
register(registerFn) {
|
|
16
|
+
_class_private_field_loose_base(this, _definitions)[_definitions].forEach((definition)=>{
|
|
17
|
+
// Defence: register() must be called at most once per registry instance (double-bind protection).
|
|
18
|
+
const existing = _class_private_field_loose_base(this, _registered)[_registered].get(definition.name);
|
|
19
|
+
if (existing !== undefined) {
|
|
20
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${definition.name}" is already registered. Names must be unique.`);
|
|
21
|
+
}
|
|
22
|
+
const registered = registerFn(definition);
|
|
23
|
+
// Disable the capability until explicitly enabled depending on devModeOnly and authorization
|
|
24
|
+
registered.disable();
|
|
25
|
+
_class_private_field_loose_base(this, _registered)[_registered].set(definition.name, registered);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
list(ctx) {
|
|
29
|
+
const { filter } = ctx ?? {};
|
|
30
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].getAll().reduce((acc, curr)=>{
|
|
31
|
+
const status = this.status(curr.name);
|
|
32
|
+
if (filter?.status !== undefined && !filter.status.includes(status)) {
|
|
33
|
+
return acc;
|
|
34
|
+
}
|
|
35
|
+
acc.push({
|
|
36
|
+
name: curr.name,
|
|
37
|
+
status,
|
|
38
|
+
devModeOnly: !!curr.devModeOnly,
|
|
39
|
+
auth: curr.auth
|
|
40
|
+
});
|
|
41
|
+
return acc;
|
|
42
|
+
}, []);
|
|
43
|
+
}
|
|
44
|
+
status(name) {
|
|
45
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
46
|
+
if (registered !== undefined) {
|
|
47
|
+
return registered.enabled === true ? 'enabled' : 'disabled';
|
|
48
|
+
}
|
|
49
|
+
const definition = _class_private_field_loose_base(this, _definitions)[_definitions].get(name);
|
|
50
|
+
if (definition !== undefined) {
|
|
51
|
+
return 'defined';
|
|
52
|
+
}
|
|
53
|
+
return 'undefined';
|
|
54
|
+
}
|
|
55
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ enable(name) {
|
|
56
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
57
|
+
if (!registered) {
|
|
58
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${name}" is not registered.`);
|
|
59
|
+
}
|
|
60
|
+
registered.enable();
|
|
61
|
+
}
|
|
62
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ enableAll() {
|
|
63
|
+
for (const registered of _class_private_field_loose_base(this, _registered)[_registered].values()){
|
|
64
|
+
registered.enable();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ disable(name) {
|
|
68
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
69
|
+
if (!registered) {
|
|
70
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${name}" is not registered.`);
|
|
71
|
+
}
|
|
72
|
+
registered.disable();
|
|
73
|
+
}
|
|
74
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ disableAll() {
|
|
75
|
+
for (const registered of _class_private_field_loose_base(this, _registered)[_registered].values()){
|
|
76
|
+
registered.disable();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ remove(name) {
|
|
80
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
81
|
+
if (!registered) {
|
|
82
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${name}" is not registered.`);
|
|
83
|
+
}
|
|
84
|
+
registered.remove();
|
|
85
|
+
_class_private_field_loose_base(this, _registered)[_registered].delete(name);
|
|
86
|
+
}
|
|
87
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ removeAll() {
|
|
88
|
+
for (const registered of _class_private_field_loose_base(this, _registered)[_registered].values()){
|
|
89
|
+
registered.remove();
|
|
90
|
+
}
|
|
91
|
+
_class_private_field_loose_base(this, _registered)[_registered].clear();
|
|
92
|
+
}
|
|
93
|
+
constructor(definitions){
|
|
94
|
+
Object.defineProperty(this, _definitions, {
|
|
95
|
+
writable: true,
|
|
96
|
+
value: void 0
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(this, _registered, {
|
|
99
|
+
writable: true,
|
|
100
|
+
value: void 0
|
|
101
|
+
});
|
|
102
|
+
_class_private_field_loose_base(this, _registered)[_registered] = new Map();
|
|
103
|
+
_class_private_field_loose_base(this, _definitions)[_definitions] = definitions;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
exports.McpCapabilityRegistryBase = McpCapabilityRegistryBase;
|
|
108
|
+
//# sourceMappingURL=McpCapabilityRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpCapabilityRegistry.js","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n// eslint-disable-next-line import/extensions\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\n\nexport interface McpCapabilityRegistry {\n bind: (mcpServer: McpServer) => void;\n}\n\n/** Read-only registry surface for external consumers (plugins, handlers). */\nexport type McpCapabilityRegistryReadonly = Pick<\n McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>,\n 'list' | 'status'\n>;\n\nexport type RegisteredCapability = {\n enabled: boolean;\n enable(): void;\n disable(): void;\n remove(): void;\n};\n\nexport class McpCapabilityRegistryBase<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n Registered extends RegisteredCapability,\n> {\n #definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>;\n\n #registered = new Map<string, Registered>();\n\n constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>) {\n this.#definitions = definitions;\n }\n\n protected register<LocallyRegistered extends Registered>(\n registerFn: (definition: Definition) => LocallyRegistered\n ) {\n this.#definitions.forEach((definition) => {\n // Defence: register() must be called at most once per registry instance (double-bind protection).\n const existing = this.#registered.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n const registered = registerFn(definition);\n\n // Disable the capability until explicitly enabled depending on devModeOnly and authorization\n registered.disable();\n\n this.#registered.set(definition.name, registered);\n });\n }\n\n list(ctx?: {\n filter?: {\n status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];\n };\n }) {\n const { filter } = ctx ?? {};\n return this.#definitions.getAll().reduce<\n {\n name: string;\n status: 'enabled' | 'disabled' | 'defined' | 'undefined';\n devModeOnly: boolean;\n auth: Definition['auth'] | undefined;\n }[]\n >((acc, curr) => {\n const status = this.status(curr.name);\n if (filter?.status !== undefined && !filter.status.includes(status)) {\n return acc;\n }\n acc.push({ name: curr.name, status, devModeOnly: !!curr.devModeOnly, auth: curr.auth });\n return acc;\n }, []);\n }\n\n status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined' {\n const registered = this.#registered.get(name);\n if (registered !== undefined) {\n return registered.enabled === true ? 'enabled' : 'disabled';\n }\n const definition = this.#definitions.get(name);\n if (definition !== undefined) {\n return 'defined';\n }\n return 'undefined';\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.enable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enableAll() {\n for (const registered of this.#registered.values()) {\n registered.enable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.disable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disableAll() {\n for (const registered of this.#registered.values()) {\n registered.disable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n remove(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.remove();\n this.#registered.delete(name);\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n removeAll() {\n for (const registered of this.#registered.values()) {\n registered.remove();\n }\n this.#registered.clear();\n }\n}\n"],"names":["McpCapabilityRegistryBase","register","registerFn","forEach","definition","existing","get","name","undefined","Error","capability","registered","disable","set","list","ctx","filter","getAll","reduce","acc","curr","status","includes","push","devModeOnly","auth","enabled","enable","enableAll","values","disableAll","remove","delete","removeAll","clear","definitions","Map"],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
2
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
3
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
4
|
+
}
|
|
5
|
+
return receiver;
|
|
6
|
+
}
|
|
7
|
+
var id = 0;
|
|
8
|
+
function _class_private_field_loose_key(name) {
|
|
9
|
+
return "__private_" + id++ + "_" + name;
|
|
10
|
+
}
|
|
11
|
+
var _definitions = /*#__PURE__*/ _class_private_field_loose_key("_definitions"), _registered = /*#__PURE__*/ _class_private_field_loose_key("_registered");
|
|
12
|
+
class McpCapabilityRegistryBase {
|
|
13
|
+
register(registerFn) {
|
|
14
|
+
_class_private_field_loose_base(this, _definitions)[_definitions].forEach((definition)=>{
|
|
15
|
+
// Defence: register() must be called at most once per registry instance (double-bind protection).
|
|
16
|
+
const existing = _class_private_field_loose_base(this, _registered)[_registered].get(definition.name);
|
|
17
|
+
if (existing !== undefined) {
|
|
18
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${definition.name}" is already registered. Names must be unique.`);
|
|
19
|
+
}
|
|
20
|
+
const registered = registerFn(definition);
|
|
21
|
+
// Disable the capability until explicitly enabled depending on devModeOnly and authorization
|
|
22
|
+
registered.disable();
|
|
23
|
+
_class_private_field_loose_base(this, _registered)[_registered].set(definition.name, registered);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
list(ctx) {
|
|
27
|
+
const { filter } = ctx ?? {};
|
|
28
|
+
return _class_private_field_loose_base(this, _definitions)[_definitions].getAll().reduce((acc, curr)=>{
|
|
29
|
+
const status = this.status(curr.name);
|
|
30
|
+
if (filter?.status !== undefined && !filter.status.includes(status)) {
|
|
31
|
+
return acc;
|
|
32
|
+
}
|
|
33
|
+
acc.push({
|
|
34
|
+
name: curr.name,
|
|
35
|
+
status,
|
|
36
|
+
devModeOnly: !!curr.devModeOnly,
|
|
37
|
+
auth: curr.auth
|
|
38
|
+
});
|
|
39
|
+
return acc;
|
|
40
|
+
}, []);
|
|
41
|
+
}
|
|
42
|
+
status(name) {
|
|
43
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
44
|
+
if (registered !== undefined) {
|
|
45
|
+
return registered.enabled === true ? 'enabled' : 'disabled';
|
|
46
|
+
}
|
|
47
|
+
const definition = _class_private_field_loose_base(this, _definitions)[_definitions].get(name);
|
|
48
|
+
if (definition !== undefined) {
|
|
49
|
+
return 'defined';
|
|
50
|
+
}
|
|
51
|
+
return 'undefined';
|
|
52
|
+
}
|
|
53
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ enable(name) {
|
|
54
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
55
|
+
if (!registered) {
|
|
56
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${name}" is not registered.`);
|
|
57
|
+
}
|
|
58
|
+
registered.enable();
|
|
59
|
+
}
|
|
60
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ enableAll() {
|
|
61
|
+
for (const registered of _class_private_field_loose_base(this, _registered)[_registered].values()){
|
|
62
|
+
registered.enable();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ disable(name) {
|
|
66
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
67
|
+
if (!registered) {
|
|
68
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${name}" is not registered.`);
|
|
69
|
+
}
|
|
70
|
+
registered.disable();
|
|
71
|
+
}
|
|
72
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ disableAll() {
|
|
73
|
+
for (const registered of _class_private_field_loose_base(this, _registered)[_registered].values()){
|
|
74
|
+
registered.disable();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ remove(name) {
|
|
78
|
+
const registered = _class_private_field_loose_base(this, _registered)[_registered].get(name);
|
|
79
|
+
if (!registered) {
|
|
80
|
+
throw new Error(`[MCP] ${_class_private_field_loose_base(this, _definitions)[_definitions].capability} with name "${name}" is not registered.`);
|
|
81
|
+
}
|
|
82
|
+
registered.remove();
|
|
83
|
+
_class_private_field_loose_base(this, _registered)[_registered].delete(name);
|
|
84
|
+
}
|
|
85
|
+
/** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */ removeAll() {
|
|
86
|
+
for (const registered of _class_private_field_loose_base(this, _registered)[_registered].values()){
|
|
87
|
+
registered.remove();
|
|
88
|
+
}
|
|
89
|
+
_class_private_field_loose_base(this, _registered)[_registered].clear();
|
|
90
|
+
}
|
|
91
|
+
constructor(definitions){
|
|
92
|
+
Object.defineProperty(this, _definitions, {
|
|
93
|
+
writable: true,
|
|
94
|
+
value: void 0
|
|
95
|
+
});
|
|
96
|
+
Object.defineProperty(this, _registered, {
|
|
97
|
+
writable: true,
|
|
98
|
+
value: void 0
|
|
99
|
+
});
|
|
100
|
+
_class_private_field_loose_base(this, _registered)[_registered] = new Map();
|
|
101
|
+
_class_private_field_loose_base(this, _definitions)[_definitions] = definitions;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export { McpCapabilityRegistryBase };
|
|
106
|
+
//# sourceMappingURL=McpCapabilityRegistry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpCapabilityRegistry.mjs","sources":["../../../../src/services/mcp/internal/McpCapabilityRegistry.ts"],"sourcesContent":["import type { Modules } from '@strapi/types';\n// eslint-disable-next-line import/extensions\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\n\nexport interface McpCapabilityRegistry {\n bind: (mcpServer: McpServer) => void;\n}\n\n/** Read-only registry surface for external consumers (plugins, handlers). */\nexport type McpCapabilityRegistryReadonly = Pick<\n McpCapabilityRegistryBase<'tool', Modules.MCP.McpCapabilityDefinition, RegisteredCapability>,\n 'list' | 'status'\n>;\n\nexport type RegisteredCapability = {\n enabled: boolean;\n enable(): void;\n disable(): void;\n remove(): void;\n};\n\nexport class McpCapabilityRegistryBase<\n CapabilityName extends 'tool' | 'prompt' | 'resource',\n Definition extends Modules.MCP.McpCapabilityDefinition,\n Registered extends RegisteredCapability,\n> {\n #definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>;\n\n #registered = new Map<string, Registered>();\n\n constructor(definitions: McpCapabilityDefinitionRegistry<CapabilityName, Definition>) {\n this.#definitions = definitions;\n }\n\n protected register<LocallyRegistered extends Registered>(\n registerFn: (definition: Definition) => LocallyRegistered\n ) {\n this.#definitions.forEach((definition) => {\n // Defence: register() must be called at most once per registry instance (double-bind protection).\n const existing = this.#registered.get(definition.name);\n if (existing !== undefined) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${definition.name}\" is already registered. Names must be unique.`\n );\n }\n\n const registered = registerFn(definition);\n\n // Disable the capability until explicitly enabled depending on devModeOnly and authorization\n registered.disable();\n\n this.#registered.set(definition.name, registered);\n });\n }\n\n list(ctx?: {\n filter?: {\n status?: ('enabled' | 'disabled' | 'defined' | 'undefined')[];\n };\n }) {\n const { filter } = ctx ?? {};\n return this.#definitions.getAll().reduce<\n {\n name: string;\n status: 'enabled' | 'disabled' | 'defined' | 'undefined';\n devModeOnly: boolean;\n auth: Definition['auth'] | undefined;\n }[]\n >((acc, curr) => {\n const status = this.status(curr.name);\n if (filter?.status !== undefined && !filter.status.includes(status)) {\n return acc;\n }\n acc.push({ name: curr.name, status, devModeOnly: !!curr.devModeOnly, auth: curr.auth });\n return acc;\n }, []);\n }\n\n status(name: string): 'enabled' | 'disabled' | 'defined' | 'undefined' {\n const registered = this.#registered.get(name);\n if (registered !== undefined) {\n return registered.enabled === true ? 'enabled' : 'disabled';\n }\n const definition = this.#definitions.get(name);\n if (definition !== undefined) {\n return 'defined';\n }\n return 'undefined';\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.enable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n enableAll() {\n for (const registered of this.#registered.values()) {\n registered.enable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disable(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.disable();\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n disableAll() {\n for (const registered of this.#registered.values()) {\n registered.disable();\n }\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n remove(name: string) {\n const registered = this.#registered.get(name);\n if (!registered) {\n throw new Error(\n `[MCP] ${this.#definitions.capability} with name \"${name}\" is not registered.`\n );\n }\n registered.remove();\n this.#registered.delete(name);\n }\n\n /** @internal Used by syncMcpSessionCapabilities; not part of the public registry API. */\n removeAll() {\n for (const registered of this.#registered.values()) {\n registered.remove();\n }\n this.#registered.clear();\n }\n}\n"],"names":["McpCapabilityRegistryBase","register","registerFn","forEach","definition","existing","get","name","undefined","Error","capability","registered","disable","set","list","ctx","filter","getAll","reduce","acc","curr","status","includes","push","devModeOnly","auth","enabled","enable","enableAll","values","disableAll","remove","delete","removeAll","clear","definitions","Map"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Core } from '@strapi/types';
|
|
2
|
+
export declare class McpConfiguration {
|
|
3
|
+
#private;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly connectTimeoutMs: number;
|
|
6
|
+
readonly requestTimeoutMs: number;
|
|
7
|
+
constructor(strapi: Core.Strapi);
|
|
8
|
+
isEnabled(): boolean;
|
|
9
|
+
isDevMode(): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=McpConfiguration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpConfiguration.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,qBAAa,gBAAgB;;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAItB,MAAM,EAAE,IAAI,CAAC,MAAM;IAO/B,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,OAAO;CAGrB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function _class_private_field_loose_base(receiver, privateKey) {
|
|
4
|
+
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
5
|
+
throw new TypeError("attempted to use private field on non-instance");
|
|
6
|
+
}
|
|
7
|
+
return receiver;
|
|
8
|
+
}
|
|
9
|
+
var id = 0;
|
|
10
|
+
function _class_private_field_loose_key(name) {
|
|
11
|
+
return "__private_" + id++ + "_" + name;
|
|
12
|
+
}
|
|
13
|
+
var _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
|
|
14
|
+
class McpConfiguration {
|
|
15
|
+
isEnabled() {
|
|
16
|
+
return _class_private_field_loose_base(this, _strapi)[_strapi].config.get('server.mcp.enabled', false) === true;
|
|
17
|
+
}
|
|
18
|
+
isDevMode() {
|
|
19
|
+
return _class_private_field_loose_base(this, _strapi)[_strapi].config.get('autoReload', false);
|
|
20
|
+
}
|
|
21
|
+
constructor(strapi){
|
|
22
|
+
Object.defineProperty(this, _strapi, {
|
|
23
|
+
writable: true,
|
|
24
|
+
value: void 0
|
|
25
|
+
});
|
|
26
|
+
_class_private_field_loose_base(this, _strapi)[_strapi] = strapi;
|
|
27
|
+
this.path = '/mcp';
|
|
28
|
+
this.connectTimeoutMs = strapi.config.get('server.mcp.connectTimeoutMs', 5 * 1000); // 5 seconds
|
|
29
|
+
this.requestTimeoutMs = strapi.config.get('server.mcp.requestTimeoutMs', 60 * 1000); // 60 seconds
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.McpConfiguration = McpConfiguration;
|
|
34
|
+
//# sourceMappingURL=McpConfiguration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpConfiguration.js","sources":["../../../../src/services/mcp/internal/McpConfiguration.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nexport class McpConfiguration {\n readonly path: string;\n\n readonly connectTimeoutMs: number;\n\n readonly requestTimeoutMs: number;\n\n #strapi: Core.Strapi;\n\n constructor(strapi: Core.Strapi) {\n this.#strapi = strapi;\n this.path = '/mcp';\n this.connectTimeoutMs = strapi.config.get('server.mcp.connectTimeoutMs', 5 * 1000); // 5 seconds\n this.requestTimeoutMs = strapi.config.get('server.mcp.requestTimeoutMs', 60 * 1000); // 60 seconds\n }\n\n isEnabled(): boolean {\n return this.#strapi.config.get<boolean>('server.mcp.enabled', false) === true;\n }\n\n isDevMode(): boolean {\n return this.#strapi.config.get('autoReload', false);\n }\n}\n"],"names":["McpConfiguration","isEnabled","config","get","isDevMode","strapi","path","connectTimeoutMs","requestTimeoutMs"],"mappings":";;;;;;;;;;;;AASE,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AAPK,MAAMA,gBAAAA,CAAAA;IAgBXC,SAAAA,GAAqB;QACnB,OAAO,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,CAAQC,MAAM,CAACC,GAAG,CAAU,oBAAA,EAAsB,KAAA,CAAA,KAAW,IAAA;AAC3E,IAAA;IAEAC,SAAAA,GAAqB;QACnB,OAAO,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,SAAQF,MAAM,CAACC,GAAG,CAAC,YAAA,EAAc,KAAA,CAAA;AAC/C,IAAA;AAbA,IAAA,WAAA,CAAYE,MAAmB,CAAE;QAFjC,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;QAGE,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUA,MAAAA;QACf,IAAI,CAACC,IAAI,GAAG,MAAA;QACZ,IAAI,CAACC,gBAAgB,GAAGF,MAAAA,CAAOH,MAAM,CAACC,GAAG,CAAC,6BAAA,EAA+B,CAAA,GAAI,IAAA,CAAA,CAAA;QAC7E,IAAI,CAACK,gBAAgB,GAAGH,MAAAA,CAAOH,MAAM,CAACC,GAAG,CAAC,6BAAA,EAA+B,EAAA,GAAK,IAAA,CAAA,CAAA;AAChF,IAAA;AASF;;;;"}
|