claude-flow 2.7.33 → 2.7.34

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.
Files changed (79) hide show
  1. package/.claude/settings.local.json +9 -2
  2. package/.claude/skills/agentic-jujutsu/SKILL.md +1 -1
  3. package/CHANGELOG.md +75 -0
  4. package/bin/claude-flow +1 -1
  5. package/dist/src/cli/commands/mcp.js +61 -7
  6. package/dist/src/cli/commands/mcp.js.map +1 -1
  7. package/dist/src/cli/help-formatter.js +5 -0
  8. package/dist/src/cli/simple-commands/init/agent-copier.js +9 -3
  9. package/dist/src/cli/simple-commands/init/agent-copier.js.map +1 -1
  10. package/dist/src/core/version.js +1 -1
  11. package/dist/src/mcp/async/job-manager-mcp25.js +240 -0
  12. package/dist/src/mcp/async/job-manager-mcp25.js.map +1 -0
  13. package/dist/src/mcp/index.js +8 -0
  14. package/dist/src/mcp/index.js.map +1 -1
  15. package/dist/src/mcp/protocol/version-negotiation.js +182 -0
  16. package/dist/src/mcp/protocol/version-negotiation.js.map +1 -0
  17. package/dist/src/mcp/registry/mcp-registry-client-2025.js +210 -0
  18. package/dist/src/mcp/registry/mcp-registry-client-2025.js.map +1 -0
  19. package/dist/src/mcp/server-factory.js +189 -0
  20. package/dist/src/mcp/server-factory.js.map +1 -0
  21. package/dist/src/mcp/server-mcp-2025.js +283 -0
  22. package/dist/src/mcp/server-mcp-2025.js.map +1 -0
  23. package/dist/src/mcp/tool-registry-progressive.js +319 -0
  24. package/dist/src/mcp/tool-registry-progressive.js.map +1 -0
  25. package/dist/src/mcp/tools/_template.js +62 -0
  26. package/dist/src/mcp/tools/_template.js.map +1 -0
  27. package/dist/src/mcp/tools/loader.js +228 -0
  28. package/dist/src/mcp/tools/loader.js.map +1 -0
  29. package/dist/src/mcp/tools/system/search.js +224 -0
  30. package/dist/src/mcp/tools/system/search.js.map +1 -0
  31. package/dist/src/mcp/tools/system/status.js +168 -0
  32. package/dist/src/mcp/tools/system/status.js.map +1 -0
  33. package/dist/src/mcp/validation/schema-validator-2025.js +198 -0
  34. package/dist/src/mcp/validation/schema-validator-2025.js.map +1 -0
  35. package/docs/.claude-flow/metrics/performance.json +3 -3
  36. package/docs/.claude-flow/metrics/task-metrics.json +3 -3
  37. package/docs/.github-release-issue-v2.7.33.md +488 -0
  38. package/docs/AGENTDB_BRANCH_MERGE_VERIFICATION.md +436 -0
  39. package/docs/BRANCH_REVIEW_SUMMARY.md +439 -0
  40. package/docs/DEEP_CODE_REVIEW_v2.7.33.md +1159 -0
  41. package/docs/MCP_2025_FEATURE_CONFIRMATION.md +698 -0
  42. package/docs/NPM_PUBLISH_GUIDE_v2.7.33.md +628 -0
  43. package/docs/REGRESSION_TEST_REPORT_v2.7.33.md +397 -0
  44. package/docs/RELEASE_NOTES_v2.7.33.md +618 -0
  45. package/docs/RELEASE_READINESS_SUMMARY.md +377 -0
  46. package/docs/RELEASE_SUMMARY_v2.7.33.md +456 -0
  47. package/docs/agentic-flow-agentdb-mcp-integration.md +1198 -0
  48. package/docs/mcp-2025-implementation-summary.md +459 -0
  49. package/docs/mcp-spec-2025-implementation-plan.md +1330 -0
  50. package/docs/phase-1-2-implementation-summary.md +676 -0
  51. package/docs/regression-analysis-phase-1-2.md +555 -0
  52. package/package.json +5 -2
  53. package/src/cli/commands/mcp.ts +86 -9
  54. package/src/cli/simple-commands/init/agent-copier.js +10 -5
  55. package/src/mcp/async/job-manager-mcp25.ts +456 -0
  56. package/src/mcp/index.ts +60 -0
  57. package/src/mcp/protocol/version-negotiation.ts +329 -0
  58. package/src/mcp/registry/mcp-registry-client-2025.ts +334 -0
  59. package/src/mcp/server-factory.ts +426 -0
  60. package/src/mcp/server-mcp-2025.ts +507 -0
  61. package/src/mcp/tool-registry-progressive.ts +539 -0
  62. package/src/mcp/tools/_template.ts +174 -0
  63. package/src/mcp/tools/loader.ts +362 -0
  64. package/src/mcp/tools/system/search.ts +276 -0
  65. package/src/mcp/tools/system/status.ts +206 -0
  66. package/src/mcp/validation/schema-validator-2025.ts +294 -0
  67. package/docs/AGENTDB_V1.6.1_DEEP_REVIEW.md +0 -386
  68. package/docs/AGENT_FOLDER_STRUCTURE_FIX.md +0 -192
  69. package/docs/RECENT_RELEASES_SUMMARY.md +0 -375
  70. package/docs/V2.7.31_RELEASE_NOTES.md +0 -375
  71. /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
  72. /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
  73. /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
  74. /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
  75. /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
  76. /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
  77. /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
  78. /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
  79. /package/.claude/agents/testing/{production-validator.md → validation/production-validator.md} +0 -0
@@ -0,0 +1,210 @@
1
+ export class MCPRegistryClient {
2
+ config;
3
+ logger;
4
+ getTools;
5
+ getCapabilities;
6
+ getHealth;
7
+ registryUrl;
8
+ healthCheckInterval;
9
+ constructor(config, logger, getTools, getCapabilities, getHealth){
10
+ this.config = config;
11
+ this.logger = logger;
12
+ this.getTools = getTools;
13
+ this.getCapabilities = getCapabilities;
14
+ this.getHealth = getHealth;
15
+ this.registryUrl = config.registryUrl || 'https://registry.mcp.anthropic.com/api/v1';
16
+ }
17
+ async register() {
18
+ if (!this.config.enabled) {
19
+ this.logger.info('Registry registration disabled');
20
+ return;
21
+ }
22
+ try {
23
+ const entry = await this.buildRegistryEntry();
24
+ this.logger.info('Registering server with MCP Registry', {
25
+ server_id: entry.server_id,
26
+ endpoint: entry.endpoint,
27
+ capabilities: entry.capabilities
28
+ });
29
+ const response = await fetch(`${this.registryUrl}/servers`, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'Content-Type': 'application/json',
33
+ ...this.config.apiKey && {
34
+ 'Authorization': `Bearer ${this.config.apiKey}`
35
+ }
36
+ },
37
+ body: JSON.stringify(entry)
38
+ });
39
+ if (!response.ok) {
40
+ const error = await response.text();
41
+ throw new Error(`Registration failed: ${response.status} - ${error}`);
42
+ }
43
+ const result = await response.json();
44
+ this.logger.info('Server registered successfully', {
45
+ server_id: result.server_id
46
+ });
47
+ this.startHealthReporting();
48
+ } catch (error) {
49
+ this.logger.error('Failed to register with MCP Registry', {
50
+ error: error instanceof Error ? error.message : String(error)
51
+ });
52
+ throw error;
53
+ }
54
+ }
55
+ async updateMetadata(updates) {
56
+ if (!this.config.enabled) {
57
+ return;
58
+ }
59
+ try {
60
+ this.logger.info('Updating server metadata in registry', {
61
+ server_id: this.config.serverId
62
+ });
63
+ const response = await fetch(`${this.registryUrl}/servers/${this.config.serverId}`, {
64
+ method: 'PATCH',
65
+ headers: {
66
+ 'Content-Type': 'application/json',
67
+ ...this.config.apiKey && {
68
+ 'Authorization': `Bearer ${this.config.apiKey}`
69
+ }
70
+ },
71
+ body: JSON.stringify(updates)
72
+ });
73
+ if (!response.ok) {
74
+ const error = await response.text();
75
+ throw new Error(`Update failed: ${response.status} - ${error}`);
76
+ }
77
+ this.logger.info('Server metadata updated successfully');
78
+ } catch (error) {
79
+ this.logger.error('Failed to update metadata', {
80
+ error: error instanceof Error ? error.message : String(error)
81
+ });
82
+ }
83
+ }
84
+ async reportHealth() {
85
+ if (!this.config.enabled) {
86
+ return;
87
+ }
88
+ try {
89
+ const health = await this.getHealth();
90
+ const response = await fetch(`${this.registryUrl}/servers/${this.config.serverId}/health`, {
91
+ method: 'POST',
92
+ headers: {
93
+ 'Content-Type': 'application/json',
94
+ ...this.config.apiKey && {
95
+ 'Authorization': `Bearer ${this.config.apiKey}`
96
+ }
97
+ },
98
+ body: JSON.stringify({
99
+ status: health.status,
100
+ last_check: new Date().toISOString(),
101
+ latency_ms: health.latency_ms
102
+ })
103
+ });
104
+ if (!response.ok) {
105
+ this.logger.warn('Health report failed', {
106
+ status: response.status
107
+ });
108
+ }
109
+ } catch (error) {
110
+ this.logger.error('Failed to report health', {
111
+ error: error instanceof Error ? error.message : String(error)
112
+ });
113
+ }
114
+ }
115
+ async searchServers(query) {
116
+ try {
117
+ const params = new URLSearchParams();
118
+ if (query.category) {
119
+ params.set('category', query.category);
120
+ }
121
+ if (query.tags) {
122
+ params.set('tags', query.tags.join(','));
123
+ }
124
+ if (query.capabilities) {
125
+ params.set('capabilities', query.capabilities.join(','));
126
+ }
127
+ if (query.limit) {
128
+ params.set('limit', query.limit.toString());
129
+ }
130
+ const response = await fetch(`${this.registryUrl}/servers?${params}`);
131
+ if (!response.ok) {
132
+ throw new Error(`Search failed: ${response.status}`);
133
+ }
134
+ const results = await response.json();
135
+ return results.servers || [];
136
+ } catch (error) {
137
+ this.logger.error('Failed to search servers', {
138
+ error: error instanceof Error ? error.message : String(error)
139
+ });
140
+ return [];
141
+ }
142
+ }
143
+ async unregister() {
144
+ if (!this.config.enabled) {
145
+ return;
146
+ }
147
+ this.stopHealthReporting();
148
+ try {
149
+ this.logger.info('Unregistering from MCP Registry', {
150
+ server_id: this.config.serverId
151
+ });
152
+ const response = await fetch(`${this.registryUrl}/servers/${this.config.serverId}`, {
153
+ method: 'DELETE',
154
+ headers: {
155
+ ...this.config.apiKey && {
156
+ 'Authorization': `Bearer ${this.config.apiKey}`
157
+ }
158
+ }
159
+ });
160
+ if (!response.ok) {
161
+ this.logger.warn('Unregistration failed', {
162
+ status: response.status
163
+ });
164
+ } else {
165
+ this.logger.info('Server unregistered successfully');
166
+ }
167
+ } catch (error) {
168
+ this.logger.error('Failed to unregister', {
169
+ error: error instanceof Error ? error.message : String(error)
170
+ });
171
+ }
172
+ }
173
+ async buildRegistryEntry() {
174
+ const tools = await this.getTools();
175
+ const capabilities = this.getCapabilities();
176
+ const health = await this.getHealth();
177
+ return {
178
+ server_id: this.config.serverId,
179
+ version: '2025-11',
180
+ endpoint: this.config.serverEndpoint,
181
+ tools,
182
+ auth: this.config.authMethod,
183
+ capabilities,
184
+ metadata: this.config.metadata,
185
+ health: {
186
+ status: health.status,
187
+ last_check: new Date().toISOString(),
188
+ latency_ms: health.latency_ms
189
+ }
190
+ };
191
+ }
192
+ startHealthReporting() {
193
+ const interval = this.config.healthCheckInterval || 60000;
194
+ this.healthCheckInterval = setInterval(async ()=>{
195
+ await this.reportHealth();
196
+ }, interval);
197
+ this.logger.info('Health reporting started', {
198
+ interval_ms: interval
199
+ });
200
+ }
201
+ stopHealthReporting() {
202
+ if (this.healthCheckInterval) {
203
+ clearInterval(this.healthCheckInterval);
204
+ this.healthCheckInterval = undefined;
205
+ this.logger.info('Health reporting stopped');
206
+ }
207
+ }
208
+ }
209
+
210
+ //# sourceMappingURL=mcp-registry-client-2025.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/registry/mcp-registry-client-2025.ts"],"sourcesContent":["/**\n * MCP 2025-11 Registry Client\n *\n * Implements server registration and health reporting\n * per MCP 2025-11 specification\n */\n\nimport type { ILogger } from '../../interfaces/logger.js';\nimport type { MCPVersion, MCPCapability } from '../protocol/version-negotiation.js';\n\n/**\n * MCP Registry entry (2025-11 format)\n */\nexport interface MCPRegistryEntry {\n server_id: string;\n version: MCPVersion;\n endpoint: string;\n tools: string[];\n auth: 'bearer' | 'mutual_tls' | 'none';\n capabilities: MCPCapability[];\n metadata: {\n name: string;\n description: string;\n author: string;\n homepage?: string;\n documentation?: string;\n repository?: string;\n };\n health: {\n status: 'healthy' | 'degraded' | 'unhealthy';\n last_check: string; // ISO 8601\n latency_ms: number;\n };\n}\n\n/**\n * Registry search query\n */\nexport interface RegistrySearchQuery {\n category?: string;\n tags?: string[];\n capabilities?: MCPCapability[];\n limit?: number;\n}\n\n/**\n * Registry configuration\n */\nexport interface RegistryConfig {\n enabled: boolean;\n registryUrl?: string;\n apiKey?: string;\n serverId: string;\n serverEndpoint: string;\n authMethod: 'bearer' | 'mutual_tls' | 'none';\n metadata: MCPRegistryEntry['metadata'];\n healthCheckInterval?: number; // milliseconds\n}\n\n/**\n * MCP 2025-11 Registry Client\n */\nexport class MCPRegistryClient {\n private registryUrl: string;\n private healthCheckInterval?: NodeJS.Timeout;\n\n constructor(\n private config: RegistryConfig,\n private logger: ILogger,\n private getTools: () => Promise<string[]>,\n private getCapabilities: () => MCPCapability[],\n private getHealth: () => Promise<{ status: 'healthy' | 'degraded' | 'unhealthy'; latency_ms: number }>\n ) {\n this.registryUrl = config.registryUrl || 'https://registry.mcp.anthropic.com/api/v1';\n }\n\n /**\n * Register server with MCP Registry\n */\n async register(): Promise<void> {\n if (!this.config.enabled) {\n this.logger.info('Registry registration disabled');\n return;\n }\n\n try {\n const entry = await this.buildRegistryEntry();\n\n this.logger.info('Registering server with MCP Registry', {\n server_id: entry.server_id,\n endpoint: entry.endpoint,\n capabilities: entry.capabilities,\n });\n\n const response = await fetch(`${this.registryUrl}/servers`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.config.apiKey && {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n }),\n },\n body: JSON.stringify(entry),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Registration failed: ${response.status} - ${error}`);\n }\n\n const result = await response.json();\n this.logger.info('Server registered successfully', {\n server_id: result.server_id,\n });\n\n // Start periodic health reporting\n this.startHealthReporting();\n } catch (error) {\n this.logger.error('Failed to register with MCP Registry', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Update server metadata in registry\n */\n async updateMetadata(updates: Partial<MCPRegistryEntry>): Promise<void> {\n if (!this.config.enabled) {\n return;\n }\n\n try {\n this.logger.info('Updating server metadata in registry', {\n server_id: this.config.serverId,\n });\n\n const response = await fetch(\n `${this.registryUrl}/servers/${this.config.serverId}`,\n {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.config.apiKey && {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n }),\n },\n body: JSON.stringify(updates),\n }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Update failed: ${response.status} - ${error}`);\n }\n\n this.logger.info('Server metadata updated successfully');\n } catch (error) {\n this.logger.error('Failed to update metadata', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Report health status to registry\n */\n async reportHealth(): Promise<void> {\n if (!this.config.enabled) {\n return;\n }\n\n try {\n const health = await this.getHealth();\n\n const response = await fetch(\n `${this.registryUrl}/servers/${this.config.serverId}/health`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.config.apiKey && {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n }),\n },\n body: JSON.stringify({\n status: health.status,\n last_check: new Date().toISOString(),\n latency_ms: health.latency_ms,\n }),\n }\n );\n\n if (!response.ok) {\n this.logger.warn('Health report failed', {\n status: response.status,\n });\n }\n } catch (error) {\n this.logger.error('Failed to report health', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Search for servers in registry\n */\n async searchServers(query: RegistrySearchQuery): Promise<MCPRegistryEntry[]> {\n try {\n const params = new URLSearchParams();\n\n if (query.category) {\n params.set('category', query.category);\n }\n if (query.tags) {\n params.set('tags', query.tags.join(','));\n }\n if (query.capabilities) {\n params.set('capabilities', query.capabilities.join(','));\n }\n if (query.limit) {\n params.set('limit', query.limit.toString());\n }\n\n const response = await fetch(`${this.registryUrl}/servers?${params}`);\n\n if (!response.ok) {\n throw new Error(`Search failed: ${response.status}`);\n }\n\n const results = await response.json();\n return results.servers || [];\n } catch (error) {\n this.logger.error('Failed to search servers', {\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Unregister from registry\n */\n async unregister(): Promise<void> {\n if (!this.config.enabled) {\n return;\n }\n\n // Stop health reporting\n this.stopHealthReporting();\n\n try {\n this.logger.info('Unregistering from MCP Registry', {\n server_id: this.config.serverId,\n });\n\n const response = await fetch(\n `${this.registryUrl}/servers/${this.config.serverId}`,\n {\n method: 'DELETE',\n headers: {\n ...(this.config.apiKey && {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n }),\n },\n }\n );\n\n if (!response.ok) {\n this.logger.warn('Unregistration failed', {\n status: response.status,\n });\n } else {\n this.logger.info('Server unregistered successfully');\n }\n } catch (error) {\n this.logger.error('Failed to unregister', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Build registry entry from current server state\n */\n private async buildRegistryEntry(): Promise<MCPRegistryEntry> {\n const tools = await this.getTools();\n const capabilities = this.getCapabilities();\n const health = await this.getHealth();\n\n return {\n server_id: this.config.serverId,\n version: '2025-11',\n endpoint: this.config.serverEndpoint,\n tools,\n auth: this.config.authMethod,\n capabilities,\n metadata: this.config.metadata,\n health: {\n status: health.status,\n last_check: new Date().toISOString(),\n latency_ms: health.latency_ms,\n },\n };\n }\n\n /**\n * Start periodic health reporting\n */\n private startHealthReporting(): void {\n const interval = this.config.healthCheckInterval || 60000; // Default: 60 seconds\n\n this.healthCheckInterval = setInterval(async () => {\n await this.reportHealth();\n }, interval);\n\n this.logger.info('Health reporting started', {\n interval_ms: interval,\n });\n }\n\n /**\n * Stop health reporting\n */\n private stopHealthReporting(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = undefined;\n this.logger.info('Health reporting stopped');\n }\n }\n}\n"],"names":["MCPRegistryClient","registryUrl","healthCheckInterval","config","logger","getTools","getCapabilities","getHealth","register","enabled","info","entry","buildRegistryEntry","server_id","endpoint","capabilities","response","fetch","method","headers","apiKey","body","JSON","stringify","ok","error","text","Error","status","result","json","startHealthReporting","message","String","updateMetadata","updates","serverId","reportHealth","health","last_check","Date","toISOString","latency_ms","warn","searchServers","query","params","URLSearchParams","category","set","tags","join","limit","toString","results","servers","unregister","stopHealthReporting","tools","version","serverEndpoint","auth","authMethod","metadata","interval","setInterval","interval_ms","clearInterval","undefined"],"mappings":"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"}
@@ -0,0 +1,189 @@
1
+ import { MCPServer } from './server.js';
2
+ import { MCP2025Server } from './server-mcp-2025.js';
3
+ export class MCPServerFactory {
4
+ static async createServer(config, eventBus, logger, orchestrator, swarmCoordinator, agentManager, resourceManager, messagebus, monitor) {
5
+ const features = config.features || {};
6
+ const useMCP2025 = features.enableMCP2025 === true;
7
+ if (useMCP2025) {
8
+ logger.info('Creating MCP 2025-11 server with enhanced features');
9
+ return await this.createMCP2025Server(config, eventBus, logger, orchestrator);
10
+ } else {
11
+ logger.info('Creating legacy MCP server (backward compatibility mode)');
12
+ return this.createLegacyServer(config, eventBus, logger, orchestrator, swarmCoordinator, agentManager, resourceManager, messagebus, monitor);
13
+ }
14
+ }
15
+ static async createMCP2025Server(config, eventBus, logger, orchestrator) {
16
+ const features = config.features || {};
17
+ const mcp2025Config = config.mcp2025 || {};
18
+ const serverConfig = {
19
+ serverId: mcp2025Config.serverId || `claude-flow-${Date.now()}`,
20
+ transport: config.transport || 'stdio',
21
+ enableMCP2025: true,
22
+ supportLegacyClients: features.supportLegacyClients !== false,
23
+ async: {
24
+ enabled: features.enableAsyncJobs !== false,
25
+ maxJobs: mcp2025Config.async?.maxJobs || 100,
26
+ jobTTL: mcp2025Config.async?.jobTTL || 3600000,
27
+ persistence: mcp2025Config.async?.persistence || 'memory'
28
+ },
29
+ registry: {
30
+ enabled: features.enableRegistryIntegration === true,
31
+ url: mcp2025Config.registry?.url || 'https://registry.mcp.run',
32
+ apiKey: mcp2025Config.registry?.apiKey,
33
+ updateInterval: mcp2025Config.registry?.updateInterval || 60000,
34
+ retryAttempts: mcp2025Config.registry?.retryAttempts || 3
35
+ },
36
+ validation: {
37
+ enabled: features.enableSchemaValidation !== false,
38
+ strictMode: mcp2025Config.validation?.strictMode || false
39
+ },
40
+ toolsDirectory: mcp2025Config.toolsDirectory,
41
+ orchestratorContext: orchestrator
42
+ };
43
+ const server = new MCP2025Server(serverConfig, eventBus, logger);
44
+ await server.initialize();
45
+ logger.info('MCP 2025-11 server created successfully', {
46
+ serverId: serverConfig.serverId,
47
+ features: {
48
+ versionNegotiation: true,
49
+ asyncJobs: serverConfig.async.enabled,
50
+ registry: serverConfig.registry.enabled,
51
+ validation: serverConfig.validation.enabled,
52
+ progressiveDisclosure: true
53
+ }
54
+ });
55
+ return server;
56
+ }
57
+ static createLegacyServer(config, eventBus, logger, orchestrator, swarmCoordinator, agentManager, resourceManager, messagebus, monitor) {
58
+ const legacyConfig = {
59
+ transport: config.transport,
60
+ host: config.host,
61
+ port: config.port,
62
+ tlsEnabled: config.tlsEnabled,
63
+ enableMetrics: config.enableMetrics,
64
+ auth: config.auth,
65
+ loadBalancer: config.loadBalancer,
66
+ sessionTimeout: config.sessionTimeout,
67
+ maxSessions: config.maxSessions
68
+ };
69
+ const server = new MCPServer(legacyConfig, eventBus, logger, orchestrator, swarmCoordinator, agentManager, resourceManager, messagebus, monitor);
70
+ logger.info('Legacy MCP server created successfully', {
71
+ transport: config.transport,
72
+ mode: 'backward-compatibility'
73
+ });
74
+ return server;
75
+ }
76
+ static detectOptimalConfig(currentConfig) {
77
+ const extended = {
78
+ ...currentConfig,
79
+ features: {
80
+ enableMCP2025: process.env.NODE_ENV !== 'production',
81
+ enableVersionNegotiation: true,
82
+ enableAsyncJobs: true,
83
+ enableRegistryIntegration: false,
84
+ enableSchemaValidation: true,
85
+ supportLegacyClients: true,
86
+ enableProgressiveDisclosure: true
87
+ },
88
+ mcp2025: {
89
+ async: {
90
+ enabled: true,
91
+ maxJobs: 100,
92
+ jobTTL: 3600000,
93
+ persistence: 'memory'
94
+ },
95
+ registry: {
96
+ enabled: false,
97
+ url: process.env.MCP_REGISTRY_URL || 'https://registry.mcp.run',
98
+ apiKey: process.env.MCP_REGISTRY_API_KEY
99
+ },
100
+ validation: {
101
+ enabled: true,
102
+ strictMode: false
103
+ }
104
+ }
105
+ };
106
+ return extended;
107
+ }
108
+ static validateConfig(config) {
109
+ const errors = [];
110
+ const warnings = [];
111
+ if (!config.transport) {
112
+ errors.push('Transport type is required');
113
+ }
114
+ if (config.features?.enableMCP2025) {
115
+ if (config.features.enableRegistryIntegration && !config.mcp2025?.registry?.apiKey) {
116
+ warnings.push('Registry integration enabled but no API key provided');
117
+ }
118
+ if (config.mcp2025?.async?.persistence === 'redis') {
119
+ warnings.push('Redis persistence not yet implemented, falling back to memory');
120
+ }
121
+ if (config.mcp2025?.async?.persistence === 'sqlite') {
122
+ warnings.push('SQLite persistence not yet implemented, falling back to memory');
123
+ }
124
+ }
125
+ if (config.transport === 'http') {
126
+ if (!config.host) {
127
+ warnings.push('HTTP transport enabled but no host specified, using default');
128
+ }
129
+ if (!config.port) {
130
+ warnings.push('HTTP transport enabled but no port specified, using default');
131
+ }
132
+ }
133
+ return {
134
+ valid: errors.length === 0,
135
+ errors,
136
+ warnings
137
+ };
138
+ }
139
+ }
140
+ export async function createMCPServer(config, eventBus, logger, options) {
141
+ const extendedConfig = options?.autoDetectFeatures ? MCPServerFactory.detectOptimalConfig(config) : config;
142
+ const validation = MCPServerFactory.validateConfig(extendedConfig);
143
+ if (!validation.valid) {
144
+ throw new Error(`Invalid MCP configuration: ${validation.errors.join(', ')}`);
145
+ }
146
+ for (const warning of validation.warnings){
147
+ logger.warn('MCP configuration warning', {
148
+ warning
149
+ });
150
+ }
151
+ return await MCPServerFactory.createServer(extendedConfig, eventBus, logger, options?.orchestrator, options?.swarmCoordinator, options?.agentManager, options?.resourceManager, options?.messagebus, options?.monitor);
152
+ }
153
+ export function isMCP2025Available() {
154
+ try {
155
+ require.resolve('uuid');
156
+ require.resolve('ajv');
157
+ require.resolve('ajv-formats');
158
+ return true;
159
+ } catch {
160
+ return false;
161
+ }
162
+ }
163
+ export function getServerCapabilities(config) {
164
+ const capabilities = [];
165
+ if (config.features?.enableMCP2025) {
166
+ capabilities.push('mcp-2025-11');
167
+ if (config.features.enableVersionNegotiation) {
168
+ capabilities.push('version-negotiation');
169
+ }
170
+ if (config.features.enableAsyncJobs) {
171
+ capabilities.push('async-jobs');
172
+ }
173
+ if (config.features.enableRegistryIntegration) {
174
+ capabilities.push('registry');
175
+ }
176
+ if (config.features.enableSchemaValidation) {
177
+ capabilities.push('schema-validation');
178
+ }
179
+ if (config.features.enableProgressiveDisclosure) {
180
+ capabilities.push('progressive-disclosure');
181
+ }
182
+ }
183
+ if (config.features?.supportLegacyClients !== false) {
184
+ capabilities.push('backward-compatible');
185
+ }
186
+ return capabilities;
187
+ }
188
+
189
+ //# sourceMappingURL=server-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/mcp/server-factory.ts"],"sourcesContent":["/**\n * MCP Server Factory\n *\n * Creates appropriate MCP server instance based on configuration.\n * Provides seamless transition from legacy MCP to MCP 2025-11 with feature flags.\n */\n\nimport type { IEventBus } from '../interfaces/event-bus.js';\nimport type { ILogger } from '../interfaces/logger.js';\nimport type { MCPConfig } from '../utils/types.js';\nimport { MCPServer, type IMCPServer } from './server.js';\nimport { MCP2025Server, type MCP2025ServerConfig } from './server-mcp-2025.js';\nimport { ProgressiveToolRegistry } from './tool-registry-progressive.js';\n\n/**\n * MCP server feature flags for gradual rollout\n */\nexport interface MCPFeatureFlags {\n // Enable MCP 2025-11 features\n enableMCP2025?: boolean;\n\n // Individual feature flags\n enableVersionNegotiation?: boolean;\n enableAsyncJobs?: boolean;\n enableRegistryIntegration?: boolean;\n enableSchemaValidation?: boolean;\n\n // Backward compatibility\n supportLegacyClients?: boolean;\n\n // Progressive disclosure (already implemented in Phase 1)\n enableProgressiveDisclosure?: boolean;\n}\n\n/**\n * Extended MCP configuration with 2025-11 support\n */\nexport interface ExtendedMCPConfig extends MCPConfig {\n // Feature flags\n features?: MCPFeatureFlags;\n\n // MCP 2025-11 specific config\n mcp2025?: {\n serverId?: string;\n\n // Async job configuration\n async?: {\n enabled?: boolean;\n maxJobs?: number;\n jobTTL?: number;\n persistence?: 'memory' | 'redis' | 'sqlite';\n };\n\n // Registry configuration\n registry?: {\n enabled?: boolean;\n url?: string;\n apiKey?: string;\n updateInterval?: number;\n retryAttempts?: number;\n };\n\n // Validation configuration\n validation?: {\n enabled?: boolean;\n strictMode?: boolean;\n };\n\n // Tool discovery\n toolsDirectory?: string;\n };\n}\n\n/**\n * MCP Server Factory\n *\n * Creates appropriate server instance based on configuration:\n * - MCP2025Server if MCP 2025-11 features enabled\n * - Legacy MCPServer for backward compatibility\n */\nexport class MCPServerFactory {\n /**\n * Create MCP server instance based on configuration\n */\n static async createServer(\n config: ExtendedMCPConfig,\n eventBus: IEventBus,\n logger: ILogger,\n orchestrator?: any,\n swarmCoordinator?: any,\n agentManager?: any,\n resourceManager?: any,\n messagebus?: any,\n monitor?: any\n ): Promise<IMCPServer | MCP2025Server> {\n const features = config.features || {};\n\n // Determine if MCP 2025-11 should be enabled\n const useMCP2025 = features.enableMCP2025 === true;\n\n if (useMCP2025) {\n logger.info('Creating MCP 2025-11 server with enhanced features');\n return await this.createMCP2025Server(\n config,\n eventBus,\n logger,\n orchestrator\n );\n } else {\n logger.info('Creating legacy MCP server (backward compatibility mode)');\n return this.createLegacyServer(\n config,\n eventBus,\n logger,\n orchestrator,\n swarmCoordinator,\n agentManager,\n resourceManager,\n messagebus,\n monitor\n );\n }\n }\n\n /**\n * Create MCP 2025-11 server with enhanced features\n */\n private static async createMCP2025Server(\n config: ExtendedMCPConfig,\n eventBus: IEventBus,\n logger: ILogger,\n orchestrator?: any\n ): Promise<MCP2025Server> {\n const features = config.features || {};\n const mcp2025Config = config.mcp2025 || {};\n\n // Build MCP 2025-11 server configuration\n const serverConfig: MCP2025ServerConfig = {\n serverId: mcp2025Config.serverId || `claude-flow-${Date.now()}`,\n transport: config.transport || 'stdio',\n\n // Feature flags\n enableMCP2025: true,\n supportLegacyClients: features.supportLegacyClients !== false, // Default true\n\n // Async jobs\n async: {\n enabled: features.enableAsyncJobs !== false, // Default true\n maxJobs: mcp2025Config.async?.maxJobs || 100,\n jobTTL: mcp2025Config.async?.jobTTL || 3600000, // 1 hour\n persistence: mcp2025Config.async?.persistence || 'memory',\n },\n\n // Registry integration\n registry: {\n enabled: features.enableRegistryIntegration === true,\n url: mcp2025Config.registry?.url || 'https://registry.mcp.run',\n apiKey: mcp2025Config.registry?.apiKey,\n updateInterval: mcp2025Config.registry?.updateInterval || 60000,\n retryAttempts: mcp2025Config.registry?.retryAttempts || 3,\n },\n\n // Schema validation\n validation: {\n enabled: features.enableSchemaValidation !== false, // Default true\n strictMode: mcp2025Config.validation?.strictMode || false,\n },\n\n // Tool registry (progressive disclosure)\n toolsDirectory: mcp2025Config.toolsDirectory,\n orchestratorContext: orchestrator,\n };\n\n // Create and initialize server\n const server = new MCP2025Server(serverConfig, eventBus, logger);\n await server.initialize();\n\n logger.info('MCP 2025-11 server created successfully', {\n serverId: serverConfig.serverId,\n features: {\n versionNegotiation: true,\n asyncJobs: serverConfig.async.enabled,\n registry: serverConfig.registry.enabled,\n validation: serverConfig.validation.enabled,\n progressiveDisclosure: true,\n },\n });\n\n return server;\n }\n\n /**\n * Create legacy MCP server for backward compatibility\n */\n private static createLegacyServer(\n config: ExtendedMCPConfig,\n eventBus: IEventBus,\n logger: ILogger,\n orchestrator?: any,\n swarmCoordinator?: any,\n agentManager?: any,\n resourceManager?: any,\n messagebus?: any,\n monitor?: any\n ): MCPServer {\n // Remove extended properties for legacy server\n const legacyConfig: MCPConfig = {\n transport: config.transport,\n host: config.host,\n port: config.port,\n tlsEnabled: config.tlsEnabled,\n enableMetrics: config.enableMetrics,\n auth: config.auth,\n loadBalancer: config.loadBalancer,\n sessionTimeout: config.sessionTimeout,\n maxSessions: config.maxSessions,\n };\n\n const server = new MCPServer(\n legacyConfig,\n eventBus,\n logger,\n orchestrator,\n swarmCoordinator,\n agentManager,\n resourceManager,\n messagebus,\n monitor\n );\n\n logger.info('Legacy MCP server created successfully', {\n transport: config.transport,\n mode: 'backward-compatibility',\n });\n\n return server;\n }\n\n /**\n * Detect optimal server configuration based on environment\n */\n static detectOptimalConfig(currentConfig: MCPConfig): ExtendedMCPConfig {\n const extended: ExtendedMCPConfig = {\n ...currentConfig,\n features: {\n // Enable MCP 2025-11 by default in development, opt-in for production\n enableMCP2025: process.env.NODE_ENV !== 'production',\n\n // Individual features (can be overridden)\n enableVersionNegotiation: true,\n enableAsyncJobs: true,\n enableRegistryIntegration: false, // Opt-in\n enableSchemaValidation: true,\n supportLegacyClients: true, // Always support legacy\n enableProgressiveDisclosure: true, // Phase 1 feature\n },\n mcp2025: {\n async: {\n enabled: true,\n maxJobs: 100,\n jobTTL: 3600000,\n persistence: 'memory',\n },\n registry: {\n enabled: false,\n url: process.env.MCP_REGISTRY_URL || 'https://registry.mcp.run',\n apiKey: process.env.MCP_REGISTRY_API_KEY,\n },\n validation: {\n enabled: true,\n strictMode: false,\n },\n },\n };\n\n return extended;\n }\n\n /**\n * Validate server configuration\n */\n static validateConfig(config: ExtendedMCPConfig): {\n valid: boolean;\n errors: string[];\n warnings: string[];\n } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Basic validation\n if (!config.transport) {\n errors.push('Transport type is required');\n }\n\n // MCP 2025-11 specific validation\n if (config.features?.enableMCP2025) {\n if (config.features.enableRegistryIntegration && !config.mcp2025?.registry?.apiKey) {\n warnings.push('Registry integration enabled but no API key provided');\n }\n\n if (config.mcp2025?.async?.persistence === 'redis') {\n warnings.push('Redis persistence not yet implemented, falling back to memory');\n }\n\n if (config.mcp2025?.async?.persistence === 'sqlite') {\n warnings.push('SQLite persistence not yet implemented, falling back to memory');\n }\n }\n\n // Transport validation\n if (config.transport === 'http') {\n if (!config.host) {\n warnings.push('HTTP transport enabled but no host specified, using default');\n }\n if (!config.port) {\n warnings.push('HTTP transport enabled but no port specified, using default');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n\n/**\n * Convenience function for creating MCP server\n */\nexport async function createMCPServer(\n config: MCPConfig | ExtendedMCPConfig,\n eventBus: IEventBus,\n logger: ILogger,\n options?: {\n orchestrator?: any;\n swarmCoordinator?: any;\n agentManager?: any;\n resourceManager?: any;\n messagebus?: any;\n monitor?: any;\n autoDetectFeatures?: boolean;\n }\n): Promise<IMCPServer | MCP2025Server> {\n // Auto-detect optimal configuration if requested\n const extendedConfig = options?.autoDetectFeatures\n ? MCPServerFactory.detectOptimalConfig(config)\n : (config as ExtendedMCPConfig);\n\n // Validate configuration\n const validation = MCPServerFactory.validateConfig(extendedConfig);\n\n if (!validation.valid) {\n throw new Error(`Invalid MCP configuration: ${validation.errors.join(', ')}`);\n }\n\n // Log warnings\n for (const warning of validation.warnings) {\n logger.warn('MCP configuration warning', { warning });\n }\n\n // Create server\n return await MCPServerFactory.createServer(\n extendedConfig,\n eventBus,\n logger,\n options?.orchestrator,\n options?.swarmCoordinator,\n options?.agentManager,\n options?.resourceManager,\n options?.messagebus,\n options?.monitor\n );\n}\n\n/**\n * Check if MCP 2025-11 features are available\n */\nexport function isMCP2025Available(): boolean {\n try {\n // Check if required dependencies are available\n require.resolve('uuid');\n require.resolve('ajv');\n require.resolve('ajv-formats');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get MCP server capabilities based on configuration\n */\nexport function getServerCapabilities(config: ExtendedMCPConfig): string[] {\n const capabilities: string[] = [];\n\n if (config.features?.enableMCP2025) {\n capabilities.push('mcp-2025-11');\n\n if (config.features.enableVersionNegotiation) {\n capabilities.push('version-negotiation');\n }\n\n if (config.features.enableAsyncJobs) {\n capabilities.push('async-jobs');\n }\n\n if (config.features.enableRegistryIntegration) {\n capabilities.push('registry');\n }\n\n if (config.features.enableSchemaValidation) {\n capabilities.push('schema-validation');\n }\n\n if (config.features.enableProgressiveDisclosure) {\n capabilities.push('progressive-disclosure');\n }\n }\n\n if (config.features?.supportLegacyClients !== false) {\n capabilities.push('backward-compatible');\n }\n\n return capabilities;\n}\n"],"names":["MCPServer","MCP2025Server","MCPServerFactory","createServer","config","eventBus","logger","orchestrator","swarmCoordinator","agentManager","resourceManager","messagebus","monitor","features","useMCP2025","enableMCP2025","info","createMCP2025Server","createLegacyServer","mcp2025Config","mcp2025","serverConfig","serverId","Date","now","transport","supportLegacyClients","async","enabled","enableAsyncJobs","maxJobs","jobTTL","persistence","registry","enableRegistryIntegration","url","apiKey","updateInterval","retryAttempts","validation","enableSchemaValidation","strictMode","toolsDirectory","orchestratorContext","server","initialize","versionNegotiation","asyncJobs","progressiveDisclosure","legacyConfig","host","port","tlsEnabled","enableMetrics","auth","loadBalancer","sessionTimeout","maxSessions","mode","detectOptimalConfig","currentConfig","extended","process","env","NODE_ENV","enableVersionNegotiation","enableProgressiveDisclosure","MCP_REGISTRY_URL","MCP_REGISTRY_API_KEY","validateConfig","errors","warnings","push","valid","length","createMCPServer","options","extendedConfig","autoDetectFeatures","Error","join","warning","warn","isMCP2025Available","require","resolve","getServerCapabilities","capabilities"],"mappings":"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"}