@strapi/core 5.46.1 → 5.47.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/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/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 +14 -12
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +14 -12
- 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/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/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 +3 -1
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +3 -1
- package/dist/services/metrics/index.mjs.map +1 -1
- package/package.json +14 -12
|
@@ -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;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 _strapi = /*#__PURE__*/ _class_private_field_loose_key("_strapi");
|
|
12
|
+
class McpConfiguration {
|
|
13
|
+
isEnabled() {
|
|
14
|
+
return _class_private_field_loose_base(this, _strapi)[_strapi].config.get('server.mcp.enabled', false) === true;
|
|
15
|
+
}
|
|
16
|
+
isDevMode() {
|
|
17
|
+
return _class_private_field_loose_base(this, _strapi)[_strapi].config.get('autoReload', false);
|
|
18
|
+
}
|
|
19
|
+
constructor(strapi){
|
|
20
|
+
Object.defineProperty(this, _strapi, {
|
|
21
|
+
writable: true,
|
|
22
|
+
value: void 0
|
|
23
|
+
});
|
|
24
|
+
_class_private_field_loose_base(this, _strapi)[_strapi] = strapi;
|
|
25
|
+
this.path = '/mcp';
|
|
26
|
+
this.connectTimeoutMs = strapi.config.get('server.mcp.connectTimeoutMs', 5 * 1000); // 5 seconds
|
|
27
|
+
this.requestTimeoutMs = strapi.config.get('server.mcp.requestTimeoutMs', 60 * 1000); // 60 seconds
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { McpConfiguration };
|
|
32
|
+
//# sourceMappingURL=McpConfiguration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpConfiguration.mjs","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;;;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Core, Modules } from '@strapi/types';
|
|
3
|
+
import { McpPromptRegistry } from '../prompt-registry';
|
|
4
|
+
import { McpResourceRegistry } from '../resource-registry';
|
|
5
|
+
import { McpToolRegistry } from '../tool-registry';
|
|
6
|
+
import type { McpAdminTokenAbility } from '../authentication';
|
|
7
|
+
import { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';
|
|
8
|
+
import type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';
|
|
9
|
+
export type McpCapabilityDefinitions = {
|
|
10
|
+
tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;
|
|
11
|
+
prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;
|
|
12
|
+
resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;
|
|
13
|
+
};
|
|
14
|
+
export type McpRegistries = {
|
|
15
|
+
tools: McpToolRegistry;
|
|
16
|
+
prompts: McpPromptRegistry;
|
|
17
|
+
resources: McpResourceRegistry;
|
|
18
|
+
};
|
|
19
|
+
/** Read-only registry surface exposed on McpServerWithRegistries. */
|
|
20
|
+
export type McpRegistriesReadonly = {
|
|
21
|
+
tools: McpCapabilityRegistryReadonly;
|
|
22
|
+
prompts: McpCapabilityRegistryReadonly;
|
|
23
|
+
resources: McpCapabilityRegistryReadonly;
|
|
24
|
+
};
|
|
25
|
+
export type McpServerWithRegistries = {
|
|
26
|
+
mcpServer: McpServer;
|
|
27
|
+
registries: McpRegistriesReadonly;
|
|
28
|
+
};
|
|
29
|
+
export type CreateMcpServerWithRegistriesParams = {
|
|
30
|
+
strapi: Core.Strapi;
|
|
31
|
+
definitions: McpCapabilityDefinitions;
|
|
32
|
+
isDevMode: boolean;
|
|
33
|
+
ability: McpAdminTokenAbility;
|
|
34
|
+
user: Modules.MCP.McpHandlerContext['user'];
|
|
35
|
+
};
|
|
36
|
+
export declare const createMcpServerWithRegistries: ({ strapi, definitions, isDevMode, ability, user, }: CreateMcpServerWithRegistriesParams) => McpServerWithRegistries;
|
|
37
|
+
//# sourceMappingURL=McpServerFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpServerFactory.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9E,OAAO,EAAE,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpF,SAAS,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,6BAA6B,CAAC;IACrC,OAAO,EAAE,6BAA6B,CAAC;IACvC,SAAS,EAAE,6BAA6B,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,qBAAqB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,WAAW,EAAE,wBAAwB,CAAC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,uDAMvC,mCAAmC,KAAG,uBAuExC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
4
|
+
var promptRegistry = require('../prompt-registry.js');
|
|
5
|
+
var resourceRegistry = require('../resource-registry.js');
|
|
6
|
+
var toolRegistry = require('../tool-registry.js');
|
|
7
|
+
var syncMcpSessionCapabilities = require('./syncMcpSessionCapabilities.js');
|
|
8
|
+
|
|
9
|
+
// eslint-disable-next-line import/extensions
|
|
10
|
+
const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability, user })=>{
|
|
11
|
+
const capabilities = {
|
|
12
|
+
logging: {}
|
|
13
|
+
};
|
|
14
|
+
// Advertise capability categories when definitions exist (server-level), not per-user enabled
|
|
15
|
+
// count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.
|
|
16
|
+
if (definitions.tools.size > 0) {
|
|
17
|
+
capabilities.tools = {};
|
|
18
|
+
}
|
|
19
|
+
if (definitions.prompts.size > 0) {
|
|
20
|
+
capabilities.prompts = {};
|
|
21
|
+
}
|
|
22
|
+
if (definitions.resources.size > 0) {
|
|
23
|
+
capabilities.resources = {};
|
|
24
|
+
}
|
|
25
|
+
const mcpServer = new mcp_js.McpServer({
|
|
26
|
+
name: 'strapi-mcp-server',
|
|
27
|
+
version: '1.0.0'
|
|
28
|
+
}, {
|
|
29
|
+
capabilities
|
|
30
|
+
});
|
|
31
|
+
// Bootstrap registries with current definitions
|
|
32
|
+
const tools = new toolRegistry.McpToolRegistry({
|
|
33
|
+
strapi,
|
|
34
|
+
definitions: definitions.tools,
|
|
35
|
+
ability,
|
|
36
|
+
user
|
|
37
|
+
});
|
|
38
|
+
const prompts = new promptRegistry.McpPromptRegistry({
|
|
39
|
+
strapi,
|
|
40
|
+
definitions: definitions.prompts
|
|
41
|
+
});
|
|
42
|
+
const resources = new resourceRegistry.McpResourceRegistry({
|
|
43
|
+
strapi,
|
|
44
|
+
definitions: definitions.resources
|
|
45
|
+
});
|
|
46
|
+
// Register capabilities (disabled by default)
|
|
47
|
+
tools.bind(mcpServer);
|
|
48
|
+
prompts.bind(mcpServer);
|
|
49
|
+
resources.bind(mcpServer);
|
|
50
|
+
syncMcpSessionCapabilities.syncMcpSessionCapabilities({
|
|
51
|
+
registries: {
|
|
52
|
+
tools,
|
|
53
|
+
prompts,
|
|
54
|
+
resources
|
|
55
|
+
},
|
|
56
|
+
definitions,
|
|
57
|
+
ability,
|
|
58
|
+
isDevMode
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
mcpServer,
|
|
62
|
+
registries: {
|
|
63
|
+
tools,
|
|
64
|
+
prompts,
|
|
65
|
+
resources
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
exports.createMcpServerWithRegistries = createMcpServerWithRegistries;
|
|
71
|
+
//# sourceMappingURL=McpServerFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpServerFactory.js","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: {\n logging?: Record<string, unknown>;\n tools?: Record<string, unknown>;\n prompts?: Record<string, unknown>;\n resources?: Record<string, unknown>;\n } = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;;;AAAA;AA2CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAKF;AACFC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,gBAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,4BAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,gCAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,oCAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,qDAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { McpPromptRegistry } from '../prompt-registry.mjs';
|
|
3
|
+
import { McpResourceRegistry } from '../resource-registry.mjs';
|
|
4
|
+
import { McpToolRegistry } from '../tool-registry.mjs';
|
|
5
|
+
import { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities.mjs';
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line import/extensions
|
|
8
|
+
const createMcpServerWithRegistries = ({ strapi, definitions, isDevMode, ability, user })=>{
|
|
9
|
+
const capabilities = {
|
|
10
|
+
logging: {}
|
|
11
|
+
};
|
|
12
|
+
// Advertise capability categories when definitions exist (server-level), not per-user enabled
|
|
13
|
+
// count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.
|
|
14
|
+
if (definitions.tools.size > 0) {
|
|
15
|
+
capabilities.tools = {};
|
|
16
|
+
}
|
|
17
|
+
if (definitions.prompts.size > 0) {
|
|
18
|
+
capabilities.prompts = {};
|
|
19
|
+
}
|
|
20
|
+
if (definitions.resources.size > 0) {
|
|
21
|
+
capabilities.resources = {};
|
|
22
|
+
}
|
|
23
|
+
const mcpServer = new McpServer({
|
|
24
|
+
name: 'strapi-mcp-server',
|
|
25
|
+
version: '1.0.0'
|
|
26
|
+
}, {
|
|
27
|
+
capabilities
|
|
28
|
+
});
|
|
29
|
+
// Bootstrap registries with current definitions
|
|
30
|
+
const tools = new McpToolRegistry({
|
|
31
|
+
strapi,
|
|
32
|
+
definitions: definitions.tools,
|
|
33
|
+
ability,
|
|
34
|
+
user
|
|
35
|
+
});
|
|
36
|
+
const prompts = new McpPromptRegistry({
|
|
37
|
+
strapi,
|
|
38
|
+
definitions: definitions.prompts
|
|
39
|
+
});
|
|
40
|
+
const resources = new McpResourceRegistry({
|
|
41
|
+
strapi,
|
|
42
|
+
definitions: definitions.resources
|
|
43
|
+
});
|
|
44
|
+
// Register capabilities (disabled by default)
|
|
45
|
+
tools.bind(mcpServer);
|
|
46
|
+
prompts.bind(mcpServer);
|
|
47
|
+
resources.bind(mcpServer);
|
|
48
|
+
syncMcpSessionCapabilities({
|
|
49
|
+
registries: {
|
|
50
|
+
tools,
|
|
51
|
+
prompts,
|
|
52
|
+
resources
|
|
53
|
+
},
|
|
54
|
+
definitions,
|
|
55
|
+
ability,
|
|
56
|
+
isDevMode
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
mcpServer,
|
|
60
|
+
registries: {
|
|
61
|
+
tools,
|
|
62
|
+
prompts,
|
|
63
|
+
resources
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export { createMcpServerWithRegistries };
|
|
69
|
+
//# sourceMappingURL=McpServerFactory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpServerFactory.mjs","sources":["../../../../src/services/mcp/internal/McpServerFactory.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpPromptRegistry } from '../prompt-registry';\nimport { McpResourceRegistry } from '../resource-registry';\nimport { McpToolRegistry } from '../tool-registry';\nimport type { McpAdminTokenAbility } from '../authentication';\nimport { McpCapabilityDefinitionRegistry } from './McpCapabilityDefinitionRegistry';\nimport type { McpCapabilityRegistryReadonly } from './McpCapabilityRegistry';\nimport { syncMcpSessionCapabilities } from './syncMcpSessionCapabilities';\n\nexport type McpCapabilityDefinitions = {\n tools: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n prompts: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n resources: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n};\n\nexport type McpRegistries = {\n tools: McpToolRegistry;\n prompts: McpPromptRegistry;\n resources: McpResourceRegistry;\n};\n\n/** Read-only registry surface exposed on McpServerWithRegistries. */\nexport type McpRegistriesReadonly = {\n tools: McpCapabilityRegistryReadonly;\n prompts: McpCapabilityRegistryReadonly;\n resources: McpCapabilityRegistryReadonly;\n};\n\nexport type McpServerWithRegistries = {\n mcpServer: McpServer;\n registries: McpRegistriesReadonly;\n};\n\nexport type CreateMcpServerWithRegistriesParams = {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitions;\n isDevMode: boolean;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n};\n\nexport const createMcpServerWithRegistries = ({\n strapi,\n definitions,\n isDevMode,\n ability,\n user,\n}: CreateMcpServerWithRegistriesParams): McpServerWithRegistries => {\n const capabilities: {\n logging?: Record<string, unknown>;\n tools?: Record<string, unknown>;\n prompts?: Record<string, unknown>;\n resources?: Record<string, unknown>;\n } = {\n logging: {},\n };\n // Advertise capability categories when definitions exist (server-level), not per-user enabled\n // count. Clients discover the real set via tools/list, prompts/list, resources/list after sync.\n if (definitions.tools.size > 0) {\n capabilities.tools = {};\n }\n if (definitions.prompts.size > 0) {\n capabilities.prompts = {};\n }\n if (definitions.resources.size > 0) {\n capabilities.resources = {};\n }\n\n const mcpServer = new McpServer(\n {\n name: 'strapi-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities,\n }\n );\n\n // Bootstrap registries with current definitions\n const tools = new McpToolRegistry({\n strapi,\n definitions: definitions.tools,\n ability,\n user,\n });\n const prompts = new McpPromptRegistry({\n strapi,\n definitions: definitions.prompts,\n });\n const resources = new McpResourceRegistry({\n strapi,\n definitions: definitions.resources,\n });\n\n // Register capabilities (disabled by default)\n tools.bind(mcpServer);\n prompts.bind(mcpServer);\n resources.bind(mcpServer);\n\n syncMcpSessionCapabilities({\n registries: {\n tools,\n prompts,\n resources,\n },\n definitions,\n ability,\n isDevMode,\n });\n\n return {\n mcpServer,\n registries: {\n tools,\n prompts,\n resources,\n },\n };\n};\n"],"names":["createMcpServerWithRegistries","strapi","definitions","isDevMode","ability","user","capabilities","logging","tools","size","prompts","resources","mcpServer","McpServer","name","version","McpToolRegistry","McpPromptRegistry","McpResourceRegistry","bind","syncMcpSessionCapabilities","registries"],"mappings":";;;;;;AAAA;AA2CO,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,IAAI,EACgC,GAAA;AACpC,IAAA,MAAMC,YAAAA,GAKF;AACFC,QAAAA,OAAAA,EAAS;AACX,KAAA;;;AAGA,IAAA,IAAIL,WAAAA,CAAYM,KAAK,CAACC,IAAI,GAAG,CAAA,EAAG;QAC9BH,YAAAA,CAAaE,KAAK,GAAG,EAAC;AACxB,IAAA;AACA,IAAA,IAAIN,WAAAA,CAAYQ,OAAO,CAACD,IAAI,GAAG,CAAA,EAAG;QAChCH,YAAAA,CAAaI,OAAO,GAAG,EAAC;AAC1B,IAAA;AACA,IAAA,IAAIR,WAAAA,CAAYS,SAAS,CAACF,IAAI,GAAG,CAAA,EAAG;QAClCH,YAAAA,CAAaK,SAAS,GAAG,EAAC;AAC5B,IAAA;IAEA,MAAMC,SAAAA,GAAY,IAAIC,SAAAA,CACpB;QACEC,IAAAA,EAAM,mBAAA;QACNC,OAAAA,EAAS;KACX,EACA;AACET,QAAAA;AACF,KAAA,CAAA;;IAIF,MAAME,KAAAA,GAAQ,IAAIQ,eAAAA,CAAgB;AAChCf,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYM,KAAK;AAC9BJ,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IACA,MAAMK,OAAAA,GAAU,IAAIO,iBAAAA,CAAkB;AACpChB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYQ;AAC3B,KAAA,CAAA;IACA,MAAMC,SAAAA,GAAY,IAAIO,mBAAAA,CAAoB;AACxCjB,QAAAA,MAAAA;AACAC,QAAAA,WAAAA,EAAaA,YAAYS;AAC3B,KAAA,CAAA;;AAGAH,IAAAA,KAAAA,CAAMW,IAAI,CAACP,SAAAA,CAAAA;AACXF,IAAAA,OAAAA,CAAQS,IAAI,CAACP,SAAAA,CAAAA;AACbD,IAAAA,SAAAA,CAAUQ,IAAI,CAACP,SAAAA,CAAAA;IAEfQ,0BAAAA,CAA2B;QACzBC,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF,SAAA;AACAT,QAAAA,WAAAA;AACAE,QAAAA,OAAAA;AACAD,QAAAA;AACF,KAAA,CAAA;IAEA,OAAO;AACLS,QAAAA,SAAAA;QACAS,UAAAA,EAAY;AACVb,YAAAA,KAAAA;AACAE,YAAAA,OAAAA;AACAC,YAAAA;AACF;AACF,KAAA;AACF;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Modules } from '@strapi/types';
|
|
2
|
+
import type { McpAdminTokenAbility } from '../authentication';
|
|
3
|
+
import type { McpCapabilityDefinitions, McpRegistries } from './McpServerFactory';
|
|
4
|
+
export type CanUseMcpCapabilityParams = {
|
|
5
|
+
ability: McpAdminTokenAbility;
|
|
6
|
+
definition: Modules.MCP.McpCapabilityDefinition;
|
|
7
|
+
isDevMode: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type SyncMcpSessionCapabilitiesParams = {
|
|
10
|
+
registries: McpRegistries;
|
|
11
|
+
definitions: McpCapabilityDefinitions;
|
|
12
|
+
ability: McpAdminTokenAbility;
|
|
13
|
+
isDevMode: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type SyncMcpSessionCapabilitiesSummary = {
|
|
16
|
+
enabled: string[];
|
|
17
|
+
disabled: string[];
|
|
18
|
+
};
|
|
19
|
+
export declare const canUseMcpCapability: ({ ability, definition, isDevMode, }: CanUseMcpCapabilityParams) => boolean;
|
|
20
|
+
export declare const syncMcpSessionCapabilities: ({ registries, definitions, ability, isDevMode, }: SyncMcpSessionCapabilitiesParams) => SyncMcpSessionCapabilitiesSummary;
|
|
21
|
+
//# sourceMappingURL=syncMcpSessionCapabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncMcpSessionCapabilities.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/internal/syncMcpSessionCapabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOlF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAChD,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,aAAa,CAAC;IAC1B,WAAW,EAAE,wBAAwB,CAAC;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAUF,eAAO,MAAM,mBAAmB,wCAI7B,yBAAyB,KAAG,OAY9B,CAAC;AAEF,eAAO,MAAM,0BAA0B,qDAKpC,gCAAgC,KAAG,iCAoDrC,CAAC"}
|