claude-flow 2.7.33 → 2.7.35
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/.claude/settings.local.json +9 -2
- package/.claude/skills/agentic-jujutsu/SKILL.md +1 -1
- package/CHANGELOG.md +140 -0
- package/bin/claude-flow +1 -1
- package/dist/src/cli/commands/mcp.js +61 -7
- package/dist/src/cli/commands/mcp.js.map +1 -1
- package/dist/src/cli/init/index.js +55 -33
- package/dist/src/cli/init/index.js.map +1 -1
- package/dist/src/cli/simple-cli.js +182 -172
- package/dist/src/cli/simple-cli.js.map +1 -1
- package/dist/src/cli/simple-commands/init/agent-copier.js +9 -3
- package/dist/src/cli/simple-commands/init/agent-copier.js.map +1 -1
- package/dist/src/core/DatabaseManager.js +39 -9
- package/dist/src/core/DatabaseManager.js.map +1 -1
- package/dist/src/mcp/async/job-manager-mcp25.js +240 -0
- package/dist/src/mcp/async/job-manager-mcp25.js.map +1 -0
- package/dist/src/mcp/index.js +8 -0
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/protocol/version-negotiation.js +182 -0
- package/dist/src/mcp/protocol/version-negotiation.js.map +1 -0
- package/dist/src/mcp/registry/mcp-registry-client-2025.js +210 -0
- package/dist/src/mcp/registry/mcp-registry-client-2025.js.map +1 -0
- package/dist/src/mcp/server-factory.js +189 -0
- package/dist/src/mcp/server-factory.js.map +1 -0
- package/dist/src/mcp/server-mcp-2025.js +283 -0
- package/dist/src/mcp/server-mcp-2025.js.map +1 -0
- package/dist/src/mcp/tool-registry-progressive.js +319 -0
- package/dist/src/mcp/tool-registry-progressive.js.map +1 -0
- package/dist/src/mcp/tools/_template.js +62 -0
- package/dist/src/mcp/tools/_template.js.map +1 -0
- package/dist/src/mcp/tools/loader.js +228 -0
- package/dist/src/mcp/tools/loader.js.map +1 -0
- package/dist/src/mcp/tools/system/search.js +224 -0
- package/dist/src/mcp/tools/system/search.js.map +1 -0
- package/dist/src/mcp/tools/system/status.js +168 -0
- package/dist/src/mcp/tools/system/status.js.map +1 -0
- package/dist/src/mcp/validation/schema-validator-2025.js +198 -0
- package/dist/src/mcp/validation/schema-validator-2025.js.map +1 -0
- package/dist/src/utils/error-recovery.js +215 -0
- package/dist/src/utils/error-recovery.js.map +1 -0
- package/dist/src/utils/metrics-reader.js +10 -0
- package/dist/src/utils/metrics-reader.js.map +1 -1
- package/docs/.claude-flow/metrics/performance.json +3 -3
- package/docs/.claude-flow/metrics/task-metrics.json +3 -3
- package/docs/.github-release-issue-v2.7.33.md +488 -0
- package/docs/AGENTDB_BRANCH_MERGE_VERIFICATION.md +436 -0
- package/docs/AUTOMATIC_ERROR_RECOVERY_v2.7.35.md +321 -0
- package/docs/BRANCH_REVIEW_SUMMARY.md +439 -0
- package/docs/CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md +384 -0
- package/docs/DEEP_CODE_REVIEW_v2.7.33.md +1159 -0
- package/docs/DOCKER_TEST_RESULTS_v2.7.35.md +305 -0
- package/docs/MCP_2025_FEATURE_CONFIRMATION.md +698 -0
- package/docs/NPM_PUBLISH_GUIDE_v2.7.33.md +628 -0
- package/docs/REGRESSION_TEST_REPORT_v2.7.33.md +397 -0
- package/docs/RELEASE_NOTES_v2.7.33.md +618 -0
- package/docs/RELEASE_READINESS_SUMMARY.md +377 -0
- package/docs/RELEASE_SUMMARY_v2.7.33.md +456 -0
- package/docs/agentic-flow-agentdb-mcp-integration.md +1198 -0
- package/docs/features/automatic-error-recovery.md +333 -0
- package/docs/github-issues/README.md +88 -0
- package/docs/github-issues/wsl-enotempty-automatic-recovery.md +470 -0
- package/docs/mcp-2025-implementation-summary.md +459 -0
- package/docs/mcp-spec-2025-implementation-plan.md +1330 -0
- package/docs/phase-1-2-implementation-summary.md +676 -0
- package/docs/regression-analysis-phase-1-2.md +555 -0
- package/docs/troubleshooting/wsl-better-sqlite3-error.md +239 -0
- package/package.json +5 -2
- package/scripts/create-github-issue.sh +64 -0
- package/scripts/test-docker-wsl.sh +198 -0
- package/src/cli/commands/mcp.ts +86 -9
- package/src/cli/init/index.ts +72 -42
- package/src/cli/simple-commands/init/agent-copier.js +10 -5
- package/src/core/DatabaseManager.ts +55 -9
- package/src/mcp/async/job-manager-mcp25.ts +456 -0
- package/src/mcp/index.ts +60 -0
- package/src/mcp/protocol/version-negotiation.ts +329 -0
- package/src/mcp/registry/mcp-registry-client-2025.ts +334 -0
- package/src/mcp/server-factory.ts +426 -0
- package/src/mcp/server-mcp-2025.ts +507 -0
- package/src/mcp/tool-registry-progressive.ts +539 -0
- package/src/mcp/tools/_template.ts +174 -0
- package/src/mcp/tools/loader.ts +362 -0
- package/src/mcp/tools/system/search.ts +276 -0
- package/src/mcp/tools/system/status.ts +206 -0
- package/src/mcp/validation/schema-validator-2025.ts +294 -0
- package/src/utils/error-recovery.ts +325 -0
- package/docs/AGENTDB_V1.6.1_DEEP_REVIEW.md +0 -386
- package/docs/AGENT_FOLDER_STRUCTURE_FIX.md +0 -192
- package/docs/RECENT_RELEASES_SUMMARY.md +0 -375
- package/docs/V2.7.31_RELEASE_NOTES.md +0 -375
- /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
- /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
- /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
- /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
- /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
- /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
- /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
- /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
- /package/.claude/agents/testing/{production-validator.md → validation/production-validator.md} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mcp/index.ts"],"sourcesContent":["/**\n * MCP (Model Context Protocol) Module\n * Export all MCP components for easy integration\n */\n\n// Phase 6: In-Process MCP Server (10-100x performance improvement)\nexport { InProcessMCPServer, createInProcessServer } from './in-process-server.js';\nexport type { InProcessServerConfig, ToolCallMetrics } from './in-process-server.js';\n\nexport {\n ClaudeFlowToolRegistry,\n createToolRegistry,\n createClaudeFlowSdkServer,\n} from './tool-registry.js';\nexport type { ToolRegistryConfig } from './tool-registry.js';\n\nexport {\n SDKIntegration,\n initializeSDKIntegration,\n getSDKIntegration,\n createInProcessQuery,\n getInProcessServerConfig,\n measurePerformance,\n} from './sdk-integration.js';\nexport type { SDKIntegrationConfig } from './sdk-integration.js';\n\n// Core MCP Server\nexport { MCPServer, type IMCPServer } from './server.js';\n\n// Lifecycle Management\nexport {\n MCPLifecycleManager,\n LifecycleState,\n type LifecycleEvent,\n type HealthCheckResult,\n type LifecycleManagerConfig,\n} from './lifecycle-manager.js';\n\n// Tool Registry and Management\nexport {\n ToolRegistry,\n type ToolCapability,\n type ToolMetrics,\n type ToolDiscoveryQuery,\n} from './tools.js';\n\n// Protocol Management\nexport {\n MCPProtocolManager,\n type ProtocolVersionInfo,\n type CompatibilityResult,\n type NegotiationResult,\n} from './protocol-manager.js';\n\n// Authentication and Authorization\nexport {\n AuthManager,\n type IAuthManager,\n type AuthContext,\n type AuthResult,\n type TokenInfo,\n type TokenGenerationOptions,\n type AuthSession,\n Permissions,\n} from './auth.js';\n\n// Performance Monitoring\nexport {\n MCPPerformanceMonitor,\n type PerformanceMetrics,\n type RequestMetrics,\n type AlertRule,\n type Alert,\n type OptimizationSuggestion,\n} from './performance-monitor.js';\n\n// Orchestration Integration\nexport {\n MCPOrchestrationIntegration,\n type OrchestrationComponents,\n type MCPOrchestrationConfig,\n type IntegrationStatus,\n} from './orchestration-integration.js';\n\n// Transport Implementations\nexport { type ITransport } from './transports/base.js';\nexport { StdioTransport } from './transports/stdio.js';\nexport { HttpTransport } from './transports/http.js';\n\n// Request Routing\nexport { RequestRouter } from './router.js';\n\n// Session Management\nexport { SessionManager, type ISessionManager } from './session-manager.js';\n\n// Load Balancing\nexport { LoadBalancer, type ILoadBalancer, RequestQueue } from './load-balancer.js';\n\n// Tool Implementations\nexport { createClaudeFlowTools, type ClaudeFlowToolContext } from './claude-flow-tools.js';\nexport { createSwarmTools, type SwarmToolContext } from './swarm-tools.js';\n\n/**\n * MCP Integration Factory\n * Provides a simple way to create a complete MCP integration\n */\nexport class MCPIntegrationFactory {\n /**\n * Create a complete MCP integration with all components\n */\n static async createIntegration(config: {\n mcpConfig: import('../utils/types.js').MCPConfig;\n orchestrationConfig?: Partial<MCPOrchestrationConfig>;\n components?: Partial<OrchestrationComponents>;\n logger: import('../core/logger.js').ILogger;\n }): Promise<MCPOrchestrationIntegration> {\n const { mcpConfig, orchestrationConfig = {}, components = {}, logger } = config;\n\n const integration = new MCPOrchestrationIntegration(\n mcpConfig,\n {\n enabledIntegrations: {\n orchestrator: true,\n swarm: true,\n agents: true,\n resources: true,\n memory: true,\n monitoring: true,\n terminals: true,\n },\n autoStart: true,\n healthCheckInterval: 30000,\n reconnectAttempts: 3,\n reconnectDelay: 5000,\n enableMetrics: true,\n enableAlerts: true,\n ...orchestrationConfig,\n },\n components,\n logger,\n );\n\n return integration;\n }\n\n /**\n * Create a standalone MCP server (without orchestration integration)\n */\n static async createStandaloneServer(config: {\n mcpConfig: import('../utils/types.js').MCPConfig;\n logger: import('../core/logger.js').ILogger;\n enableLifecycleManagement?: boolean;\n enablePerformanceMonitoring?: boolean;\n }): Promise<{\n server: MCPServer;\n lifecycleManager?: MCPLifecycleManager;\n performanceMonitor?: MCPPerformanceMonitor;\n }> {\n const {\n mcpConfig,\n logger,\n enableLifecycleManagement = true,\n enablePerformanceMonitoring = true,\n } = config;\n\n const eventBus = new (await import('node:events')).EventEmitter();\n const server = new MCPServer(mcpConfig, eventBus, logger);\n\n let lifecycleManager: MCPLifecycleManager | undefined;\n let performanceMonitor: MCPPerformanceMonitor | undefined;\n\n if (enableLifecycleManagement) {\n lifecycleManager = new MCPLifecycleManager(mcpConfig, logger, () => server);\n }\n\n if (enablePerformanceMonitoring) {\n performanceMonitor = new MCPPerformanceMonitor(logger);\n }\n\n return {\n server,\n lifecycleManager,\n performanceMonitor,\n };\n }\n\n /**\n * Create a development/testing MCP setup\n */\n static async createDevelopmentSetup(logger: import('../core/logger.js').ILogger): Promise<{\n server: MCPServer;\n lifecycleManager: MCPLifecycleManager;\n performanceMonitor: MCPPerformanceMonitor;\n protocolManager: MCPProtocolManager;\n }> {\n const mcpConfig: import('../utils/types.js').MCPConfig = {\n transport: 'stdio',\n enableMetrics: true,\n auth: {\n enabled: false,\n method: 'token',\n },\n };\n\n const { server, lifecycleManager, performanceMonitor } = await this.createStandaloneServer({\n mcpConfig,\n logger,\n enableLifecycleManagement: true,\n enablePerformanceMonitoring: true,\n });\n\n const protocolManager = new MCPProtocolManager(logger);\n\n return {\n server,\n lifecycleManager: lifecycleManager!,\n performanceMonitor: performanceMonitor!,\n protocolManager,\n };\n }\n}\n\n/**\n * Default MCP configuration for common use cases\n */\nexport const DefaultMCPConfigs = {\n /**\n * Development configuration with stdio transport\n */\n development: {\n transport: 'stdio' as const,\n enableMetrics: true,\n auth: {\n enabled: false,\n method: 'token' as const,\n },\n },\n\n /**\n * Production configuration with HTTP transport and authentication\n */\n production: {\n transport: 'http' as const,\n host: '0.0.0.0',\n port: 3000,\n tlsEnabled: true,\n enableMetrics: true,\n auth: {\n enabled: true,\n method: 'token' as const,\n },\n loadBalancer: {\n enabled: true,\n maxRequestsPerSecond: 100,\n maxConcurrentRequests: 50,\n },\n sessionTimeout: 3600000, // 1 hour\n maxSessions: 1000,\n },\n\n /**\n * Testing configuration with minimal features\n */\n testing: {\n transport: 'stdio' as const,\n enableMetrics: false,\n auth: {\n enabled: false,\n method: 'token' as const,\n },\n },\n} as const;\n\n/**\n * MCP Utility Functions\n */\nexport const MCPUtils = {\n /**\n * Validate MCP protocol version\n */\n isValidProtocolVersion(version: import('../utils/types.js').MCPProtocolVersion): boolean {\n return (\n typeof version.major === 'number' &&\n typeof version.minor === 'number' &&\n typeof version.patch === 'number' &&\n version.major > 0\n );\n },\n\n /**\n * Compare two protocol versions\n */\n compareVersions(\n a: import('../utils/types.js').MCPProtocolVersion,\n b: import('../utils/types.js').MCPProtocolVersion,\n ): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n return a.patch - b.patch;\n },\n\n /**\n * Format protocol version as string\n */\n formatVersion(version: import('../utils/types.js').MCPProtocolVersion): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n },\n\n /**\n * Parse protocol version from string\n */\n parseVersion(versionString: string): import('../utils/types.js').MCPProtocolVersion {\n const parts = versionString.split('.').map((p) => parseInt(p, 10));\n if (parts.length !== 3 || parts.some((p) => isNaN(p))) {\n throw new Error(`Invalid version string: ${versionString}`);\n }\n return {\n major: parts[0],\n minor: parts[1],\n patch: parts[2],\n };\n },\n\n /**\n * Generate a random session ID\n */\n generateSessionId(): string {\n return `mcp_session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n },\n\n /**\n * Generate a random request ID\n */\n generateRequestId(): string {\n return `mcp_req_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n },\n};\n\n/**\n * Phase 6: Initialize MCP with in-process server for maximum performance\n *\n * Provides 10-100x performance improvement by eliminating IPC overhead.\n * All Claude-Flow MCP tools execute in-process with microsecond latency.\n */\nexport async function initializeInProcessMCP(orchestratorContext?: any) {\n const { initializeSDKIntegration } = await import('./sdk-integration.js');\n\n return initializeSDKIntegration({\n enableInProcess: true,\n enableMetrics: true,\n enableCaching: true,\n orchestratorContext,\n fallbackToStdio: true,\n });\n}\n\n/**\n * Phase 6: Get in-process server status and performance metrics\n */\nexport async function getInProcessMCPStatus() {\n const { getSDKIntegration } = await import('./sdk-integration.js');\n const integration = getSDKIntegration();\n\n if (!integration) {\n return {\n initialized: false,\n inProcess: false,\n message: 'In-process MCP not initialized',\n };\n }\n\n return {\n initialized: true,\n inProcess: integration.isInProcessAvailable(),\n metrics: integration.getMetrics(),\n performanceComparison: integration.getPerformanceComparison(),\n };\n}\n"],"names":["InProcessMCPServer","createInProcessServer","ClaudeFlowToolRegistry","createToolRegistry","createClaudeFlowSdkServer","SDKIntegration","initializeSDKIntegration","getSDKIntegration","createInProcessQuery","getInProcessServerConfig","measurePerformance","MCPServer","MCPLifecycleManager","LifecycleState","ToolRegistry","MCPProtocolManager","AuthManager","Permissions","MCPPerformanceMonitor","MCPOrchestrationIntegration","StdioTransport","HttpTransport","RequestRouter","SessionManager","LoadBalancer","RequestQueue","createClaudeFlowTools","createSwarmTools","MCPIntegrationFactory","createIntegration","config","mcpConfig","orchestrationConfig","components","logger","integration","enabledIntegrations","orchestrator","swarm","agents","resources","memory","monitoring","terminals","autoStart","healthCheckInterval","reconnectAttempts","reconnectDelay","enableMetrics","enableAlerts","createStandaloneServer","enableLifecycleManagement","enablePerformanceMonitoring","eventBus","EventEmitter","server","lifecycleManager","performanceMonitor","createDevelopmentSetup","transport","auth","enabled","method","protocolManager","DefaultMCPConfigs","development","production","host","port","tlsEnabled","loadBalancer","maxRequestsPerSecond","maxConcurrentRequests","sessionTimeout","maxSessions","testing","MCPUtils","isValidProtocolVersion","version","major","minor","patch","compareVersions","a","b","formatVersion","parseVersion","versionString","parts","split","map","p","parseInt","length","some","isNaN","Error","generateSessionId","Date","now","Math","random","toString","substring","generateRequestId","initializeInProcessMCP","orchestratorContext","enableInProcess","enableCaching","fallbackToStdio","getInProcessMCPStatus","initialized","inProcess","message","isInProcessAvailable","metrics","getMetrics","performanceComparison","getPerformanceComparison"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/mcp/index.ts"],"sourcesContent":["/**\n * MCP (Model Context Protocol) Module\n * Export all MCP components for easy integration\n */\n\n// Phase 6: In-Process MCP Server (10-100x performance improvement)\nexport { InProcessMCPServer, createInProcessServer } from './in-process-server.js';\nexport type { InProcessServerConfig, ToolCallMetrics } from './in-process-server.js';\n\nexport {\n ClaudeFlowToolRegistry,\n createToolRegistry,\n createClaudeFlowSdkServer,\n} from './tool-registry.js';\nexport type { ToolRegistryConfig } from './tool-registry.js';\n\nexport {\n SDKIntegration,\n initializeSDKIntegration,\n getSDKIntegration,\n createInProcessQuery,\n getInProcessServerConfig,\n measurePerformance,\n} from './sdk-integration.js';\nexport type { SDKIntegrationConfig } from './sdk-integration.js';\n\n// Core MCP Server\nexport { MCPServer, type IMCPServer } from './server.js';\n\n// MCP 2025-11 Server and Components\nexport { MCP2025Server, type MCP2025ServerConfig } from './server-mcp-2025.js';\nexport {\n MCPServerFactory,\n createMCPServer,\n isMCP2025Available,\n getServerCapabilities,\n type MCPFeatureFlags,\n type ExtendedMCPConfig,\n} from './server-factory.js';\n\n// MCP 2025-11 Protocol Components\nexport {\n VersionNegotiator,\n BackwardCompatibilityAdapter,\n type MCPHandshake,\n type MCPVersion,\n type MCPCapability,\n type NegotiationResult as MCP2025NegotiationResult,\n} from './protocol/version-negotiation.js';\n\n// MCP 2025-11 Async Job Management\nexport {\n MCPAsyncJobManager,\n type MCPToolRequest,\n type MCPJobHandle,\n type MCPJobResult,\n type AsyncJob,\n type JobStatus,\n} from './async/job-manager-mcp25.js';\n\n// MCP 2025-11 Registry Integration\nexport {\n MCPRegistryClient,\n type RegistryConfig,\n type ServerRegistryEntry,\n} from './registry/mcp-registry-client-2025.js';\n\n// MCP 2025-11 Schema Validation\nexport {\n SchemaValidator,\n upgradeToolSchema,\n type ValidationResult,\n} from './validation/schema-validator-2025.js';\n\n// Progressive Tool Registry (Phase 1 & 2)\nexport {\n ProgressiveToolRegistry,\n createProgressiveToolRegistry,\n createProgressiveClaudeFlowSdkServer,\n type ProgressiveToolRegistryConfig,\n} from './tool-registry-progressive.js';\n\n// Dynamic Tool Loader (Phase 1)\nexport {\n DynamicToolLoader,\n type ToolMetadata,\n type ToolSearchQuery,\n} from './tools/loader.js';\n\n// Lifecycle Management\nexport {\n MCPLifecycleManager,\n LifecycleState,\n type LifecycleEvent,\n type HealthCheckResult,\n type LifecycleManagerConfig,\n} from './lifecycle-manager.js';\n\n// Tool Registry and Management\nexport {\n ToolRegistry,\n type ToolCapability,\n type ToolMetrics,\n type ToolDiscoveryQuery,\n} from './tools.js';\n\n// Protocol Management\nexport {\n MCPProtocolManager,\n type ProtocolVersionInfo,\n type CompatibilityResult,\n type NegotiationResult,\n} from './protocol-manager.js';\n\n// Authentication and Authorization\nexport {\n AuthManager,\n type IAuthManager,\n type AuthContext,\n type AuthResult,\n type TokenInfo,\n type TokenGenerationOptions,\n type AuthSession,\n Permissions,\n} from './auth.js';\n\n// Performance Monitoring\nexport {\n MCPPerformanceMonitor,\n type PerformanceMetrics,\n type RequestMetrics,\n type AlertRule,\n type Alert,\n type OptimizationSuggestion,\n} from './performance-monitor.js';\n\n// Orchestration Integration\nexport {\n MCPOrchestrationIntegration,\n type OrchestrationComponents,\n type MCPOrchestrationConfig,\n type IntegrationStatus,\n} from './orchestration-integration.js';\n\n// Transport Implementations\nexport { type ITransport } from './transports/base.js';\nexport { StdioTransport } from './transports/stdio.js';\nexport { HttpTransport } from './transports/http.js';\n\n// Request Routing\nexport { RequestRouter } from './router.js';\n\n// Session Management\nexport { SessionManager, type ISessionManager } from './session-manager.js';\n\n// Load Balancing\nexport { LoadBalancer, type ILoadBalancer, RequestQueue } from './load-balancer.js';\n\n// Tool Implementations\nexport { createClaudeFlowTools, type ClaudeFlowToolContext } from './claude-flow-tools.js';\nexport { createSwarmTools, type SwarmToolContext } from './swarm-tools.js';\n\n/**\n * MCP Integration Factory\n * Provides a simple way to create a complete MCP integration\n */\nexport class MCPIntegrationFactory {\n /**\n * Create a complete MCP integration with all components\n */\n static async createIntegration(config: {\n mcpConfig: import('../utils/types.js').MCPConfig;\n orchestrationConfig?: Partial<MCPOrchestrationConfig>;\n components?: Partial<OrchestrationComponents>;\n logger: import('../core/logger.js').ILogger;\n }): Promise<MCPOrchestrationIntegration> {\n const { mcpConfig, orchestrationConfig = {}, components = {}, logger } = config;\n\n const integration = new MCPOrchestrationIntegration(\n mcpConfig,\n {\n enabledIntegrations: {\n orchestrator: true,\n swarm: true,\n agents: true,\n resources: true,\n memory: true,\n monitoring: true,\n terminals: true,\n },\n autoStart: true,\n healthCheckInterval: 30000,\n reconnectAttempts: 3,\n reconnectDelay: 5000,\n enableMetrics: true,\n enableAlerts: true,\n ...orchestrationConfig,\n },\n components,\n logger,\n );\n\n return integration;\n }\n\n /**\n * Create a standalone MCP server (without orchestration integration)\n */\n static async createStandaloneServer(config: {\n mcpConfig: import('../utils/types.js').MCPConfig;\n logger: import('../core/logger.js').ILogger;\n enableLifecycleManagement?: boolean;\n enablePerformanceMonitoring?: boolean;\n }): Promise<{\n server: MCPServer;\n lifecycleManager?: MCPLifecycleManager;\n performanceMonitor?: MCPPerformanceMonitor;\n }> {\n const {\n mcpConfig,\n logger,\n enableLifecycleManagement = true,\n enablePerformanceMonitoring = true,\n } = config;\n\n const eventBus = new (await import('node:events')).EventEmitter();\n const server = new MCPServer(mcpConfig, eventBus, logger);\n\n let lifecycleManager: MCPLifecycleManager | undefined;\n let performanceMonitor: MCPPerformanceMonitor | undefined;\n\n if (enableLifecycleManagement) {\n lifecycleManager = new MCPLifecycleManager(mcpConfig, logger, () => server);\n }\n\n if (enablePerformanceMonitoring) {\n performanceMonitor = new MCPPerformanceMonitor(logger);\n }\n\n return {\n server,\n lifecycleManager,\n performanceMonitor,\n };\n }\n\n /**\n * Create a development/testing MCP setup\n */\n static async createDevelopmentSetup(logger: import('../core/logger.js').ILogger): Promise<{\n server: MCPServer;\n lifecycleManager: MCPLifecycleManager;\n performanceMonitor: MCPPerformanceMonitor;\n protocolManager: MCPProtocolManager;\n }> {\n const mcpConfig: import('../utils/types.js').MCPConfig = {\n transport: 'stdio',\n enableMetrics: true,\n auth: {\n enabled: false,\n method: 'token',\n },\n };\n\n const { server, lifecycleManager, performanceMonitor } = await this.createStandaloneServer({\n mcpConfig,\n logger,\n enableLifecycleManagement: true,\n enablePerformanceMonitoring: true,\n });\n\n const protocolManager = new MCPProtocolManager(logger);\n\n return {\n server,\n lifecycleManager: lifecycleManager!,\n performanceMonitor: performanceMonitor!,\n protocolManager,\n };\n }\n}\n\n/**\n * Default MCP configuration for common use cases\n */\nexport const DefaultMCPConfigs = {\n /**\n * Development configuration with stdio transport\n */\n development: {\n transport: 'stdio' as const,\n enableMetrics: true,\n auth: {\n enabled: false,\n method: 'token' as const,\n },\n },\n\n /**\n * Production configuration with HTTP transport and authentication\n */\n production: {\n transport: 'http' as const,\n host: '0.0.0.0',\n port: 3000,\n tlsEnabled: true,\n enableMetrics: true,\n auth: {\n enabled: true,\n method: 'token' as const,\n },\n loadBalancer: {\n enabled: true,\n maxRequestsPerSecond: 100,\n maxConcurrentRequests: 50,\n },\n sessionTimeout: 3600000, // 1 hour\n maxSessions: 1000,\n },\n\n /**\n * Testing configuration with minimal features\n */\n testing: {\n transport: 'stdio' as const,\n enableMetrics: false,\n auth: {\n enabled: false,\n method: 'token' as const,\n },\n },\n} as const;\n\n/**\n * MCP Utility Functions\n */\nexport const MCPUtils = {\n /**\n * Validate MCP protocol version\n */\n isValidProtocolVersion(version: import('../utils/types.js').MCPProtocolVersion): boolean {\n return (\n typeof version.major === 'number' &&\n typeof version.minor === 'number' &&\n typeof version.patch === 'number' &&\n version.major > 0\n );\n },\n\n /**\n * Compare two protocol versions\n */\n compareVersions(\n a: import('../utils/types.js').MCPProtocolVersion,\n b: import('../utils/types.js').MCPProtocolVersion,\n ): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n return a.patch - b.patch;\n },\n\n /**\n * Format protocol version as string\n */\n formatVersion(version: import('../utils/types.js').MCPProtocolVersion): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n },\n\n /**\n * Parse protocol version from string\n */\n parseVersion(versionString: string): import('../utils/types.js').MCPProtocolVersion {\n const parts = versionString.split('.').map((p) => parseInt(p, 10));\n if (parts.length !== 3 || parts.some((p) => isNaN(p))) {\n throw new Error(`Invalid version string: ${versionString}`);\n }\n return {\n major: parts[0],\n minor: parts[1],\n patch: parts[2],\n };\n },\n\n /**\n * Generate a random session ID\n */\n generateSessionId(): string {\n return `mcp_session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n },\n\n /**\n * Generate a random request ID\n */\n generateRequestId(): string {\n return `mcp_req_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n },\n};\n\n/**\n * Phase 6: Initialize MCP with in-process server for maximum performance\n *\n * Provides 10-100x performance improvement by eliminating IPC overhead.\n * All Claude-Flow MCP tools execute in-process with microsecond latency.\n */\nexport async function initializeInProcessMCP(orchestratorContext?: any) {\n const { initializeSDKIntegration } = await import('./sdk-integration.js');\n\n return initializeSDKIntegration({\n enableInProcess: true,\n enableMetrics: true,\n enableCaching: true,\n orchestratorContext,\n fallbackToStdio: true,\n });\n}\n\n/**\n * Phase 6: Get in-process server status and performance metrics\n */\nexport async function getInProcessMCPStatus() {\n const { getSDKIntegration } = await import('./sdk-integration.js');\n const integration = getSDKIntegration();\n\n if (!integration) {\n return {\n initialized: false,\n inProcess: false,\n message: 'In-process MCP not initialized',\n };\n }\n\n return {\n initialized: true,\n inProcess: integration.isInProcessAvailable(),\n metrics: integration.getMetrics(),\n performanceComparison: integration.getPerformanceComparison(),\n };\n}\n"],"names":["InProcessMCPServer","createInProcessServer","ClaudeFlowToolRegistry","createToolRegistry","createClaudeFlowSdkServer","SDKIntegration","initializeSDKIntegration","getSDKIntegration","createInProcessQuery","getInProcessServerConfig","measurePerformance","MCPServer","MCP2025Server","MCPServerFactory","createMCPServer","isMCP2025Available","getServerCapabilities","VersionNegotiator","BackwardCompatibilityAdapter","MCPAsyncJobManager","MCPRegistryClient","SchemaValidator","upgradeToolSchema","ProgressiveToolRegistry","createProgressiveToolRegistry","createProgressiveClaudeFlowSdkServer","DynamicToolLoader","MCPLifecycleManager","LifecycleState","ToolRegistry","MCPProtocolManager","AuthManager","Permissions","MCPPerformanceMonitor","MCPOrchestrationIntegration","StdioTransport","HttpTransport","RequestRouter","SessionManager","LoadBalancer","RequestQueue","createClaudeFlowTools","createSwarmTools","MCPIntegrationFactory","createIntegration","config","mcpConfig","orchestrationConfig","components","logger","integration","enabledIntegrations","orchestrator","swarm","agents","resources","memory","monitoring","terminals","autoStart","healthCheckInterval","reconnectAttempts","reconnectDelay","enableMetrics","enableAlerts","createStandaloneServer","enableLifecycleManagement","enablePerformanceMonitoring","eventBus","EventEmitter","server","lifecycleManager","performanceMonitor","createDevelopmentSetup","transport","auth","enabled","method","protocolManager","DefaultMCPConfigs","development","production","host","port","tlsEnabled","loadBalancer","maxRequestsPerSecond","maxConcurrentRequests","sessionTimeout","maxSessions","testing","MCPUtils","isValidProtocolVersion","version","major","minor","patch","compareVersions","a","b","formatVersion","parseVersion","versionString","parts","split","map","p","parseInt","length","some","isNaN","Error","generateSessionId","Date","now","Math","random","toString","substring","generateRequestId","initializeInProcessMCP","orchestratorContext","enableInProcess","enableCaching","fallbackToStdio","getInProcessMCPStatus","initialized","inProcess","message","isInProcessAvailable","metrics","getMetrics","performanceComparison","getPerformanceComparison"],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export class VersionNegotiationError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(message, code){
|
|
4
|
+
super(message), this.code = code;
|
|
5
|
+
this.name = 'VersionNegotiationError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class VersionNegotiator {
|
|
9
|
+
logger;
|
|
10
|
+
supportedVersions = [
|
|
11
|
+
'2025-11',
|
|
12
|
+
'2024-11'
|
|
13
|
+
];
|
|
14
|
+
serverVersion = '2025-11';
|
|
15
|
+
serverCapabilities = [
|
|
16
|
+
'async',
|
|
17
|
+
'registry',
|
|
18
|
+
'code_exec',
|
|
19
|
+
'stream'
|
|
20
|
+
];
|
|
21
|
+
constructor(logger){
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
}
|
|
24
|
+
async negotiate(clientHandshake) {
|
|
25
|
+
this.logger.info('Starting version negotiation', {
|
|
26
|
+
clientVersion: clientHandshake.mcp_version,
|
|
27
|
+
serverVersion: this.serverVersion,
|
|
28
|
+
clientCapabilities: clientHandshake.capabilities
|
|
29
|
+
});
|
|
30
|
+
if (!this.isValidHandshake(clientHandshake)) {
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
agreed_version: this.serverVersion,
|
|
34
|
+
agreed_capabilities: [],
|
|
35
|
+
error: 'Invalid handshake structure'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const versionResult = this.checkVersionCompatibility(clientHandshake.mcp_version);
|
|
39
|
+
if (!versionResult.compatible) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
agreed_version: this.serverVersion,
|
|
43
|
+
agreed_capabilities: [],
|
|
44
|
+
error: versionResult.error
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const agreedCapabilities = this.negotiateCapabilities(clientHandshake.capabilities);
|
|
48
|
+
this.logger.info('Version negotiation successful', {
|
|
49
|
+
agreedVersion: versionResult.version,
|
|
50
|
+
agreedCapabilities
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
success: true,
|
|
54
|
+
agreed_version: versionResult.version,
|
|
55
|
+
agreed_capabilities: agreedCapabilities
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
isValidHandshake(handshake) {
|
|
59
|
+
return !!(handshake.mcp_version && handshake.transport && Array.isArray(handshake.capabilities));
|
|
60
|
+
}
|
|
61
|
+
checkVersionCompatibility(clientVersion) {
|
|
62
|
+
if (clientVersion === this.serverVersion) {
|
|
63
|
+
return {
|
|
64
|
+
compatible: true,
|
|
65
|
+
version: clientVersion
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (this.supportedVersions.includes(clientVersion)) {
|
|
69
|
+
this.logger.warn('Client using older version, but compatible', {
|
|
70
|
+
clientVersion,
|
|
71
|
+
serverVersion: this.serverVersion
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
compatible: true,
|
|
75
|
+
version: clientVersion
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const clientDate = this.parseVersion(clientVersion);
|
|
79
|
+
const serverDate = this.parseVersion(this.serverVersion);
|
|
80
|
+
const monthsDiff = this.getMonthsDifference(clientDate, serverDate);
|
|
81
|
+
if (Math.abs(monthsDiff) > 1) {
|
|
82
|
+
return {
|
|
83
|
+
compatible: false,
|
|
84
|
+
version: this.serverVersion,
|
|
85
|
+
error: `Version mismatch: client ${clientVersion}, server ${this.serverVersion}. Difference exceeds 1 cycle.`
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
this.logger.warn('Version close enough, accepting', {
|
|
89
|
+
clientVersion,
|
|
90
|
+
serverVersion: this.serverVersion,
|
|
91
|
+
monthsDiff
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
compatible: true,
|
|
95
|
+
version: this.serverVersion
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
negotiateCapabilities(clientCapabilities) {
|
|
99
|
+
return clientCapabilities.filter((cap)=>this.serverCapabilities.includes(cap));
|
|
100
|
+
}
|
|
101
|
+
parseVersion(version) {
|
|
102
|
+
const [year, month] = version.split('-').map(Number);
|
|
103
|
+
return new Date(year, month - 1, 1);
|
|
104
|
+
}
|
|
105
|
+
getMonthsDifference(date1, date2) {
|
|
106
|
+
const months = (date2.getFullYear() - date1.getFullYear()) * 12;
|
|
107
|
+
return months + date2.getMonth() - date1.getMonth();
|
|
108
|
+
}
|
|
109
|
+
createServerHandshake(serverId, transport, metadata) {
|
|
110
|
+
return {
|
|
111
|
+
mcp_version: this.serverVersion,
|
|
112
|
+
server_id: serverId,
|
|
113
|
+
transport,
|
|
114
|
+
capabilities: this.serverCapabilities,
|
|
115
|
+
metadata
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
getServerVersion() {
|
|
119
|
+
return this.serverVersion;
|
|
120
|
+
}
|
|
121
|
+
getServerCapabilities() {
|
|
122
|
+
return [
|
|
123
|
+
...this.serverCapabilities
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
hasCapability(capability) {
|
|
127
|
+
return this.serverCapabilities.includes(capability);
|
|
128
|
+
}
|
|
129
|
+
addCapability(capability) {
|
|
130
|
+
if (!this.serverCapabilities.includes(capability)) {
|
|
131
|
+
this.serverCapabilities.push(capability);
|
|
132
|
+
this.logger.info('Capability added', {
|
|
133
|
+
capability
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
removeCapability(capability) {
|
|
138
|
+
const index = this.serverCapabilities.indexOf(capability);
|
|
139
|
+
if (index > -1) {
|
|
140
|
+
this.serverCapabilities.splice(index, 1);
|
|
141
|
+
this.logger.info('Capability removed', {
|
|
142
|
+
capability
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export class BackwardCompatibilityAdapter {
|
|
148
|
+
logger;
|
|
149
|
+
constructor(logger){
|
|
150
|
+
this.logger = logger;
|
|
151
|
+
}
|
|
152
|
+
isLegacyRequest(request) {
|
|
153
|
+
return !request.mcp_version || request.version;
|
|
154
|
+
}
|
|
155
|
+
convertToModern(legacyRequest) {
|
|
156
|
+
this.logger.info('Converting legacy request to MCP 2025-11 format');
|
|
157
|
+
return {
|
|
158
|
+
mcp_version: '2025-11',
|
|
159
|
+
client_id: legacyRequest.clientId || 'legacy-client',
|
|
160
|
+
transport: legacyRequest.transport || 'stdio',
|
|
161
|
+
capabilities: legacyRequest.capabilities || [],
|
|
162
|
+
metadata: {
|
|
163
|
+
name: legacyRequest.name || 'Legacy Client',
|
|
164
|
+
version: legacyRequest.version || '1.0.0'
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
convertToLegacy(modernResponse, requestedLegacy) {
|
|
169
|
+
if (!requestedLegacy) {
|
|
170
|
+
return modernResponse;
|
|
171
|
+
}
|
|
172
|
+
this.logger.info('Converting response to legacy format');
|
|
173
|
+
return {
|
|
174
|
+
version: modernResponse.mcp_version,
|
|
175
|
+
serverId: modernResponse.server_id,
|
|
176
|
+
capabilities: modernResponse.capabilities,
|
|
177
|
+
...modernResponse
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//# sourceMappingURL=version-negotiation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/mcp/protocol/version-negotiation.ts"],"sourcesContent":["/**\n * MCP 2025-11 Version Negotiation Protocol\n *\n * Implements version negotiation and capability exchange\n * per MCP 2025-11 specification\n */\n\nimport type { ILogger } from '../../interfaces/logger.js';\n\n/**\n * MCP version in YYYY-MM format\n */\nexport type MCPVersion = '2025-11' | '2024-11' | '2024-10';\n\n/**\n * MCP capability flags\n */\nexport type MCPCapability =\n | 'async' // Job handles, poll/resume\n | 'registry' // Self-registration\n | 'code_exec' // External code execution\n | 'stream' // Streaming output\n | 'sandbox' // Isolated execution\n | 'schema_ref'; // Shared schema references\n\n/**\n * MCP handshake request/response\n */\nexport interface MCPHandshake {\n mcp_version: MCPVersion;\n client_id?: string;\n server_id?: string;\n transport: 'stdio' | 'http' | 'ws';\n capabilities: MCPCapability[];\n metadata?: {\n name?: string;\n version?: string;\n description?: string;\n };\n}\n\n/**\n * Version negotiation result\n */\nexport interface NegotiationResult {\n success: boolean;\n agreed_version: MCPVersion;\n agreed_capabilities: MCPCapability[];\n error?: string;\n}\n\n/**\n * Version negotiation errors\n */\nexport class VersionNegotiationError extends Error {\n constructor(\n message: string,\n public code: 'VERSION_MISMATCH' | 'UNSUPPORTED_CAPABILITY' | 'INVALID_HANDSHAKE'\n ) {\n super(message);\n this.name = 'VersionNegotiationError';\n }\n}\n\n/**\n * MCP Version Negotiator\n *\n * Handles version compatibility checking and capability negotiation\n */\nexport class VersionNegotiator {\n // Supported versions in order of preference\n private supportedVersions: MCPVersion[] = ['2025-11', '2024-11'];\n\n // Current server version\n private serverVersion: MCPVersion = '2025-11';\n\n // Server capabilities\n private serverCapabilities: MCPCapability[] = [\n 'async',\n 'registry',\n 'code_exec',\n 'stream',\n ];\n\n constructor(private logger: ILogger) {}\n\n /**\n * Negotiate version with client\n */\n async negotiate(clientHandshake: MCPHandshake): Promise<NegotiationResult> {\n this.logger.info('Starting version negotiation', {\n clientVersion: clientHandshake.mcp_version,\n serverVersion: this.serverVersion,\n clientCapabilities: clientHandshake.capabilities,\n });\n\n // Validate handshake structure\n if (!this.isValidHandshake(clientHandshake)) {\n return {\n success: false,\n agreed_version: this.serverVersion,\n agreed_capabilities: [],\n error: 'Invalid handshake structure',\n };\n }\n\n // Check version compatibility\n const versionResult = this.checkVersionCompatibility(clientHandshake.mcp_version);\n if (!versionResult.compatible) {\n return {\n success: false,\n agreed_version: this.serverVersion,\n agreed_capabilities: [],\n error: versionResult.error,\n };\n }\n\n // Negotiate capabilities\n const agreedCapabilities = this.negotiateCapabilities(\n clientHandshake.capabilities\n );\n\n this.logger.info('Version negotiation successful', {\n agreedVersion: versionResult.version,\n agreedCapabilities,\n });\n\n return {\n success: true,\n agreed_version: versionResult.version,\n agreed_capabilities: agreedCapabilities,\n };\n }\n\n /**\n * Check if handshake is valid\n */\n private isValidHandshake(handshake: MCPHandshake): boolean {\n return !!(\n handshake.mcp_version &&\n handshake.transport &&\n Array.isArray(handshake.capabilities)\n );\n }\n\n /**\n * Check version compatibility\n */\n private checkVersionCompatibility(clientVersion: MCPVersion): {\n compatible: boolean;\n version: MCPVersion;\n error?: string;\n } {\n // Exact match - best case\n if (clientVersion === this.serverVersion) {\n return { compatible: true, version: clientVersion };\n }\n\n // Check if client version is supported\n if (this.supportedVersions.includes(clientVersion)) {\n this.logger.warn('Client using older version, but compatible', {\n clientVersion,\n serverVersion: this.serverVersion,\n });\n return { compatible: true, version: clientVersion };\n }\n\n // Check version gap\n const clientDate = this.parseVersion(clientVersion);\n const serverDate = this.parseVersion(this.serverVersion);\n const monthsDiff = this.getMonthsDifference(clientDate, serverDate);\n\n // Reject if more than 1 cycle (1 month) difference\n if (Math.abs(monthsDiff) > 1) {\n return {\n compatible: false,\n version: this.serverVersion,\n error: `Version mismatch: client ${clientVersion}, server ${this.serverVersion}. Difference exceeds 1 cycle.`,\n };\n }\n\n // Accept with warning for small differences\n this.logger.warn('Version close enough, accepting', {\n clientVersion,\n serverVersion: this.serverVersion,\n monthsDiff,\n });\n return { compatible: true, version: this.serverVersion };\n }\n\n /**\n * Negotiate capabilities between client and server\n */\n private negotiateCapabilities(\n clientCapabilities: MCPCapability[]\n ): MCPCapability[] {\n // Return intersection of client and server capabilities\n return clientCapabilities.filter(cap =>\n this.serverCapabilities.includes(cap)\n );\n }\n\n /**\n * Parse version string to date\n */\n private parseVersion(version: MCPVersion): Date {\n const [year, month] = version.split('-').map(Number);\n return new Date(year, month - 1, 1);\n }\n\n /**\n * Calculate months difference between dates\n */\n private getMonthsDifference(date1: Date, date2: Date): number {\n const months = (date2.getFullYear() - date1.getFullYear()) * 12;\n return months + date2.getMonth() - date1.getMonth();\n }\n\n /**\n * Create server handshake response\n */\n createServerHandshake(\n serverId: string,\n transport: 'stdio' | 'http' | 'ws',\n metadata?: MCPHandshake['metadata']\n ): MCPHandshake {\n return {\n mcp_version: this.serverVersion,\n server_id: serverId,\n transport,\n capabilities: this.serverCapabilities,\n metadata,\n };\n }\n\n /**\n * Get current server version\n */\n getServerVersion(): MCPVersion {\n return this.serverVersion;\n }\n\n /**\n * Get server capabilities\n */\n getServerCapabilities(): MCPCapability[] {\n return [...this.serverCapabilities];\n }\n\n /**\n * Check if capability is supported\n */\n hasCapability(capability: MCPCapability): boolean {\n return this.serverCapabilities.includes(capability);\n }\n\n /**\n * Add capability (dynamic capability registration)\n */\n addCapability(capability: MCPCapability): void {\n if (!this.serverCapabilities.includes(capability)) {\n this.serverCapabilities.push(capability);\n this.logger.info('Capability added', { capability });\n }\n }\n\n /**\n * Remove capability\n */\n removeCapability(capability: MCPCapability): void {\n const index = this.serverCapabilities.indexOf(capability);\n if (index > -1) {\n this.serverCapabilities.splice(index, 1);\n this.logger.info('Capability removed', { capability });\n }\n }\n}\n\n/**\n * Backward compatibility helper\n * Converts legacy requests to MCP 2025-11 format\n */\nexport class BackwardCompatibilityAdapter {\n constructor(private logger: ILogger) {}\n\n /**\n * Detect if request is legacy format\n */\n isLegacyRequest(request: any): boolean {\n // Legacy requests don't have mcp_version field\n return !request.mcp_version || request.version;\n }\n\n /**\n * Convert legacy request to MCP 2025-11 format\n */\n convertToModern(legacyRequest: any): MCPHandshake {\n this.logger.info('Converting legacy request to MCP 2025-11 format');\n\n return {\n mcp_version: '2025-11',\n client_id: legacyRequest.clientId || 'legacy-client',\n transport: legacyRequest.transport || 'stdio',\n capabilities: legacyRequest.capabilities || [],\n metadata: {\n name: legacyRequest.name || 'Legacy Client',\n version: legacyRequest.version || '1.0.0',\n },\n };\n }\n\n /**\n * Convert modern response to legacy format if needed\n */\n convertToLegacy(modernResponse: any, requestedLegacy: boolean): any {\n if (!requestedLegacy) {\n return modernResponse;\n }\n\n this.logger.info('Converting response to legacy format');\n\n return {\n version: modernResponse.mcp_version,\n serverId: modernResponse.server_id,\n capabilities: modernResponse.capabilities,\n ...modernResponse,\n };\n }\n}\n"],"names":["VersionNegotiationError","Error","message","code","name","VersionNegotiator","supportedVersions","serverVersion","serverCapabilities","logger","negotiate","clientHandshake","info","clientVersion","mcp_version","clientCapabilities","capabilities","isValidHandshake","success","agreed_version","agreed_capabilities","error","versionResult","checkVersionCompatibility","compatible","agreedCapabilities","negotiateCapabilities","agreedVersion","version","handshake","transport","Array","isArray","includes","warn","clientDate","parseVersion","serverDate","monthsDiff","getMonthsDifference","Math","abs","filter","cap","year","month","split","map","Number","Date","date1","date2","months","getFullYear","getMonth","createServerHandshake","serverId","metadata","server_id","getServerVersion","getServerCapabilities","hasCapability","capability","addCapability","push","removeCapability","index","indexOf","splice","BackwardCompatibilityAdapter","isLegacyRequest","request","convertToModern","legacyRequest","client_id","clientId","convertToLegacy","modernResponse","requestedLegacy"],"mappings":"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"}
|
|
@@ -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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"}
|