ICUICU
critical

@promptx/mcp-server

v1.28.3

MCP Server implementation for PromptX

npmdeepracticexnpmFirst seen Feb 22, 2026Source

59

Total

5

Critical

44

High

10

Medium

Findings

unknown
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

>>> 1: {"version":3,"sources":["../src/servers/BaseMCPServer.ts","../src/errors/MCPError.ts","../src/errors/ErrorCollector.ts","../src/servers/StdioMCPServer.ts","../src/servers/StreamableHttpMCPServer.ts","../src/workers/WorkerpoolAdapter.ts","../src/servers/PromptXMCPServer.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { Tool, Resource, Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport {\n  ListToolsRequestSchema,\n  CallToolRequestSchema,\n  ListResourcesRequestSchema,\n  ListPromptsRequestSchema,\n  GetPromptRequestSchema,\n  ReadResourceRequestSchema\n} from '@modelcontextprotocol/sdk/types.js';\nimport logger, { type Logger } from '@promptx/logger';\nimport type {\n  MCPServer,\n  MCPServerOptions,\n  ServerState,\n  ToolHandler,\n  ToolWithHandler,\n  HealthCheckResult,\n  ServerMetrics,\n  SessionContext\n} from '~/interfaces/MCPServer.js';\nimport { \n  MCPError, \n  ToolExecutionError, \n  ResourceAccessError,\n  ErrorHelper,\n  ErrorSeverity \n} from '~/errors/MCPError.js';\nimport { globalErrorCollector } from '~/errors/ErrorCollector.js';\n\n/**\n * 基础MCP服务器实现\n * \n * 设计模式:Template Method Pattern\n * 子类需要实现特定的传输层逻辑\n * \n * 不变式:\n * 1. 状态转换必须原子性\n * 2. 资源注册必须幂等\n * 3. 错误不能破坏内部状态\n */\nexport abstract class BaseMCPServer implements MCPServer {\n  protected server: Server;\n  protected logger: Logger;\n  protected state: ServerState = 'IDLE';\n  protected options: MCPServerOptions;\n  \n  // 资源存储\n  protected tools = new Map<string, ToolWithHandler>();\n  protected resources = new Map<string, Resource>();\n  protected prompts = new Map<string, Prompt>();\n  protected sessions = new Map<string, SessionContext>();\n  \n  // 并发控制\n  protected activeRequests = 0;\n  protected readonly requestLocks = new Map<string, Promise<any>>();\n  \n  // 指标收集\n  protected metrics: ServerMetrics = {\n    requestCount: 0,\n    errorCount: 0,\n    avgResponseTime: 0,\n    activeConnections: 0,\n    memoryUsage: process.memoryUsage(),\n    startTime: 0,\n    uptime: 0\n  };\n  \n  // 最后错误(用于诊断)\n  protected lastError?: Error;\n  \n  constructor(options: MCPServerOptions) {\n    this.options = options;\n    this.logger = options.logger || logger;\n    \n    // 设置错误阈值\n    this.setupErrorThresholds();\n    \n    // 初始化MCP SDK服务器\n    this.server = new Server(\n      {\n        name: options.name,\n        version: options.version\n      },\n      {\n        capabilities: this.buildCapabilities()\n      }\n    );\n    \n    this.setupHandlers();\n  }\n  \n  /**\n   * 设置错误阈值\n   */\n  protected setupErrorThresholds(): void {\n    // 严重错误超过5个时触发告警\n    globalErrorCollector.setThreshold('severity:critical', 5, () => {\n      this.logger.error('[ALERT] Critical error threshold reached!');\n      // 可以在这里发送告警通知\n    });\n    \n    // 致命错误立即触发\n    globalErrorCollector.setThreshold('severity:fatal', 1, () => {\n      this.logger.error('[ALERT] Fatal error occurred! Server may need restart.');\n      this.setState('FATAL_ERROR');\n    });\n    \n    // 工具执行错误过多时告警\n    globalErrorCollector.setThreshold('category:tool_execution', 10, () => {\n      this.logger.warn('[ALERT] Too many tool execution errors');\n    });\n  }\n  \n  /**\n   * 构建服务器能力声明\n   */\n  protected buildCapabilities() {\n    return {\n      tools: {},  // 始终声明支持工具\n      resources: {},  // 始终声明支持资源\n      prompts: {}  // 始终声明支持提示词\n    };\n  }\n  \n  /**\n   * 设置请求处理器\n   */\n  protected setupHandlers(): void {\n    // 工具列表请求\n    this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n      this.logger.debug('Handling list tools request');\n      return {\n        tools: Array.from(this.tools.values()).map(({ handler, ...tool }) => tool)\n      };\n    });\n    \n    // 工具调用请求\n    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      this.logger.debug(`Handling tool call: ${request.params.name}`);\n      return this.executeTool(request.params.name, request.params.arguments);\n    });\n    \n    // 资源列表请求\n    this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n      this.logger.debug('Handling list resources request');\n      return {\n        resources: Array.from(this.resources.values())\n      };\n    });\n    \n    // 读取资源请求\n    this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n      this.logger.debug(`Handling read resource: ${request.params.uri}`);\n      const resource = this.resources.get(request.params.uri);\n      if (!resource) {\n        throw new Error(`Resource not found: ${request.params.uri}`);\n      }\n      // 子类需要实现实际的资源读取逻辑\n      return this.readResource(resource);\n    });\n    \n    // 提示词列表请求\n    this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n      this.logger.debug('Handling list prompts request');\n      return {\n        prompts: Array.from(this.prompts.values())\n      };\n    });\n    \n    // 获取提示词请求\n    this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n      this.logger.debug(`Handling get prompt: ${request.params.name}`);\n      const prompt = this.prompts.get(request.params.name);\n      if (!prompt) {\n        throw new Error(`Prompt not found: ${request.params.name}`);\n      }\n      return { prompt };\n    });\n  }\n  \n  /**\n   * 子类需要实现的资源读取方法\n   */\n  protected abstract readResource(resource: Resource): Promise<any>;\n  \n  /**\n   * 子类需要实现的传输层连接方法\n   */\n  protected abstract connectTransport(): Promise<void>;\n  \n  /**\n   * 子类需要实现的传输层断开方法\n   */\n  protected abstract disconnectTransport(): Promise<void>;\n  \n  // ============ 生命周期管理 ============\n  \n  async start(options?: MCPServerOptions): Promise<void> {\n    if (this.state === 'RUNNING' || this.state === 'STARTING') {\n      throw new Error('Server is already running or starting');\n    }\n    \n    this.setState('STARTING');\n    this.logger.info('Starting MCP server...');\n    \n    try {\n      // 合并选项\n      if (options) {\n        this.options = { ...this.options, ...options };\n      }\n      \n      // 连接传输层\n      await this.connectTransport();\n      \n      // 记录启动时间\n      this.metrics.startTime = Date.now();\n      \n      this.setState('RUNNING');\n      this.logger.info('MCP server started successfully');\n    } catch (error) {\n      this.setState('ERROR');\n      this.lastError = error as Error;\n      this.logger.error('Failed to start server', error);\n      throw error;\n    }\n  }\n  \n  async stop(): Promise<void> {\n    if (this.state !== 'RUNNING') {\n      throw new Error(`Invalid state transition: cannot stop from ${this.state}`);\n    }\n    \n    this.setState('STOPPING');\n    this.logger.info('Stopping MCP server...');\n    \n    try {\n      // 等待所有活跃请求完成\n      await this.waitForActiveRequests();\n      \n      // 断开传输层\n      await this.disconnectTransport();\n      \n      // 清理会话\n      this.sessions.clear();\n      \n      this.setState('STOPPED');\n      this.logger.info('MCP server stopped');\n    } catch (error) {\n      this.setState('ERROR');\n      this.lastError = error as Error;\n      this.logger.error('Error stopping server', error);\n      throw error;\n    }\n  }\n  \n  async gracefulShutdown(timeoutMs: number): Promise<void> {\n    this.logger.info(`Graceful shutdown initiated with ${timeoutMs}ms timeout`);\n    \n    const shutdownPromise = this.stop();\n    const timeoutPromise = new Promise<void>((_, reject) => {\n      setTimeout(() => reject(new Error('Shutdown timeout')), timeoutMs);\n    });\n    \n    try {\n      await Promise.race([shutdownPromise, timeoutPromise]);\n    } catch (error) {\n      if ((error as Error).message === 'Shutdown timeout') {\n        this.logger.warn('Graceful shutdown timeout, forcing stop');\n        this.setState('STOPPED');\n      } else {\n        throw error;\n      }\n    }\n  }\n  \n  // 删除recover方法 - 错误就是错误,不要自动恢复\n  \n  isRunning(): boolean {\n    return this.state === 'RUNNING';\n  }\n  \n  getState(): ServerState {\n    return this.state;\n  }\n  \n  protected setState(newState: ServerState): void {\n    const oldState = this.state;\n    this.state = newState;\n    this.logger.info(`[STATE_CHANGE] ${oldState} -> ${newState}`);\n    \n    // 发出状态变化事件(如果有监听器)\n    if (oldState !== newState) {\n      this.logger.debug(`[STATE_DETAILS] Previous: ${oldState}, Current: ${newState}, Running: ${this.isRunning()}`);\n    }\n  }\n  \n  // ============ 工具管理 ============\n  \n  registerTool(tool: ToolWithHandler): void {\n    if (this.tools.has(tool.name)) {\n      throw new Error(`Tool ${tool.name} already registered`);\n    }\n    \n    this.tools.set(tool.name, tool);\n    this.logger.info(`Tool registered: ${tool.name}`);\n  }\n  \n  unregisterTool(name: string): void {\n    if (!this.tools.has(name)) {\n      this.logger.warn(`Tool ${name} not found for unregistration`);\n      return;\n    }\n    \n    this.tools.delete(name);\n    this.logger.info(`Tool unregistered: ${name}`);\n  }\n  \n  getTool(name: string): Tool | undefined {\n    const tool = this.tools.get(name);\n    if (tool) {\n      const { handler, ...toolDef } = tool;\n      return toolDef;\n    }\n    return undefined;\n  }\n  \n  listTools(): Tool[] {\n    return Array.from(this.tools.values()).map(({ handler, ...tool }) => tool);\n  }\n  \n  async executeTool(name: string, args: any): Promise<any> {\n    if (!this.isRunning()) {\n      this.logger.warn(`Attempted to execute tool '${name}' while server is not running`);\n      throw new Error('Server is not running');\n    }\n    \n    const tool = this.tools.get(name);\n    if (!tool) {\n      this.logger.error(`Tool not found: ${name}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`);\n      throw new Error(`Tool not found: ${name}`);\n    }\n    \n    const startTime = Date.now();\n    \n    this.logger.info(`[TOOL_EXEC_START] Tool: ${name}`);\n    this.logger.debug(`[TOOL_ARGS] ${name}:`, args);\n    \n    try {\n      const result = await tool.handler(args);\n      \n      const responseTime = Date.now() - startTime;\n      this.logger.info(`[TOOL_EXEC_SUCCESS] Tool: ${name}, Time: ${responseTime}ms`);\n      this.logger.debug(`[TOOL_RESULT] ${name}:`, result);\n      \n      return result;\n    } catch (error: any) {\n      // 直接失败,不重试,不计数,简单明了\n      this.logger.error(`[TOOL_EXEC_ERROR] Tool: ${name}`, error);\n      throw error;\n    }\n  }\n  \n  // ============ 资源管理 ============\n  \n  registerResource(resource: Resource): void {\n    if (this.resources.has(resource.uri)) {\n      throw new Error(`Resource ${resource.uri} already registered`);\n    }\n    \n    this.resources.set(resource.uri, resource);\n    this.logger.info(`Resource registered: ${resource.uri}`);\n  }\n  \n  unregisterResource(uri: string): void {\n    if (!this.resources.has(uri)) {\n      this.logger.warn(`Resource ${uri} not found for unregistration`);\n      return;\n    }\n    \n    this.resources.delete(uri);\n    this.logger.info(`Resource unregistered: ${uri}`);\n  }\n  \n  getResource(uri: string): Resource | undefined {\n    return this.resources.get(uri);\n  }\n  \n  listResources(): Resource[] {\n    return Array.from(this.resources.values());\n  }\n  \n  // ============ 提示词管理 ============\n  \n  registerPrompt(prompt: Prompt): void {\n    if (this.prompts.has(prompt.name)) {\n      throw new Error(`Prompt ${prompt.name} already registered`);\n    }\n    \n    this.prompts.set(prompt.name, prompt);\n    this.logger.info(`Prompt registered: ${prompt.name}`);\n  }\n  \n  unregisterPrompt(name: string): void {\n    if (!this.prompts.has(name)) {\n      this.logger.warn(`Prompt ${name} not found for unregistration`);\n      return;\n    }\n    \n    this.prompts.delete(name);\n    this.logger.info(`Prompt unregistered: ${name}`);\n  }\n  \n  getPrompt(name: string): Prompt | undefined {\n    return this.prompts.get(name);\n  }\n  \n  listPrompts(): Prompt[] {\n    return Array.from(this.prompts.values());\n  }\n  \n  // ============ 会话管理 ============\n  \n  async createSession(metadata?: Record<string, any>): Promise<SessionContext> {\n    const sessionId = this.generateSessionId();\n    const session: SessionContext = {\n      id: sessionId,\n      createdAt: Date.now(),\n      lastActivity: Date.now(),\n      metadata\n    };\n    \n    this.sessions.set(sessionId, session);\n    this.logger.info(`Session created: ${sessionId}`);\n    \n    // 会话清理\n    if (this.options.sessionTimeout) {\n      setTimeout(() => {\n        this.destroySession(sessionId);\n      }, this.options.sessionTimeout);\n    }\n    \n    return session;\n  }\n  \n  getSession(sessionId: string): SessionContext | undefined {\n    const session = this.sessions.get(sessionId);\n    if (session) {\n      session.lastActivity = Date.now();\n    }\n    return session;\n  }\n  \n  async destroySession(sessionId: string): Promise<void> {\n    if (!this.sessions.has(sessionId)) {\n      this.logger.warn(`Session ${sessionId} not found for destruction`);\n      return;\n    }\n    \n    this.sessions.delete(sessionId);\n    this.logger.info(`Session destroyed: ${sessionId}`);\n  }\n  \n  listSessions(): SessionContext[] {\n    return Array.from(this.sessions.values());\n  }\n  \n  // ============ 监控与可观测性 ============\n  \n  /**\n   * 获取错误统计报告\n   */\n  getErrorReport(): string {\n    return globalErrorCollector.exportReport();\n  }\n  \n  /**\n   * 获取错误统计\n   */\n  getErrorStats(): any {\n    return globalErrorCollector.getStats();\n  }\n  \n  async healthCheck(): Promise<HealthCheckResult> {\n    const memUsage = process.memoryUsage();\n    const memoryPercentage = (memUsage.heapUsed / memUsage.heapTotal) * 100;\n    \n    const health: HealthCheckResult = {\n      status: 'healthy',\n      timestamp: Date.now(),\n      checks: {\n        server: {\n          status: this.isRunning() ? 'up' : 'down',\n          message: `Server is ${this.state}`\n        },\n        resources: {\n          registered: this.tools.size + this.resources.size + this.prompts.size,\n          available: this.tools.size + this.resources.size + this.prompts.size\n        },\n        memory: {\n          used: memUsage.heapUsed,\n          limit: memUsage.heapTotal,\n          percentage: memoryPercentage\n        }\n      }\n    };\n    \n    // 判断健康状态\n    if (this.state === 'ERROR' || this.state === 'FATAL_ERROR') {\n      health.status = 'unhealthy';\n      health.errors = [this.lastError?.message || 'Unknown error'];\n    } else if (memoryPercentage > 80 || this.activeRequests > (this.options.maxConcurrentRequests || 100)) {\n      health.status = 'degraded';\n    }\n    \n    return health;\n  }\n  \n  getMetrics(): ServerMetrics {\n    this.metrics.memoryUsage = process.memoryUsage();\n    this.metrics.uptime = this.metrics.startTime ? Date.now() - this.metrics.startTime : 0;\n    this.metrics.activeConnections = this.sessions.size;\n    return { ...this.metrics };\n  }\n  \n  setLogger(logger: Logger): void {\n    this.logger = logger;\n  }\n  \n  // ============ 辅助方法 ============\n  \n  protected generateSessionId(): string {\n    return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n  \n  protected async waitForActiveRequests(): Promise<void> {\n    while (this.activeRequests > 0) {\n      this.logger.debug(`Waiting for ${this.activeRequests} active requests to complete`);\n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n  }\n  \n  protected updateAvgResponseTime(newTime: number): void {\n    const count = this.metrics.requestCount;\n    const currentAvg = this.metrics.avgResponseTime;\n    this.metrics.avgResponseTime = (currentAvg * (count - 1) + newTime) / count;\n  }\n}","/**\n * MCP错误类型系统\n * \n * 提供统一的错误分类和处理机制\n */\n\n/**\n * 错误严重程度\n */\nexport enum ErrorSeverity {\n  /** 可忽略的警告 */\n  WARNING = 'warning',\n  /** 需要人工干预的错误 */\n  CRITICAL = 'critical',\n  /** 致命错误,需要重启 */\n  FATAL = 'fatal'\n}\n\n/**\n * 错误类别\n */\nexport enum ErrorCategory {\n  /** 网络相关错误 */\n  NETWORK = 'network',\n  /** 协议错误(JSON-RPC等) */\n  PROTOCOL = 'protocol',\n  /** 工具执行错误 */\n  TOOL_EXECUTION = 'tool_execution',\n  /** 资源访问错误 */\n  RESOURCE_ACCESS = 'resource_access',\n  /** 会话管理错误 */\n  SESSION = 'session',\n  /** 传输层错误 */\n  TRANSPORT = 'transport',\n  /** 配置错误 */\n  CONFIGURATION = 'configuration',\n  /** 内部错误 */\n  INTERNAL = 'internal'\n}\n\n/**\n * MCP基础错误类\n */\nexport class MCPError extends Error {\n  /** 错误代码 */\n  public readonly code: string;\n  /** 错误严重程度 */\n  public readonly severity: ErrorSeverity;\n  /** 错误类别 */\n  public readonly category: ErrorCategory;\n  /** 错误上下文 */\n  public readonly context?: any;\n  /** 错误发生时间 */\n  public readonly timestamp: number;\n  /** 原始错误 */\n  public readonly cause?: Error;\n  \n  constructor(\n    message: string,\n    code: string,\n    severity: ErrorSeverity,\n    category: ErrorCategory,\n    options?: {\n      cause?: Error;\n      context?: any;\n    }\n  ) {\n    super(message);\n    this.name = 'MCPError';\n    this.code = code;\n    this.severity = severity;\n    this.category = category;\n    this.cause = options?.cause;\n    this.context = options?.context;\n    this.timestamp = Date.now();\n    \n    \n    // 保持原始堆栈信息\n    if (options?.cause && options.cause.stack) {\n      this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\n    }\n  }\n  \n  /**\n   * 转换为JSON-RPC错误格式\n   */\n  toJsonRpcError(): { code: number; message: string; data?: any } {\n    // 根据类别映射到JSON-RPC错误码\n    let jsonRpcCode: number;\n    \n    switch (this.category) {\n      case ErrorCategory.PROTOCOL:\n        jsonRpcCode = -32700; // Parse error\n        break;\n      case ErrorCategory.TOOL_EXECUTION:\n        jsonRpcCode = -32602; // Invalid params\n        break;\n      case ErrorCategory.RESOURCE_ACCESS:\n        jsonRpcCode = -32001; // Custom: Resource error\n        break;\n      case ErrorCategory.SESSION:\n        jsonRpcCode = -32002; // Custom: Session error\n        break;\n      case ErrorCategory.TRANSPORT:\n        jsonRpcCode = -32003; // Custom: Transport error\n        break;\n      default:\n        jsonRpcCode = -32603; // Internal error\n    }\n    \n    return {\n      code: jsonRpcCode,\n      message: this.message,\n      data: {\n        mcp_code: this.code,\n        category: this.category,\n        severity: this.severity,\n        context: this.context\n      }\n    };\n  }\n  \n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'NETWORK_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.NETWORK,\n      options\n    );\n    this.name = 'NetworkError';\n  }\n}\n\n/**\n * 协议错误\n */\nexport class ProtocolError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'PROTOCOL_ERROR',\n      ErrorSeverity.CRITICAL,\n      ErrorCategory.PROTOCOL,\n      { ...options, recoverable: false }\n    );\n    this.name = 'ProtocolError';\n  }\n}\n\n/**\n * 工具执行错误\n */\nexport class ToolExecutionError extends MCPError {\n  constructor(\n    toolName: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Tool '${toolName}' execution failed: ${message}`,\n      'TOOL_EXECUTION_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.TOOL_EXECUTION,\n      { ...options, context: { ...options?.context, toolName } }\n    );\n    this.name = 'ToolExecutionError';\n  }\n}\n\n/**\n * 资源访问错误\n */\nexport class ResourceAccessError extends MCPError {\n  constructor(\n    resourceUri: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Resource '${resourceUri}' access failed: ${message}`,\n      'RESOURCE_ACCESS_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.RESOURCE_ACCESS,\n      { ...options, context: { ...options?.context, resourceUri } }\n    );\n    this.name = 'ResourceAccessError';\n  }\n}\n\n/**\n * 会话错误\n */\nexport class SessionError extends MCPError {\n  constructor(\n    sessionId: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Session '${sessionId}' error: ${message}`,\n      'SESSION_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.SESSION,\n      { ...options, context: { ...options?.context, sessionId } }\n    );\n    this.name = 'SessionError';\n  }\n}\n\n/**\n * 传输层错误\n */\nexport class TransportError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'TRANSPORT_ERROR',\n      ErrorSeverity.CRITICAL,\n      ErrorCategory.TRANSPORT,\n      options\n    );\n    this.name = 'TransportError';\n  }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'CONFIGURATION_ERROR',\n      ErrorSeverity.FATAL,\n      ErrorCategory.CONFIGURATION,\n      { ...options, recoverable: false }\n    );\n    this.name = 'ConfigurationError';\n  }\n}\n\n/**\n * 错误帮助函数\n */\nexport class ErrorHelper {\n  /**\n   * 判断错误是否可恢复\n   */\n  static isRecoverable(error: Error): boolean {\n    if (error instanceof MCPError) {\n      return error.recoverable;\n    }\n    \n    // 对于标准错误,根据类型判断\n    if (error.name === 'ECONNRESET' || error.name === 'ETIMEDOUT') {\n      return true;\n    }\n    \n    return false;\n  }\n  \n  /**\n   * 将普通错误包装为MCPError\n   */\n  static wrap(error: Error, category: ErrorCategory = ErrorCategory.INTERNAL): MCPError {\n    if (error instanceof MCPError) {\n      return error;\n    }\n    \n    return new MCPError(\n      error.message,\n      'WRAPPED_ERROR',\n      ErrorSeverity.WARNING,\n      category,\n      { cause: error }\n    );\n  }\n  \n  /**\n   * 创建错误上下文\n   */\n  static createContext(\n    method?: string,\n    params?: any,\n    sessionId?: string,\n    requestId?: string | number\n  ): any {\n    return {\n      method,\n      params,\n      sessionId,\n      requestId,\n      timestamp: Date.now()\n    };\n  }\n}","import { MCPError, ErrorSeverity, ErrorCategory } from '~/errors/MCPError.js';\nimport logger from '@promptx/logger';\n\n/**\n * 错误统计信息\n */\nexport interface ErrorStats {\n  /** 总错误数 */\n  totalErrors: number;\n  /** 按严重程度分类 */\n  bySeverity: Record<ErrorSeverity, number>;\n  /** 按类别分类 */\n  byCategory: Record<ErrorCategory, number>;\n  /** 按错误代码分类 */\n  byCode: Record<string, number>;\n  /** 最近错误 */\n  recentErrors: Array<{\n    timestamp: number;\n    code: string;\n    message: string;\n    severity: ErrorSeverity;\n    category: ErrorCategory;\n  }>;\n  /** 错误率(每分钟) */\n  errorRate: number;\n  /** 恢复成功率 */\n  recoveryRate: number;\n}\n\n/**\n * 错误收集器\n * \n * 收集、分析和报告错误信息\n */\nexport class ErrorCollector {\n  private errors: MCPError[] = [];\n  private maxErrors: number;\n  private windowSize: number; // 时间窗口(毫秒)\n  \n  // 错误阈值触发器\n  private thresholds: Map<string, { count: number; action: () => void }> = new Map();\n  \n  constructor(options: {\n    maxErrors?: number;\n    windowSize?: number;\n  } = {}) {\n    this.maxErrors = options.maxErrors || 1000;\n    this.windowSize = options.windowSize || 60000; // 默认1分钟\n    \n    // 定期清理旧错误\n    setInterval(() => this.cleanup(), this.windowSize);\n  }\n  \n  /**\n   * 收集错误\n   */\n  collect(error: Error): void {\n    const mcpError = error instanceof MCPError \n      ? error \n      : new MCPError(\n          error.message,\n          'UNKNOWN_ERROR',\n          ErrorSeverity.WARNING,\n          ErrorCategory.INTERNAL,\n          { cause: error }\n        );\n    \n    this.errors.push(mcpError);\n    \n    // 记录到日志\n    this.logError(mcpError);\n    \n    // 检查阈值\n    this.checkThresholds(mcpError);\n    \n    // 限制内存使用\n    if (this.errors.length > this.maxErrors) {\n      this.errors = this.errors.slice(-this.maxErrors);\n    }\n  }\n  \n  \n  /**\n   * 获取错误统计\n   */\n  getStats(): ErrorStats {\n    const now = Date.now();\n    const recentErrors = this.getRecentErrors();\n    \n    const stats: ErrorStats = {\n      totalErrors: recentErrors.length,\n      bySeverity: this.groupBySeverity(recentErrors),\n      byCategory: this.groupByCategory(recentErrors),\n      byCode: this.groupByCode(recentErrors),\n      recentErrors: recentErrors.slice(-10).map(e => ({\n        timestamp: e.timestamp,\n        code: e.code,\n        message: e.message,\n        severity: e.severity,\n        category: e.category\n      })),\n      errorRate: this.calculateErrorRate(recentErrors),\n    };\n    \n    return stats;\n  }\n  \n  /**\n   * 设置错误阈值触发器\n   */\n  setThreshold(\n    key: string,\n    count: number,\n    action: () => void\n  ): void {\n    this.thresholds.set(key, { count, action });\n  }\n  \n  /**\n   * 清除错误历史\n   */\n  clear(): void {\n    this.errors = [];\n  }\n  \n  /**\n   * 导出错误报告\n   */\n  exportReport(): string {\n    const stats = this.getStats();\n    const report = [\n      '=== Error Report ===',\n      `Time: ${new Date().toISOString()}`,\n      `Total Errors: ${stats.totalErrors}`,\n      `Error Rate: ${stats.errorRate.toFixed(2)} errors/min`,\n      `Recovery Rate: ${(stats.recoveryRate * 100).toFixed(2)}%`,\n      '',\n      '--- By Severity ---',\n      ...Object.entries(stats.bySeverity).map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- By Category ---',\n      ...Object.entries(stats.byCategory).map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- Top Error Codes ---',\n      ...Object.entries(stats.byCode)\n        .sort((a, b) => b[1] - a[1])\n        .slice(0, 5)\n        .map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- Recent Errors ---',\n      ...stats.recentErrors.map(e => \n        `[${new Date(e.timestamp).toISOString()}] ${e.severity} - ${e.code}: ${e.message}`\n      )\n    ];\n    \n    return report.join('\\n');\n  }\n  \n  // ============ 私有方法 ============\n  \n  private logError(error: MCPError): void {\n    const logMessage = `[ERROR_COLLECTED] ${error.code} - ${error.message}`;\n    const context = {\n      code: error.code,\n      severity: error.severity,\n      category: error.category,\n      recoverable: error.recoverable,\n      context: error.context\n    };\n    \n    switch (error.severity) {\n      case ErrorSeverity.WARNING:\n        logger.warn(logMessage, context);\n        break;\n      case ErrorSeverity.FATAL:\n        logger.error(`[FATAL] ${logMessage}`, context);\n        break;\n      default:\n        logger.error(logMessage, context);\n    }\n  }\n  \n  private checkThresholds(error: MCPError): void {\n    // 检查严重程度阈值\n    const severityKey = `severity:${error.severity}`;\n    const severityCount = this.getRecentErrors()\n      .filter(e => e.severity === error.severity).length;\n    \n    const severityThreshold = this.thresholds.get(severityKey);\n    if (severityThreshold && severityCount >= severityThreshold.count) {\n      logger.warn(`[THRESHOLD] ${severityKey} threshold reached: ${severityCount}`);\n      severityThreshold.action();\n    }\n    \n    // 检查类别阈值\n    const categoryKey = `category:${error.category}`;\n    const categoryCount = this.getRecentErrors()\n      .filter(e => e.category === error.category).length;\n    \n    const categoryThreshold = this.thresholds.get(categoryKey);\n    if (categoryThreshold && categoryCount >= categoryThreshold.count) {\n      logger.warn(`[THRESHOLD] ${categoryKey} threshold reached: ${categoryCount}`);\n      categoryThreshold.action();\n    }\n    \n    // 检查特定错误代码阈值\n    const codeKey = `code:${error.code}`;\n    const codeCount = this.getRecentErrors()\n      .filter(e => e.code === error.code).length;\n    \n    const codeThreshold = this.thresholds.get(codeKey);\n    if (codeThreshold && codeCount >= codeThreshold.count) {\n      logger.warn(`[THRESHOLD] ${codeKey} threshold reached: ${codeCount}`);\n      codeThreshold.action();\n    }\n  }\n  \n  private getRecentErrors(): MCPError[] {\n    const cutoff = Date.now() - this.windowSize;\n    return this.errors.filter(e => e.timestamp > cutoff);\n  }\n  \n  private cleanup(): void {\n    const before = this.errors.length;\n    this.errors = this.getRecentErrors();\n    const after = this.errors.length;\n    \n    if (before > after) {\n      logger.debug(`[ERROR_COLLECTOR] Cleaned up ${before - after} old errors`);\n    }\n  }\n  \n  private groupBySeverity(errors: MCPError[]): Record<ErrorSeverity, number> {\n    const result = {\n      [ErrorSeverity.WARNING]: 0,\n      [ErrorSeverity.CRITICAL]: 0,\n      [ErrorSeverity.FATAL]: 0\n    };\n    \n    for (const error of errors) {\n      result[error.severity]++;\n    }\n    \n    return result;\n  }\n  \n  private groupByCategory(errors: MCPError[]): Record<ErrorCategory, number> {\n    const result = {} as Record<ErrorCategory, number>;\n    \n    for (const category of Object.values(ErrorCategory)) {\n      result[category] = 0;\n    }\n    \n    for (const error of errors) {\n      result[error.category]++;\n    }\n    \n    return result;\n  }\n  \n  private groupByCode(errors: MCPError[]): Record<string, number> {\n    const result: Record<string, number> = {};\n    \n    for (const error of errors) {\n      result[error.code] = (result[error.code] || 0) + 1;\n    }\n    \n    return result;\n  }\n  \n  private calculateErrorRate(errors: MCPError[]): number {\n    if (errors.length === 0) return 0;\n    \n    // 计算每分钟错误率\n    const timeSpan = Math.min(\n      Date.now() - errors[0].timestamp,\n      this.windowSize\n    );\n    \n    const minutes = timeSpan / 60000;\n    return errors.length / Math.max(minutes, 1);\n  }\n}\n\n/**\n * 全局错误收集器实例\n */\nexport const globalErrorCollector = new ErrorCollector();","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\nimport { BaseMCPServer } from '~/servers/BaseMCPServer.js';\nimport type { MCPServerOptions } from '~/interfaces/MCPServer.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * 标准输入输出MCP服务器实现\n * \n * 通过stdin/stdout进行JSON-RPC通信\n * 适用于命令行工具和进程间通信\n * \n * 使用 MCP SDK 的 StdioServerTransport 处理所有协议细节\n */\nexport class StdioMCPServer extends BaseMCPServer {\n  private transport?: StdioServerTransport;\n  \n  constructor(options: MCPServerOptions) {\n    super(options);\n  }\n  \n  /**\n   * 连接标准输入输出传输层\n   */\n  protected async connectTransport(): Promise<void> {\n    this.logger.info('Connecting stdio transport...');\n    \n    // 创建stdio传输 - SDK会处理所有stdin/stdout通信\n    this.transport = new StdioServerTransport();\n    \n    // 连接到MCP服务器 - SDK会自动处理initialize等协议消息\n    await this.server.connect(this.transport);\n    \n    this.logger.info('Stdio transport connected');\n  }\n  \n  /**\n   * 断开标准输入输出传输层\n   */\n  protected async disconnectTransport(): Promise<void> {\n    this.logger.info('Disconnecting stdio transport...');\n    \n    // 关闭传输\n    if (this.transport) {\n      await this.transport.close();\n      this.transport = undefined;\n    }\n    \n    this.logger.info('Stdio transport disconnected');\n  }\n  \n  /**\n   * 读取资源内容\n   * 实现文件系统资源读取\n   */\n  protected async readResource(resource: Resource): Promise<any> {\n    try {\n      // 解析URI\n      const uri = new URL(resource.uri);\n      \n      if (uri.protocol === 'file:') {\n        // 读取文件\n        const filePath = uri.pathname;\n        \n        // 安全检查:确保文件路径在允许的范围内\n        const resolvedPath = path.resolve(filePath);\n        \n        // 读取文件内容\n        const content = await fs.readFile(resolvedPath, 'utf-8');\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else {\n        throw new Error(`Unsupported resource protocol: ${uri.protocol}`);\n      }\n    } catch (error: any) {\n      this.logger.error(`Failed to read resource: ${resource.uri}`, error);\n      throw new Error(`Failed to read resource: ${error.message}`);\n    }\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async start(options?: MCPServerOptions): Promise<void> {\n    await super.start(options);\n    \n    // 输出启动信息到stderr(不干扰stdout的JSON-RPC通信)\n    this.logger.info(`STDIO Server Ready`);\n    this.logger.info('Listening for JSON-RPC messages on stdin');\n  }\n}","import express, { Express, Request, Response } from 'express';\nimport { Server as HttpServer } from 'http';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { \n  InitializeRequestSchema,\n  LoggingMessageNotification,\n  JSONRPCNotification,\n  JSONRPCError,\n  Notification,\n  ListToolsRequestSchema,\n  CallToolRequestSchema,\n  ListResourcesRequestSchema,\n  ListPromptsRequestSchema,\n  GetPromptRequestSchema,\n  ReadResourceRequestSchema\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Resource, Tool, Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport { BaseMCPServer } from '~/servers/BaseMCPServer.js';\nimport type { MCPServerOptions, ToolWithHandler } from '~/interfaces/MCPServer.js';\nimport { WorkerpoolAdapter } from '~/workers/index.js';\nimport type { ToolWorkerPool } from '~/interfaces/ToolWorkerPool.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport packageJson from '../../package.json' assert { type: 'json' };\n\nconst SESSION_ID_HEADER_NAME = \"mcp-session-id\";\n\n/**\n * HTTP流式MCP服务器实现\n * \n * 使用 MCP SDK 的 StreamableHTTPServerTransport 处理所有协议细节\n * 支持HTTP JSON-RPC和SSE(Server-Sent Events)\n */\nexport class StreamableHttpMCPServer extends BaseMCPServer {\n  private app?: Express;\n  private httpServer?: HttpServer;\n  private port: number;\n  private host: string;\n  private corsEnabled: boolean;\n  private workerPool: ToolWorkerPool;\n  \n  // 支持多个并发连接 - 每个session独立的Server和Transport实例\n  private servers: Map<string, Server> = new Map();\n  private transports: Map<string, StreamableHTTPServerTransport> = new Map();\n  \n  constructor(options: MCPServerOptions & {\n    port?: number;\n    host?: string;\n    corsEnabled?: boolean;\n  }) {\n    super(options);\n    this.port = options.port || 8080;\n    this.host = options.host || '127.0.0.1';  // 使用 IPv4 避免 IPv6 问题\n    this.corsEnabled = options.corsEnabled || false;\n    \n    // 初始化 worker pool\n    this.workerPool = new WorkerpoolAdapter({\n      minWorkers: 2,\n      maxWorkers: 4,\n      workerTimeout: 30000\n    });\n  }\n  \n  /**\n   * 连接HTTP传输层\n   */\n  protected async connectTransport(): Promise<void> {\n    this.logger.info('Starting HTTP server...');\n    \n    // 初始化 worker pool\n    await this.workerPool.initialize();\n    this.logger.info('Worker pool initialized');\n    \n    // 创建Express应用\n    this.app = express();\n    \n    // 设置Express应用 - 完全仿照官方\n    this.setupExpress();\n    \n    // 启动HTTP服务器\n    await new Promise<void>((resolve, reject) => {\n      this.httpServer = this.app!.listen(this.port, this.host, () => {\n        this.logger.info(`HTTP server listening on http://${this.host}:${this.port}/mcp`);\n        resolve();\n      });\n      \n      this.httpServer.on('error', reject);\n    });\n  }\n  \n  /**\n   * 获取或创建session对应的Server实例\n   * \n   * 形式化规约:\n   * 前置条件:sessionId ≠ null ∧ sessionId ≠ \"\"\n   * 后置条件:返回的Server是sessionId唯一对应的\n   * 不变式:servers.get(sessionId) 存在 ⟺ transports.get(sessionId) 存在\n   */\n  private getOrCreateServer(sessionId: string): Server {\n    // 断言:sessionId必须有效\n    if (!sessionId) {\n      throw new Error('SessionId cannot be null or empty');\n    }\n    \n    // 如果已存在,直接返回\n    if (this.servers.has(sessionId)) {\n      return this.servers.get(sessionId)!;\n    }\n    \n    // 创建新的Server实例(注意:不监听端口)\n    const server = new Server(\n      {\n        name: this.options.name,\n        version: this.options.version\n      },\n      {\n        capabilities: {\n          tools: {},\n          resources: {},\n          prompts: {}\n        }\n      }\n    );\n    \n    // 为这个Server注册处理器(独立副本)\n    this.setupServerHandlers(server);\n    \n    // 保存Server实例\n    this.servers.set(sessionId, server);\n    this.logger.info(`Created new Server instance for session: ${sessionId}`);\n    \n    return server;\n  }\n  \n  /**\n   * 为Server实例设置请求处理器\n   * 注意:这些处理器是每个Server独立的\n   */\n  private setupServerHandlers(server: Server): void {\n    // 工具列表请求\n    server.setRequestHandler(ListToolsRequestSchema, async () => {\n      this.logger.debug('Handling list tools request');\n      return {\n        tools: Array.from(this.tools.values()).map(({ handler, ...tool }) => tool)\n      };\n    });\n    \n    // 工具调用请求\n    server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      this.logger.debug(`Handling tool call: ${request.params.name}`);\n      return this.executeTool(request.params.name, request.params.arguments);\n    });\n    \n    // 资源列表请求\n    server.setRequestHandler(ListResourcesRequestSchema, async () => {\n      this.logger.debug('Handling list resources request');\n      return {\n        resources: Array.from(this.resources.values())\n      };\n    });\n    \n    // 读取资源请求\n    server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n      this.logger.debug(`Handling read resource: ${request.params.uri}`);\n      const resource = this.resources.get(request.params.uri);\n      if (!resource) {\n        throw new Error(`Resource not found: ${request.params.uri}`);\n      }\n      return this.readResource(resource);\n    });\n    \n    // 提示词列表请求\n    server.setRequestHandler(ListPromptsRequestSchema, async () => {\n      this.logger.debug('Handling list prompts request');\n      return {\n        prompts: Array.from(this.prompts.values())\n      };\n    });\n    \n    // 获取提示词请求\n    server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n      this.logger.debug(`Handling get prompt: ${request.params.name}`);\n      const prompt = this.prompts.get(request.params.name);\n      if (!prompt) {\n        throw new Error(`Prompt not found: ${request.params.name}`);\n      }\n      return { prompt };\n    });\n  }\n  \n  /**\n   * 设置中间件和路由 - 完全仿照官方实现\n   */\n  private setupExpress(): void {\n    if (!this.app) return;\n    \n    // 仿照官方:只有基础的 JSON 解析\n    this.app.use(express.json());\n    \n    // 仿照官方:使用 Router\n    const router = express.Router();\n    \n    // 健康检查端点 - 在其他路由之前定义\n    router.get('/health', (req, res) => {\n      this.handleHealthCheck(req, res);\n    });\n    \n    // 仿照官方:路由定义\n    router.post('/mcp', async (req, res) => {\n      await this.handlePostRequest(req, res);\n    });\n    \n    router.get('/mcp', async (req, res) => {\n      await this.handleGetRequest(req, res);\n    });\n    \n    // 仿照官方:挂载路由\n    this.app.use('/', router);\n  }\n  \n  /**\n   * 处理健康检查请求\n   * \n   * 形式化保证:\n   * - 无副作用(幂等性)\n   * - O(1)时间复杂度\n   * - 始终返回有效JSON\n   */\n  private handleHealthCheck(req: Request, res: Response): void {\n    const healthStatus = {\n      status: 'ok',\n      timestamp: new Date().toISOString(),\n      service: 'mcp-server',\n      uptime: process.uptime(),\n      version: this.getVersion(),\n      transport: 'http',\n      sessions: this.servers.size,  // 显示当前活跃的session数量\n      servers: this.servers.size,   // 独立Server实例数量\n      transports: this.transports.size  // Transport实例数量\n    };\n    \n    res.status(200).json(healthStatus);\n  }\n  \n  /**\n   * 获取服务版本信息\n   */\n  private getVersion(): string {\n    return packageJson.version || 'unknown';\n  }\n  \n  /**\n   * 处理 GET 请求(SSE)\n   * 使用独立的Server实例处理SSE连接\n   */\n  private async handleGetRequest(req: Request, res: Response): Promise<void> {\n    const sessionId = req.headers[SESSION_ID_HEADER_NAME] as string | undefined;\n    \n    if (!sessionId) {\n      res.status(400).json(\n        this.createErrorResponse('Bad Request: session ID required for SSE.')\n      );\n      return;\n    }\n    \n    // 确保session存在(获取或创建Server和Transport)\n    if (!this.transports.has(sessionId)) {\n      this.logger.info(`Session ${sessionId} not found for SSE, creating...`);\n      \n      // 获取或创建Server\n      const server = this.getOrCreateServer(sessionId);\n      \n      // 创建Transport\n      const transport = new StreamableHTTPServerTransport({\n        sessionIdGenerator: () => sessionId\n      });\n      \n      // 连接\n      await server.connect(transport);\n      this.transports.set(sessionId, transport);\n    }\n    \n    this.logger.info(`Establishing SSE stream for session ${sessionId}`);\n    \n    // 设置 SSE 必需的响应头\n    res.setHeader('Content-Type', 'text/event-stream');\n    res.setHeader('Cache-Control', 'no-cache');\n    res.setHeader('Connection', 'keep-alive');\n    res.setHeader('X-Accel-Buffering', 'no'); // 禁用 Nginx 缓冲\n    \n    // 启动心跳机制 - 每 20 秒发送一次\n    const heartbeatInterval = setInterval(() => {\n      try {\n        // SSE 心跳格式:注释行\n        res.write(':heartbeat\\n\\n');\n        this.logger.info(`Sent SSE heartbeat for session ${sessionId}`);\n      } catch (error) {\n        this.logger.error(`Failed to send heartbeat for session ${sessionId}: ${error}`);\n        clearInterval(heartbeatInterval);\n      }\n    }, 20000); // 20 秒间隔\n    \n    // 监听连接关闭事件\n    req.on('close', () => {\n      this.logger.info(`SSE connection closed for session ${sessionId}`);\n      clearInterval(heartbeatInterval);\n      // 注意:暂时不清理session,因为客户端可能重连\n    });\n    \n    const transport = this.transports.get(sessionId)!;\n    await transport.handleRequest(req, res);\n    await this.streamMessages(transport);\n    \n    return;\n  }\n  \n  /**\n   * 发送 SSE 流消息 - 完全复制官方实现\n   */\n  private async streamMessages(transport: StreamableHTTPServerTransport): Promise<void> {\n    try {\n      // 基于 LoggingMessageNotificationSchema 触发客户端的 setNotificationHandler\n      const message = {\n        method: 'notifications/message',\n        params: { level: 'info', data: 'SSE Connection established' }\n      };\n      \n      this.sendNotification(transport, message);\n      \n      let messageCount = 0;\n      \n      const interval = setInterval(async () => {\n        messageCount++;\n        \n        const data = `Message ${messageCount} at ${new Date().toISOString()}`;\n        \n        const message = {\n          method: 'notifications/message',\n          params: { level: 'info', data: data }\n        };\n        \n        try {\n          this.sendNotification(transport, message);\n          \n          if (messageCount === 2) {\n            clearInterval(interval);\n            \n            const message = {\n              method: 'notifications/message',\n              params: { level: 'info', data: 'Streaming complete!' }\n            };\n            \n            this.sendNotification(transport, message);\n          }\n        } catch (error) {\n          this.logger.error(`Error sending message: ${error}`);\n          clearInterval(interval);\n        }\n      }, 1000);\n    } catch (error) {\n      this.logger.error(`Error sending message: ${error}`);\n    }\n  }\n  \n  /**\n   * 发送通知 - 完全复制官方实现\n   */\n  private async sendNotification(\n    transport: StreamableHTTPServerTransport,\n    notification: any\n  ): Promise<void> {\n    const rpcNotification = {\n      ...notification,\n      jsonrpc: '2.0'\n    };\n    await transport.send(rpcNotification);\n  }\n  \n  /**\n   * 处理 POST 请求(JSON-RPC)\n   * 使用独立的Server实例处理每个session\n   */\n  private async handlePostRequest(req: Request, res: Response): Promise<void> {\n    const sessionId = req.headers[SESSION_ID_HEADER_NAME] as string | undefined;\n    \n    this.logger.info('=== POST Request ===');\n    this.logger.info(`Headers: ${JSON.stringify(req.headers, null, 2)}`);\n    this.logger.info(`Body: ${JSON.stringify(req.body, null, 2)}`);\n    this.logger.info(`Session ID: ${sessionId}`);\n    \n    try {\n      // 处理已有session的请求\n      if (sessionId && this.transports.has(sessionId)) {\n        this.logger.info(`Reusing existing Server and Transport for session: ${sessionId}`);\n        const transport = this.transports.get(sessionId)!;\n        await transport.handleRequest(req, res, req.body);\n        return;\n      }\n      \n      // 处理initialize请求(创建新session)\n      if (!sessionId && this.isInitializeRequest(req.body)) {\n        this.logger.info('Creating new session for initialize request');\n        \n        // 生成新的session ID\n        const newSessionId = randomUUID();\n        \n        // 获取或创建该session的Server\n        const server = this.getOrCreateServer(newSessionId);\n        \n        // 创建新的Transport\n        const transport = new StreamableHTTPServerTransport({\n          sessionIdGenerator: () => newSessionId\n        });\n        \n        // 连接Server和Transport\n        await server.connect(transport);\n        \n        // 保存Transport(Server已在getOrCreateServer中保存)\n        this.transports.set(newSessionId, transport);\n        \n        // 处理请求\n        await transport.handleRequest(req, res, req.body);\n        \n        this.logger.info(`New session created: ${newSessionId}`);\n        return;\n      }\n      \n      // 处理带session ID但Transport不存在的情况(可能是服务器重启)\n      if (sessionId && !this.transports.has(sessionId)) {\n        this.logger.info(`Session ${sessionId} not found, recreating...`);\n        \n        // 获取或创建Server\n        const server = this.getOrCreateServer(sessionId);\n        \n        // 创建新的Transport\n        const transport = new StreamableHTTPServerTransport({\n          sessionIdGenerator: () => sessionId\n        });\n        \n        // 连接\n        await server.connect(transport);\n        this.transports.set(sessionId, transport);\n        \n        // 处理请求\n        await transport.handleRequest(req, res, req.body);\n        return;\n      }\n      \n      // 无效请求\n      this.logger.info('Invalid request - no session ID and not initialize request');\n      this.logger.info(`isInitializeRequest result: ${this.isInitializeRequest(req.body)}`);\n      res.status(400).json({\n        jsonrpc: '2.0',\n        error: {\n          code: -32000,\n          message: 'Bad Request: invalid session ID or method.'\n        },\n        id: randomUUID()\n      });\n      \n    } catch (error) {\n      this.logger.error(`Error handling MCP request: ${error}`);\n      res.status(500).json({\n        jsonrpc: '2.0',\n        error: {\n          code: -32603,\n          message: 'Internal server error.'\n        },\n        id: randomUUID()\n      });\n    }\n  }\n  \n  /**\n   * 检查是否是 initialize 请求 - 完全复制官方实现\n   */\n  private isInitializeRequest(body: any): boolean {\n    const isInitial = (data: any) => {\n      const result = InitializeRequestSchema.safeParse(data);\n      return result.success;\n    };\n    if (Array.isArray(body)) {\n      return body.some((request) => isInitial(request));\n    }\n    return isInitial(body);\n  }\n  \n  /**\n   * 创建错误响应 - 完全复制官方实现\n   */\n  private createErrorResponse(message: string): any {\n    return {\n      jsonrpc: '2.0',\n      error: {\n        code: -32000,\n        message: message\n      },\n      id: randomUUID()\n    };\n  }\n  \n  /**\n   * 断开HTTP传输层\n   */\n  protected async disconnectTransport(): Promise<void> {\n    this.logger.info('Stopping HTTP server...');\n    \n    // 关闭所有 transports 和 servers\n    for (const [sessionId, transport] of this.transports.entries()) {\n      this.logger.info(`Closing transport for session: ${sessionId}`);\n      await transport.close();\n    }\n    \n    // 清理所有servers(不需要显式关闭,因为它们不监听端口)\n    this.servers.clear();\n    this.transports.clear();\n    \n    // 关闭HTTP服务器\n    if (this.httpServer) {\n      await new Promise<void>((resolve) => {\n        this.httpServer!.close(() => {\n          this.logger.info('HTTP server stopped');\n          resolve();\n        });\n      });\n      \n      this.httpServer = undefined;\n    }\n    \n    // 终止 worker pool\n    await this.workerPool.terminate();\n    this.logger.info('Worker pool terminated');\n    \n    this.app = undefined;\n  }\n  \n  /**\n   * 清理特定session的资源\n   * 可以在session超时或客户端断开时调用\n   */\n  private async cleanupSession(sessionId: string): Promise<void> {\n    this.logger.info(`Cleaning up session: ${sessionId}`);\n    \n    // 关闭Transport\n    const transport = this.transports.get(sessionId);\n    if (transport) {\n      await transport.close();\n      this.transports.delete(sessionId);\n    }\n    \n    // 移除Server(垃圾回收会处理)\n    this.servers.delete(sessionId);\n    \n    this.logger.info(`Session cleaned up: ${sessionId}`);\n  }\n  \n  /**\n   * 读取资源内容\n   */\n  protected async readResource(resource: Resource): Promise<any> {\n    try {\n      const uri = new URL(resource.uri);\n      \n      if (uri.protocol === 'file:') {\n        const filePath = uri.pathname;\n        const resolvedPath = path.resolve(filePath);\n        const content = await fs.readFile(resolvedPath, 'utf-8');\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else if (uri.protocol === 'http:' || uri.protocol === 'https:') {\n        // 支持HTTP资源\n        const response = await fetch(resource.uri);\n        const content = await response.text();\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || response.headers.get('content-type') || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else {\n        throw new Error(`Unsupported resource protocol: ${uri.protocol}`);\n      }\n    } catch (error: any) {\n      this.logger.error(`Failed to read resource: ${resource.uri} - ${error}`);\n      throw new Error(`Failed to read resource: ${error.message}`);\n    }\n  }\n  \n  /**\n   * 重写 executeTool 方法,使用 WorkerPool 执行所有工具\n   */\n  async executeTool(name: string, args: any): Promise<any> {\n    if (!this.isRunning()) {\n      this.logger.warn(`Attempted to execute tool '${name}' while server is not running`);\n      throw new Error('Server is not running');\n    }\n    \n    const tool = this.tools.get(name);\n    if (!tool) {\n      this.logger.error(`Tool not found: ${name}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`);\n      throw new Error(`Tool not found: ${name}`);\n    }\n    \n    const startTime = Date.now();\n    \n    this.logger.info(`[TOOL_EXEC_START] Tool: ${name} (via WorkerPool)`);\n    this.logger.debug(`[TOOL_ARGS] ${name}: ${JSON.stringify(args)}`);\n    \n    try {\n      // 所有工具都通过 WorkerPool 执行\n      const result = await this.workerPool.execute(tool, args);\n      \n      const responseTime = Date.now() - startTime;\n      this.logger.info(`[TOOL_EXEC_SUCCESS] Tool: ${name}, Time: ${responseTime}ms`);\n      \n      // 更新指标\n      this.metrics.requestCount++;\n      this.metrics.avgResponseTime = \n        (this.metrics.avgResponseTime * (this.metrics.requestCount - 1) + responseTime) / \n        this.metrics.requestCount;\n      \n      return result;\n      \n    } catch (error: any) {\n      const responseTime = Date.now() - startTime;\n      this.logger.error(`[TOOL_EXEC_ERROR] Tool: ${name}, Time: ${responseTime}ms, Error: ${error.message}`);\n      \n      // 更新错误计数\n      this.metrics.errorCount++;\n      this.lastError = error;\n      \n      // 重新抛出错误\n      throw error;\n    }\n  }\n}","import * as workerpool from 'workerpool';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { \n  ToolWorkerPool, \n  PoolStats, \n  ToolWorkerPoolOptions \n} from '../interfaces/ToolWorkerPool';\nimport { ToolWithHandler } from '../interfaces/MCPServer';\nimport logger from '@promptx/logger';\n\n/**\n * 基于 workerpool 的 ToolWorkerPool 实现\n */\nexport class WorkerpoolAdapter implements ToolWorkerPool {\n  private pool: workerpool.Pool | null = null;\n  private options: Required<ToolWorkerPoolOptions>;\n  \n  constructor(options: ToolWorkerPoolOptions = {}) {\n    this.options = {\n      minWorkers: options.minWorkers ?? 2,\n      maxWorkers: options.maxWorkers ?? 4,\n      workerTimeout: options.workerTimeout ?? 30000,\n    };\n  }\n  \n  /**\n   * 初始化 worker pool\n   */\n  async initialize(): Promise<void> {\n    if (this.pool) {\n      logger.warn('WorkerpoolAdapter: Pool already initialized');\n      return;\n    }\n    \n    // tsup 会把 worker.ts 编译到 dist/worker.js\n    // WorkerpoolAdapter 会在某个 chunk 文件中,所以用相对路径找 worker.js\n    const workerPath = fileURLToPath(new URL('./worker.js', import.meta.url));\n    \n    this.pool = workerpool.pool(workerPath, {\n      minWorkers: this.options.minWorkers,\n      maxWorkers: this.options.maxWorkers,\n      workerType: 'process', // 使用进程而非线程\n      workerTerminateTimeout: 5000,\n      forkOpts: {\n        env: process.env,\n        cwd: process.cwd(),\n      }\n    });\n    \n    logger.info(`WorkerpoolAdapter initialized: ${this.options.minWorkers}-${this.options.maxWorkers} workers`);\n  }\n  \n  /**\n   * 执行工具\n   */\n  async execute<T = any>(tool: ToolWithHandler, args: any): Promise<T> {\n    if (!this.pool) {\n      throw new Error('WorkerpoolAdapter: Pool not initialized. Call initialize() first.');\n    }\n    \n    try {\n      logger.debug(`Executing tool '${tool.name}' in worker pool`);\n      \n      // 准备执行数据(只传递工具名和参数)\n      const taskData = {\n        toolName: tool.name,\n        args\n      };\n      \n      // 在 worker 中执行\n      const result = await this.pool.exec('executeTool', [taskData]);\n      \n      logger.debug(`Tool '${tool.name}' execution completed`);\n      return result as T;\n      \n    } catch (error: any) {\n      logger.error(`Tool '${tool.name}' execution failed: ${error.message}`);\n      \n      // 处理超时错误\n      if (error.message?.includes('timeout')) {\n        throw new Error(`Tool '${tool.name}' execution timeout after ${this.options.workerTimeout}ms`);\n      }\n      \n      // 重新抛出其他错误\n      throw error;\n    }\n  }\n  \n  /**\n   * 获取 pool 状态\n   */\n  getStats(): PoolStats {\n    if (!this.pool) {\n      return {\n        active: 0,\n        pending: 0,\n        available: 0,\n        total: 0\n      };\n    }\n    \n    const stats = this.pool.stats();\n    return {\n      active: stats.activeTasks,\n      pending: stats.pendingTasks,\n      available: stats.idleWorkers,\n      total: stats.totalWorkers\n    };\n  }\n  \n  /**\n   * 终止 pool\n   */\n  async terminate(): Promise<void> {\n    if (!this.pool) {\n      logger.warn('WorkerpoolAdapter: No pool to terminate');\n      return;\n    }\n    \n    logger.info('Terminating worker pool...');\n    await this.pool.terminate();\n    this.pool = null;\n    logger.info('Worker pool terminated');\n  }\n  \n  /**\n   * 判断工具是否需要使用 worker pool\n   */\n  static shouldUsePool(toolName: string): boolean {\n    // 需要隔离执行的工具列表\n    const isolatedTools = [\n      'toolx',           // 主要目标\n      'build',           // 构建任务\n      'test',            // 测试任务\n      'compile',         // 编译任务\n      'heavy-compute'    // 计算密集型任务\n    ];\n    \n    return isolatedTools.includes(toolName);\n  }\n}","/**\n * PromptXMCPServer - PromptX 专用的 MCP 服务器\n * \n * 集成了所有 PromptX 工具,提供统一的启动接口\n * 支持 stdio 和 http 两种传输模式\n */\n\nimport { StdioMCPServer } from './StdioMCPServer.js';\nimport { StreamableHttpMCPServer } from './StreamableHttpMCPServer.js';\nimport { allTools } from '../tools/index.js';\nimport type { MCPServer } from '../interfaces/MCPServer.js';\nimport logger from '@promptx/logger';\n\nexport interface PromptXServerOptions {\n  // 基础选项\n  transport: 'stdio' | 'http';\n  name?: string;\n  version?: string;\n  \n  // HTTP 特定选项\n  port?: number;\n  host?: string;\n  corsEnabled?: boolean;\n  cors?: boolean; // 别名兼容\n  \n  // PromptX 特定选项\n  workingDirectory?: string;  // 工作目录\n  ideType?: string;           // IDE 类型(cursor, vscode, claude 等)\n  debug?: boolean;            // 调试模式\n}\n\nexport class PromptXMCPServer {\n  private server: MCPServer;\n  private options: PromptXServerOptions;\n  \n  constructor(options: PromptXServerOptions) {\n    this.options = options;\n    \n    // 处理别名\n    if (options.cors !== undefined && options.corsEnabled === undefined) {\n      options.corsEnabled = options.cors;\n    }\n    \n    // 根据 transport 创建对应的服务器\n    if (options.transport === 'stdio') {\n      this.server = new StdioMCPServer({\n        name: options.name || 'promptx-mcp-server',\n        version: options.version || process.env.npm_package_version || '1.0.0'\n      });\n    } else {\n      this.server = new StreamableHttpMCPServer({\n        name: options.name || 'promptx-mcp-server',\n        version: options.version || process.env.npm_package_version || '1.0.0',\n        port: options.port || 5203,\n        host: options.host || 'localhost',\n        corsEnabled: options.corsEnabled || false\n      });\n    }\n    \n    // 自动注册 PromptX 工具\n    this.registerTools();\n  }\n  \n  /**\n   * 注册所有 PromptX 工具\n   */\n  private registerTools(): void {\n    // 注册标准工具集\n    allTools.forEach(tool => {\n      this.server.registerTool(tool);\n      logger.debug(`Registered tool: ${tool.name}`);\n    });\n    \n    logger.info(`Registered ${allTools.length} PromptX tools`);\n    \n    // 未来可以在这里加载:\n    // 1. 项目特定工具(基于 workingDirectory)\n    // 2. IDE 特定工具(基于 ideType)\n    // 3. 用户自定义工具\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async start(): Promise<void> {\n    await this.server.start();\n  }\n  \n  /**\n   * 停止服务器\n   */\n  async stop(): Promise<void> {\n    await this.server.stop();\n  }\n  \n  /**\n   * 优雅关闭\n   */\n  async gracefulShutdown(timeoutMs?: number): Promise<void> {\n    await this.server.gracefulShutdown(timeoutMs || 5000);\n  }\n  \n  /**\n   * 获取内部服务器实例(用于高级操作)\n   */\n  getServer(): MCPServer {\n    return this.server;\n  }\n  \n  // ========== 静态方法 ==========\n  \n  /**\n   * 统一启动方法(向后兼容 MCPServerManager.launch)\n   * \n   * 这个方法会:\n   * 1. 创建并启动服务器\n   * 2. 设置信号处理\n   * 3. 保持进程存活(stdio 模式)\n   */\n  static async launch(options: PromptXServerOptions): Promise<PromptXMCPServer> {\n    // 设置环境变量,通知 logger 当前的传输模式\n    process.env.MCP_TRANSPORT = options.transport;\n\n    // MCP STDIO模式最佳实践:劫持console防止stdout污染\n    if (options.transport === 'stdio') {\n      // 将所有console输出重定向到stderr,遵循MCP官方最佳实践\n      // 参考:https://modelcontextprotocol.io/quickstart/server\n      const originalLog = console.log;\n      console.log = console.error;  // 重定向到stderr\n      console.info = console.error;\n      console.debug = console.error;\n      console.warn = console.error;\n      // 保留原始方法以备需要\n      (console as any)._originalLog = originalLog;\n    }\n\n    const server = new PromptXMCPServer(options);\n\n    // 设置信号处理\n    const shutdown = async (signal: string) => {\n      logger.info(`\\nReceived ${signal}, shutting down gracefully...`);\n      try {\n        await server.gracefulShutdown(5000);\n        logger.info('Server stopped cleanly');\n        process.exit(0);\n      } catch (error) {\n        logger.error('Error during shutdown:', error);\n        process.exit(1);\n      }\n    };\n    \n    process.on('SIGINT', () => shutdown('SIGINT'));\n    process.on('SIGTERM', () => shutdown('SIGTERM'));\n    \n    // 启动服务器\n    await server.start();\n    \n    // 显示启动信息\n    if (options.transport === 'http') {\n      const port = options.port || 5203;\n      const host = options.host || '127.0.0.1';\n      logger.info(`HTTP Server Ready at http://${host}:${port}`);\n      logger.info('Use MCP-Session-Id header for session management');\n    } else {\n      logger.info('STDIO Server Ready');\n      logger.info('Listening for JSON-RPC messages on stdin');\n    }\n    \n    // 保持进程存活(对于 stdio 模式,防止进程退出)\n    if (options.transport === 'stdio') {\n      await new Promise(() => {}); // 永远等待\n    }\n    \n    return server;\n  }\n}\n\n// 导出向后兼容的别名\nexport { PromptXMCPServer as MCPServerManager };\nexport default PromptXMCPServer;"],"mappings":"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","names":["logger","ErrorCategory","logger","resolve","Server","ListToolsRequestSchema","CallToolRequestSchema","ListResourcesRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","ReadResourceRequestSchema","logger","fs","path","resolve","Server","ListToolsRequestSchema","CallToolRequestSchema","ListResourcesRequestSchema","ReadResourceRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","transport","message","logger"]}
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    1361:    */
    1362:   static async launch(options) {
>>> 1363:     process.env.MCP_TRANSPORT = options.transport;
    1364:     if (options.transport === "stdio") {
    1365:       const originalLog = console.log;
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    1309:       this.server = new StreamableHttpMCPServer({
    1310:         name: options.name || "promptx-mcp-server",
>>> 1311:         version: options.version || process.env.npm_package_version || "1.0.0",
    1312:         port: options.port || 5203,
    1313:         host: options.host || "localhost",
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    1304:       this.server = new StdioMCPServer({
    1305:         name: options.name || "promptx-mcp-server",
>>> 1306:         version: options.version || process.env.npm_package_version || "1.0.0"
    1307:       });
    1308:     } else {
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    757:       workerTerminateTimeout: 5e3,
    758:       forkOpts: {
>>> 759:         env: process.env,
    760:         cwd: process.cwd()
    761:       }
Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��?���z�?>�&��������

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highSC-003Suspicious CommandsMedium ConfidenceLine 0

Dynamic code execution via exec()

Detected by automated pattern matching (rule SC-003) with medium confidence. May be a false positive.

>>> 1: {"version":3,"sources":["../src/servers/BaseMCPServer.ts","../src/errors/MCPError.ts","../src/errors/ErrorCollector.ts","../src/servers/StdioMCPServer.ts","../src/servers/StreamableHttpMCPServer.ts","../src/workers/WorkerpoolAdapter.ts","../src/servers/PromptXMCPServer.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { Tool, Resource, Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport {\n  ListToolsRequestSchema,\n  CallToolRequestSchema,\n  ListResourcesRequestSchema,\n  ListPromptsRequestSchema,\n  GetPromptRequestSchema,\n  ReadResourceRequestSchema\n} from '@modelcontextprotocol/sdk/types.js';\nimport logger, { type Logger } from '@promptx/logger';\nimport type {\n  MCPServer,\n  MCPServerOptions,\n  ServerState,\n  ToolHandler,\n  ToolWithHandler,\n  HealthCheckResult,\n  ServerMetrics,\n  SessionContext\n} from '~/interfaces/MCPServer.js';\nimport { \n  MCPError, \n  ToolExecutionError, \n  ResourceAccessError,\n  ErrorHelper,\n  ErrorSeverity \n} from '~/errors/MCPError.js';\nimport { globalErrorCollector } from '~/errors/ErrorCollector.js';\n\n/**\n * 基础MCP服务器实现\n * \n * 设计模式:Template Method Pattern\n * 子类需要实现特定的传输层逻辑\n * \n * 不变式:\n * 1. 状态转换必须原子性\n * 2. 资源注册必须幂等\n * 3. 错误不能破坏内部状态\n */\nexport abstract class BaseMCPServer implements MCPServer {\n  protected server: Server;\n  protected logger: Logger;\n  protected state: ServerState = 'IDLE';\n  protected options: MCPServerOptions;\n  \n  // 资源存储\n  protected tools = new Map<string, ToolWithHandler>();\n  protected resources = new Map<string, Resource>();\n  protected prompts = new Map<string, Prompt>();\n  protected sessions = new Map<string, SessionContext>();\n  \n  // 并发控制\n  protected activeRequests = 0;\n  protected readonly requestLocks = new Map<string, Promise<any>>();\n  \n  // 指标收集\n  protected metrics: ServerMetrics = {\n    requestCount: 0,\n    errorCount: 0,\n    avgResponseTime: 0,\n    activeConnections: 0,\n    memoryUsage: process.memoryUsage(),\n    startTime: 0,\n    uptime: 0\n  };\n  \n  // 最后错误(用于诊断)\n  protected lastError?: Error;\n  \n  constructor(options: MCPServerOptions) {\n    this.options = options;\n    this.logger = options.logger || logger;\n    \n    // 设置错误阈值\n    this.setupErrorThresholds();\n    \n    // 初始化MCP SDK服务器\n    this.server = new Server(\n      {\n        name: options.name,\n        version: options.version\n      },\n      {\n        capabilities: this.buildCapabilities()\n      }\n    );\n    \n    this.setupHandlers();\n  }\n  \n  /**\n   * 设置错误阈值\n   */\n  protected setupErrorThresholds(): void {\n    // 严重错误超过5个时触发告警\n    globalErrorCollector.setThreshold('severity:critical', 5, () => {\n      this.logger.error('[ALERT] Critical error threshold reached!');\n      // 可以在这里发送告警通知\n    });\n    \n    // 致命错误立即触发\n    globalErrorCollector.setThreshold('severity:fatal', 1, () => {\n      this.logger.error('[ALERT] Fatal error occurred! Server may need restart.');\n      this.setState('FATAL_ERROR');\n    });\n    \n    // 工具执行错误过多时告警\n    globalErrorCollector.setThreshold('category:tool_execution', 10, () => {\n      this.logger.warn('[ALERT] Too many tool execution errors');\n    });\n  }\n  \n  /**\n   * 构建服务器能力声明\n   */\n  protected buildCapabilities() {\n    return {\n      tools: {},  // 始终声明支持工具\n      resources: {},  // 始终声明支持资源\n      prompts: {}  // 始终声明支持提示词\n    };\n  }\n  \n  /**\n   * 设置请求处理器\n   */\n  protected setupHandlers(): void {\n    // 工具列表请求\n    this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n      this.logger.debug('Handling list tools request');\n      return {\n        tools: Array.from(this.tools.values()).map(({ handler, ...tool }) => tool)\n      };\n    });\n    \n    // 工具调用请求\n    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      this.logger.debug(`Handling tool call: ${request.params.name}`);\n      return this.executeTool(request.params.name, request.params.arguments);\n    });\n    \n    // 资源列表请求\n    this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n      this.logger.debug('Handling list resources request');\n      return {\n        resources: Array.from(this.resources.values())\n      };\n    });\n    \n    // 读取资源请求\n    this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n      this.logger.debug(`Handling read resource: ${request.params.uri}`);\n      const resource = this.resources.get(request.params.uri);\n      if (!resource) {\n        throw new Error(`Resource not found: ${request.params.uri}`);\n      }\n      // 子类需要实现实际的资源读取逻辑\n      return this.readResource(resource);\n    });\n    \n    // 提示词列表请求\n    this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n      this.logger.debug('Handling list prompts request');\n      return {\n        prompts: Array.from(this.prompts.values())\n      };\n    });\n    \n    // 获取提示词请求\n    this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n      this.logger.debug(`Handling get prompt: ${request.params.name}`);\n      const prompt = this.prompts.get(request.params.name);\n      if (!prompt) {\n        throw new Error(`Prompt not found: ${request.params.name}`);\n      }\n      return { prompt };\n    });\n  }\n  \n  /**\n   * 子类需要实现的资源读取方法\n   */\n  protected abstract readResource(resource: Resource): Promise<any>;\n  \n  /**\n   * 子类需要实现的传输层连接方法\n   */\n  protected abstract connectTransport(): Promise<void>;\n  \n  /**\n   * 子类需要实现的传输层断开方法\n   */\n  protected abstract disconnectTransport(): Promise<void>;\n  \n  // ============ 生命周期管理 ============\n  \n  async start(options?: MCPServerOptions): Promise<void> {\n    if (this.state === 'RUNNING' || this.state === 'STARTING') {\n      throw new Error('Server is already running or starting');\n    }\n    \n    this.setState('STARTING');\n    this.logger.info('Starting MCP server...');\n    \n    try {\n      // 合并选项\n      if (options) {\n        this.options = { ...this.options, ...options };\n      }\n      \n      // 连接传输层\n      await this.connectTransport();\n      \n      // 记录启动时间\n      this.metrics.startTime = Date.now();\n      \n      this.setState('RUNNING');\n      this.logger.info('MCP server started successfully');\n    } catch (error) {\n      this.setState('ERROR');\n      this.lastError = error as Error;\n      this.logger.error('Failed to start server', error);\n      throw error;\n    }\n  }\n  \n  async stop(): Promise<void> {\n    if (this.state !== 'RUNNING') {\n      throw new Error(`Invalid state transition: cannot stop from ${this.state}`);\n    }\n    \n    this.setState('STOPPING');\n    this.logger.info('Stopping MCP server...');\n    \n    try {\n      // 等待所有活跃请求完成\n      await this.waitForActiveRequests();\n      \n      // 断开传输层\n      await this.disconnectTransport();\n      \n      // 清理会话\n      this.sessions.clear();\n      \n      this.setState('STOPPED');\n      this.logger.info('MCP server stopped');\n    } catch (error) {\n      this.setState('ERROR');\n      this.lastError = error as Error;\n      this.logger.error('Error stopping server', error);\n      throw error;\n    }\n  }\n  \n  async gracefulShutdown(timeoutMs: number): Promise<void> {\n    this.logger.info(`Graceful shutdown initiated with ${timeoutMs}ms timeout`);\n    \n    const shutdownPromise = this.stop();\n    const timeoutPromise = new Promise<void>((_, reject) => {\n      setTimeout(() => reject(new Error('Shutdown timeout')), timeoutMs);\n    });\n    \n    try {\n      await Promise.race([shutdownPromise, timeoutPromise]);\n    } catch (error) {\n      if ((error as Error).message === 'Shutdown timeout') {\n        this.logger.warn('Graceful shutdown timeout, forcing stop');\n        this.setState('STOPPED');\n      } else {\n        throw error;\n      }\n    }\n  }\n  \n  // 删除recover方法 - 错误就是错误,不要自动恢复\n  \n  isRunning(): boolean {\n    return this.state === 'RUNNING';\n  }\n  \n  getState(): ServerState {\n    return this.state;\n  }\n  \n  protected setState(newState: ServerState): void {\n    const oldState = this.state;\n    this.state = newState;\n    this.logger.info(`[STATE_CHANGE] ${oldState} -> ${newState}`);\n    \n    // 发出状态变化事件(如果有监听器)\n    if (oldState !== newState) {\n      this.logger.debug(`[STATE_DETAILS] Previous: ${oldState}, Current: ${newState}, Running: ${this.isRunning()}`);\n    }\n  }\n  \n  // ============ 工具管理 ============\n  \n  registerTool(tool: ToolWithHandler): void {\n    if (this.tools.has(tool.name)) {\n      throw new Error(`Tool ${tool.name} already registered`);\n    }\n    \n    this.tools.set(tool.name, tool);\n    this.logger.info(`Tool registered: ${tool.name}`);\n  }\n  \n  unregisterTool(name: string): void {\n    if (!this.tools.has(name)) {\n      this.logger.warn(`Tool ${name} not found for unregistration`);\n      return;\n    }\n    \n    this.tools.delete(name);\n    this.logger.info(`Tool unregistered: ${name}`);\n  }\n  \n  getTool(name: string): Tool | undefined {\n    const tool = this.tools.get(name);\n    if (tool) {\n      const { handler, ...toolDef } = tool;\n      return toolDef;\n    }\n    return undefined;\n  }\n  \n  listTools(): Tool[] {\n    return Array.from(this.tools.values()).map(({ handler, ...tool }) => tool);\n  }\n  \n  async executeTool(name: string, args: any): Promise<any> {\n    if (!this.isRunning()) {\n      this.logger.warn(`Attempted to execute tool '${name}' while server is not running`);\n      throw new Error('Server is not running');\n    }\n    \n    const tool = this.tools.get(name);\n    if (!tool) {\n      this.logger.error(`Tool not found: ${name}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`);\n      throw new Error(`Tool not found: ${name}`);\n    }\n    \n    const startTime = Date.now();\n    \n    this.logger.info(`[TOOL_EXEC_START] Tool: ${name}`);\n    this.logger.debug(`[TOOL_ARGS] ${name}:`, args);\n    \n    try {\n      const result = await tool.handler(args);\n      \n      const responseTime = Date.now() - startTime;\n      this.logger.info(`[TOOL_EXEC_SUCCESS] Tool: ${name}, Time: ${responseTime}ms`);\n      this.logger.debug(`[TOOL_RESULT] ${name}:`, result);\n      \n      return result;\n    } catch (error: any) {\n      // 直接失败,不重试,不计数,简单明了\n      this.logger.error(`[TOOL_EXEC_ERROR] Tool: ${name}`, error);\n      throw error;\n    }\n  }\n  \n  // ============ 资源管理 ============\n  \n  registerResource(resource: Resource): void {\n    if (this.resources.has(resource.uri)) {\n      throw new Error(`Resource ${resource.uri} already registered`);\n    }\n    \n    this.resources.set(resource.uri, resource);\n    this.logger.info(`Resource registered: ${resource.uri}`);\n  }\n  \n  unregisterResource(uri: string): void {\n    if (!this.resources.has(uri)) {\n      this.logger.warn(`Resource ${uri} not found for unregistration`);\n      return;\n    }\n    \n    this.resources.delete(uri);\n    this.logger.info(`Resource unregistered: ${uri}`);\n  }\n  \n  getResource(uri: string): Resource | undefined {\n    return this.resources.get(uri);\n  }\n  \n  listResources(): Resource[] {\n    return Array.from(this.resources.values());\n  }\n  \n  // ============ 提示词管理 ============\n  \n  registerPrompt(prompt: Prompt): void {\n    if (this.prompts.has(prompt.name)) {\n      throw new Error(`Prompt ${prompt.name} already registered`);\n    }\n    \n    this.prompts.set(prompt.name, prompt);\n    this.logger.info(`Prompt registered: ${prompt.name}`);\n  }\n  \n  unregisterPrompt(name: string): void {\n    if (!this.prompts.has(name)) {\n      this.logger.warn(`Prompt ${name} not found for unregistration`);\n      return;\n    }\n    \n    this.prompts.delete(name);\n    this.logger.info(`Prompt unregistered: ${name}`);\n  }\n  \n  getPrompt(name: string): Prompt | undefined {\n    return this.prompts.get(name);\n  }\n  \n  listPrompts(): Prompt[] {\n    return Array.from(this.prompts.values());\n  }\n  \n  // ============ 会话管理 ============\n  \n  async createSession(metadata?: Record<string, any>): Promise<SessionContext> {\n    const sessionId = this.generateSessionId();\n    const session: SessionContext = {\n      id: sessionId,\n      createdAt: Date.now(),\n      lastActivity: Date.now(),\n      metadata\n    };\n    \n    this.sessions.set(sessionId, session);\n    this.logger.info(`Session created: ${sessionId}`);\n    \n    // 会话清理\n    if (this.options.sessionTimeout) {\n      setTimeout(() => {\n        this.destroySession(sessionId);\n      }, this.options.sessionTimeout);\n    }\n    \n    return session;\n  }\n  \n  getSession(sessionId: string): SessionContext | undefined {\n    const session = this.sessions.get(sessionId);\n    if (session) {\n      session.lastActivity = Date.now();\n    }\n    return session;\n  }\n  \n  async destroySession(sessionId: string): Promise<void> {\n    if (!this.sessions.has(sessionId)) {\n      this.logger.warn(`Session ${sessionId} not found for destruction`);\n      return;\n    }\n    \n    this.sessions.delete(sessionId);\n    this.logger.info(`Session destroyed: ${sessionId}`);\n  }\n  \n  listSessions(): SessionContext[] {\n    return Array.from(this.sessions.values());\n  }\n  \n  // ============ 监控与可观测性 ============\n  \n  /**\n   * 获取错误统计报告\n   */\n  getErrorReport(): string {\n    return globalErrorCollector.exportReport();\n  }\n  \n  /**\n   * 获取错误统计\n   */\n  getErrorStats(): any {\n    return globalErrorCollector.getStats();\n  }\n  \n  async healthCheck(): Promise<HealthCheckResult> {\n    const memUsage = process.memoryUsage();\n    const memoryPercentage = (memUsage.heapUsed / memUsage.heapTotal) * 100;\n    \n    const health: HealthCheckResult = {\n      status: 'healthy',\n      timestamp: Date.now(),\n      checks: {\n        server: {\n          status: this.isRunning() ? 'up' : 'down',\n          message: `Server is ${this.state}`\n        },\n        resources: {\n          registered: this.tools.size + this.resources.size + this.prompts.size,\n          available: this.tools.size + this.resources.size + this.prompts.size\n        },\n        memory: {\n          used: memUsage.heapUsed,\n          limit: memUsage.heapTotal,\n          percentage: memoryPercentage\n        }\n      }\n    };\n    \n    // 判断健康状态\n    if (this.state === 'ERROR' || this.state === 'FATAL_ERROR') {\n      health.status = 'unhealthy';\n      health.errors = [this.lastError?.message || 'Unknown error'];\n    } else if (memoryPercentage > 80 || this.activeRequests > (this.options.maxConcurrentRequests || 100)) {\n      health.status = 'degraded';\n    }\n    \n    return health;\n  }\n  \n  getMetrics(): ServerMetrics {\n    this.metrics.memoryUsage = process.memoryUsage();\n    this.metrics.uptime = this.metrics.startTime ? Date.now() - this.metrics.startTime : 0;\n    this.metrics.activeConnections = this.sessions.size;\n    return { ...this.metrics };\n  }\n  \n  setLogger(logger: Logger): void {\n    this.logger = logger;\n  }\n  \n  // ============ 辅助方法 ============\n  \n  protected generateSessionId(): string {\n    return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n  \n  protected async waitForActiveRequests(): Promise<void> {\n    while (this.activeRequests > 0) {\n      this.logger.debug(`Waiting for ${this.activeRequests} active requests to complete`);\n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n  }\n  \n  protected updateAvgResponseTime(newTime: number): void {\n    const count = this.metrics.requestCount;\n    const currentAvg = this.metrics.avgResponseTime;\n    this.metrics.avgResponseTime = (currentAvg * (count - 1) + newTime) / count;\n  }\n}","/**\n * MCP错误类型系统\n * \n * 提供统一的错误分类和处理机制\n */\n\n/**\n * 错误严重程度\n */\nexport enum ErrorSeverity {\n  /** 可忽略的警告 */\n  WARNING = 'warning',\n  /** 需要人工干预的错误 */\n  CRITICAL = 'critical',\n  /** 致命错误,需要重启 */\n  FATAL = 'fatal'\n}\n\n/**\n * 错误类别\n */\nexport enum ErrorCategory {\n  /** 网络相关错误 */\n  NETWORK = 'network',\n  /** 协议错误(JSON-RPC等) */\n  PROTOCOL = 'protocol',\n  /** 工具执行错误 */\n  TOOL_EXECUTION = 'tool_execution',\n  /** 资源访问错误 */\n  RESOURCE_ACCESS = 'resource_access',\n  /** 会话管理错误 */\n  SESSION = 'session',\n  /** 传输层错误 */\n  TRANSPORT = 'transport',\n  /** 配置错误 */\n  CONFIGURATION = 'configuration',\n  /** 内部错误 */\n  INTERNAL = 'internal'\n}\n\n/**\n * MCP基础错误类\n */\nexport class MCPError extends Error {\n  /** 错误代码 */\n  public readonly code: string;\n  /** 错误严重程度 */\n  public readonly severity: ErrorSeverity;\n  /** 错误类别 */\n  public readonly category: ErrorCategory;\n  /** 错误上下文 */\n  public readonly context?: any;\n  /** 错误发生时间 */\n  public readonly timestamp: number;\n  /** 原始错误 */\n  public readonly cause?: Error;\n  \n  constructor(\n    message: string,\n    code: string,\n    severity: ErrorSeverity,\n    category: ErrorCategory,\n    options?: {\n      cause?: Error;\n      context?: any;\n    }\n  ) {\n    super(message);\n    this.name = 'MCPError';\n    this.code = code;\n    this.severity = severity;\n    this.category = category;\n    this.cause = options?.cause;\n    this.context = options?.context;\n    this.timestamp = Date.now();\n    \n    \n    // 保持原始堆栈信息\n    if (options?.cause && options.cause.stack) {\n      this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\n    }\n  }\n  \n  /**\n   * 转换为JSON-RPC错误格式\n   */\n  toJsonRpcError(): { code: number; message: string; data?: any } {\n    // 根据类别映射到JSON-RPC错误码\n    let jsonRpcCode: number;\n    \n    switch (this.category) {\n      case ErrorCategory.PROTOCOL:\n        jsonRpcCode = -32700; // Parse error\n        break;\n      case ErrorCategory.TOOL_EXECUTION:\n        jsonRpcCode = -32602; // Invalid params\n        break;\n      case ErrorCategory.RESOURCE_ACCESS:\n        jsonRpcCode = -32001; // Custom: Resource error\n        break;\n      case ErrorCategory.SESSION:\n        jsonRpcCode = -32002; // Custom: Session error\n        break;\n      case ErrorCategory.TRANSPORT:\n        jsonRpcCode = -32003; // Custom: Transport error\n        break;\n      default:\n        jsonRpcCode = -32603; // Internal error\n    }\n    \n    return {\n      code: jsonRpcCode,\n      message: this.message,\n      data: {\n        mcp_code: this.code,\n        category: this.category,\n        severity: this.severity,\n        context: this.context\n      }\n    };\n  }\n  \n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'NETWORK_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.NETWORK,\n      options\n    );\n    this.name = 'NetworkError';\n  }\n}\n\n/**\n * 协议错误\n */\nexport class ProtocolError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'PROTOCOL_ERROR',\n      ErrorSeverity.CRITICAL,\n      ErrorCategory.PROTOCOL,\n      { ...options, recoverable: false }\n    );\n    this.name = 'ProtocolError';\n  }\n}\n\n/**\n * 工具执行错误\n */\nexport class ToolExecutionError extends MCPError {\n  constructor(\n    toolName: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Tool '${toolName}' execution failed: ${message}`,\n      'TOOL_EXECUTION_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.TOOL_EXECUTION,\n      { ...options, context: { ...options?.context, toolName } }\n    );\n    this.name = 'ToolExecutionError';\n  }\n}\n\n/**\n * 资源访问错误\n */\nexport class ResourceAccessError extends MCPError {\n  constructor(\n    resourceUri: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Resource '${resourceUri}' access failed: ${message}`,\n      'RESOURCE_ACCESS_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.RESOURCE_ACCESS,\n      { ...options, context: { ...options?.context, resourceUri } }\n    );\n    this.name = 'ResourceAccessError';\n  }\n}\n\n/**\n * 会话错误\n */\nexport class SessionError extends MCPError {\n  constructor(\n    sessionId: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Session '${sessionId}' error: ${message}`,\n      'SESSION_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.SESSION,\n      { ...options, context: { ...options?.context, sessionId } }\n    );\n    this.name = 'SessionError';\n  }\n}\n\n/**\n * 传输层错误\n */\nexport class TransportError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'TRANSPORT_ERROR',\n      ErrorSeverity.CRITICAL,\n      ErrorCategory.TRANSPORT,\n      options\n    );\n    this.name = 'TransportError';\n  }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'CONFIGURATION_ERROR',\n      ErrorSeverity.FATAL,\n      ErrorCategory.CONFIGURATION,\n      { ...options, recoverable: false }\n    );\n    this.name = 'ConfigurationError';\n  }\n}\n\n/**\n * 错误帮助函数\n */\nexport class ErrorHelper {\n  /**\n   * 判断错误是否可恢复\n   */\n  static isRecoverable(error: Error): boolean {\n    if (error instanceof MCPError) {\n      return error.recoverable;\n    }\n    \n    // 对于标准错误,根据类型判断\n    if (error.name === 'ECONNRESET' || error.name === 'ETIMEDOUT') {\n      return true;\n    }\n    \n    return false;\n  }\n  \n  /**\n   * 将普通错误包装为MCPError\n   */\n  static wrap(error: Error, category: ErrorCategory = ErrorCategory.INTERNAL): MCPError {\n    if (error instanceof MCPError) {\n      return error;\n    }\n    \n    return new MCPError(\n      error.message,\n      'WRAPPED_ERROR',\n      ErrorSeverity.WARNING,\n      category,\n      { cause: error }\n    );\n  }\n  \n  /**\n   * 创建错误上下文\n   */\n  static createContext(\n    method?: string,\n    params?: any,\n    sessionId?: string,\n    requestId?: string | number\n  ): any {\n    return {\n      method,\n      params,\n      sessionId,\n      requestId,\n      timestamp: Date.now()\n    };\n  }\n}","import { MCPError, ErrorSeverity, ErrorCategory } from '~/errors/MCPError.js';\nimport logger from '@promptx/logger';\n\n/**\n * 错误统计信息\n */\nexport interface ErrorStats {\n  /** 总错误数 */\n  totalErrors: number;\n  /** 按严重程度分类 */\n  bySeverity: Record<ErrorSeverity, number>;\n  /** 按类别分类 */\n  byCategory: Record<ErrorCategory, number>;\n  /** 按错误代码分类 */\n  byCode: Record<string, number>;\n  /** 最近错误 */\n  recentErrors: Array<{\n    timestamp: number;\n    code: string;\n    message: string;\n    severity: ErrorSeverity;\n    category: ErrorCategory;\n  }>;\n  /** 错误率(每分钟) */\n  errorRate: number;\n  /** 恢复成功率 */\n  recoveryRate: number;\n}\n\n/**\n * 错误收集器\n * \n * 收集、分析和报告错误信息\n */\nexport class ErrorCollector {\n  private errors: MCPError[] = [];\n  private maxErrors: number;\n  private windowSize: number; // 时间窗口(毫秒)\n  \n  // 错误阈值触发器\n  private thresholds: Map<string, { count: number; action: () => void }> = new Map();\n  \n  constructor(options: {\n    maxErrors?: number;\n    windowSize?: number;\n  } = {}) {\n    this.maxErrors = options.maxErrors || 1000;\n    this.windowSize = options.windowSize || 60000; // 默认1分钟\n    \n    // 定期清理旧错误\n    setInterval(() => this.cleanup(), this.windowSize);\n  }\n  \n  /**\n   * 收集错误\n   */\n  collect(error: Error): void {\n    const mcpError = error instanceof MCPError \n      ? error \n      : new MCPError(\n          error.message,\n          'UNKNOWN_ERROR',\n          ErrorSeverity.WARNING,\n          ErrorCategory.INTERNAL,\n          { cause: error }\n        );\n    \n    this.errors.push(mcpError);\n    \n    // 记录到日志\n    this.logError(mcpError);\n    \n    // 检查阈值\n    this.checkThresholds(mcpError);\n    \n    // 限制内存使用\n    if (this.errors.length > this.maxErrors) {\n      this.errors = this.errors.slice(-this.maxErrors);\n    }\n  }\n  \n  \n  /**\n   * 获取错误统计\n   */\n  getStats(): ErrorStats {\n    const now = Date.now();\n    const recentErrors = this.getRecentErrors();\n    \n    const stats: ErrorStats = {\n      totalErrors: recentErrors.length,\n      bySeverity: this.groupBySeverity(recentErrors),\n      byCategory: this.groupByCategory(recentErrors),\n      byCode: this.groupByCode(recentErrors),\n      recentErrors: recentErrors.slice(-10).map(e => ({\n        timestamp: e.timestamp,\n        code: e.code,\n        message: e.message,\n        severity: e.severity,\n        category: e.category\n      })),\n      errorRate: this.calculateErrorRate(recentErrors),\n    };\n    \n    return stats;\n  }\n  \n  /**\n   * 设置错误阈值触发器\n   */\n  setThreshold(\n    key: string,\n    count: number,\n    action: () => void\n  ): void {\n    this.thresholds.set(key, { count, action });\n  }\n  \n  /**\n   * 清除错误历史\n   */\n  clear(): void {\n    this.errors = [];\n  }\n  \n  /**\n   * 导出错误报告\n   */\n  exportReport(): string {\n    const stats = this.getStats();\n    const report = [\n      '=== Error Report ===',\n      `Time: ${new Date().toISOString()}`,\n      `Total Errors: ${stats.totalErrors}`,\n      `Error Rate: ${stats.errorRate.toFixed(2)} errors/min`,\n      `Recovery Rate: ${(stats.recoveryRate * 100).toFixed(2)}%`,\n      '',\n      '--- By Severity ---',\n      ...Object.entries(stats.bySeverity).map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- By Category ---',\n      ...Object.entries(stats.byCategory).map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- Top Error Codes ---',\n      ...Object.entries(stats.byCode)\n        .sort((a, b) => b[1] - a[1])\n        .slice(0, 5)\n        .map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- Recent Errors ---',\n      ...stats.recentErrors.map(e => \n        `[${new Date(e.timestamp).toISOString()}] ${e.severity} - ${e.code}: ${e.message}`\n      )\n    ];\n    \n    return report.join('\\n');\n  }\n  \n  // ============ 私有方法 ============\n  \n  private logError(error: MCPError): void {\n    const logMessage = `[ERROR_COLLECTED] ${error.code} - ${error.message}`;\n    const context = {\n      code: error.code,\n      severity: error.severity,\n      category: error.category,\n      recoverable: error.recoverable,\n      context: error.context\n    };\n    \n    switch (error.severity) {\n      case ErrorSeverity.WARNING:\n        logger.warn(logMessage, context);\n        break;\n      case ErrorSeverity.FATAL:\n        logger.error(`[FATAL] ${logMessage}`, context);\n        break;\n      default:\n        logger.error(logMessage, context);\n    }\n  }\n  \n  private checkThresholds(error: MCPError): void {\n    // 检查严重程度阈值\n    const severityKey = `severity:${error.severity}`;\n    const severityCount = this.getRecentErrors()\n      .filter(e => e.severity === error.severity).length;\n    \n    const severityThreshold = this.thresholds.get(severityKey);\n    if (severityThreshold && severityCount >= severityThreshold.count) {\n      logger.warn(`[THRESHOLD] ${severityKey} threshold reached: ${severityCount}`);\n      severityThreshold.action();\n    }\n    \n    // 检查类别阈值\n    const categoryKey = `category:${error.category}`;\n    const categoryCount = this.getRecentErrors()\n      .filter(e => e.category === error.category).length;\n    \n    const categoryThreshold = this.thresholds.get(categoryKey);\n    if (categoryThreshold && categoryCount >= categoryThreshold.count) {\n      logger.warn(`[THRESHOLD] ${categoryKey} threshold reached: ${categoryCount}`);\n      categoryThreshold.action();\n    }\n    \n    // 检查特定错误代码阈值\n    const codeKey = `code:${error.code}`;\n    const codeCount = this.getRecentErrors()\n      .filter(e => e.code === error.code).length;\n    \n    const codeThreshold = this.thresholds.get(codeKey);\n    if (codeThreshold && codeCount >= codeThreshold.count) {\n      logger.warn(`[THRESHOLD] ${codeKey} threshold reached: ${codeCount}`);\n      codeThreshold.action();\n    }\n  }\n  \n  private getRecentErrors(): MCPError[] {\n    const cutoff = Date.now() - this.windowSize;\n    return this.errors.filter(e => e.timestamp > cutoff);\n  }\n  \n  private cleanup(): void {\n    const before = this.errors.length;\n    this.errors = this.getRecentErrors();\n    const after = this.errors.length;\n    \n    if (before > after) {\n      logger.debug(`[ERROR_COLLECTOR] Cleaned up ${before - after} old errors`);\n    }\n  }\n  \n  private groupBySeverity(errors: MCPError[]): Record<ErrorSeverity, number> {\n    const result = {\n      [ErrorSeverity.WARNING]: 0,\n      [ErrorSeverity.CRITICAL]: 0,\n      [ErrorSeverity.FATAL]: 0\n    };\n    \n    for (const error of errors) {\n      result[error.severity]++;\n    }\n    \n    return result;\n  }\n  \n  private groupByCategory(errors: MCPError[]): Record<ErrorCategory, number> {\n    const result = {} as Record<ErrorCategory, number>;\n    \n    for (const category of Object.values(ErrorCategory)) {\n      result[category] = 0;\n    }\n    \n    for (const error of errors) {\n      result[error.category]++;\n    }\n    \n    return result;\n  }\n  \n  private groupByCode(errors: MCPError[]): Record<string, number> {\n    const result: Record<string, number> = {};\n    \n    for (const error of errors) {\n      result[error.code] = (result[error.code] || 0) + 1;\n    }\n    \n    return result;\n  }\n  \n  private calculateErrorRate(errors: MCPError[]): number {\n    if (errors.length === 0) return 0;\n    \n    // 计算每分钟错误率\n    const timeSpan = Math.min(\n      Date.now() - errors[0].timestamp,\n      this.windowSize\n    );\n    \n    const minutes = timeSpan / 60000;\n    return errors.length / Math.max(minutes, 1);\n  }\n}\n\n/**\n * 全局错误收集器实例\n */\nexport const globalErrorCollector = new ErrorCollector();","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\nimport { BaseMCPServer } from '~/servers/BaseMCPServer.js';\nimport type { MCPServerOptions } from '~/interfaces/MCPServer.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * 标准输入输出MCP服务器实现\n * \n * 通过stdin/stdout进行JSON-RPC通信\n * 适用于命令行工具和进程间通信\n * \n * 使用 MCP SDK 的 StdioServerTransport 处理所有协议细节\n */\nexport class StdioMCPServer extends BaseMCPServer {\n  private transport?: StdioServerTransport;\n  \n  constructor(options: MCPServerOptions) {\n    super(options);\n  }\n  \n  /**\n   * 连接标准输入输出传输层\n   */\n  protected async connectTransport(): Promise<void> {\n    this.logger.info('Connecting stdio transport...');\n    \n    // 创建stdio传输 - SDK会处理所有stdin/stdout通信\n    this.transport = new StdioServerTransport();\n    \n    // 连接到MCP服务器 - SDK会自动处理initialize等协议消息\n    await this.server.connect(this.transport);\n    \n    this.logger.info('Stdio transport connected');\n  }\n  \n  /**\n   * 断开标准输入输出传输层\n   */\n  protected async disconnectTransport(): Promise<void> {\n    this.logger.info('Disconnecting stdio transport...');\n    \n    // 关闭传输\n    if (this.transport) {\n      await this.transport.close();\n      this.transport = undefined;\n    }\n    \n    this.logger.info('Stdio transport disconnected');\n  }\n  \n  /**\n   * 读取资源内容\n   * 实现文件系统资源读取\n   */\n  protected async readResource(resource: Resource): Promise<any> {\n    try {\n      // 解析URI\n      const uri = new URL(resource.uri);\n      \n      if (uri.protocol === 'file:') {\n        // 读取文件\n        const filePath = uri.pathname;\n        \n        // 安全检查:确保文件路径在允许的范围内\n        const resolvedPath = path.resolve(filePath);\n        \n        // 读取文件内容\n        const content = await fs.readFile(resolvedPath, 'utf-8');\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else {\n        throw new Error(`Unsupported resource protocol: ${uri.protocol}`);\n      }\n    } catch (error: any) {\n      this.logger.error(`Failed to read resource: ${resource.uri}`, error);\n      throw new Error(`Failed to read resource: ${error.message}`);\n    }\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async start(options?: MCPServerOptions): Promise<void> {\n    await super.start(options);\n    \n    // 输出启动信息到stderr(不干扰stdout的JSON-RPC通信)\n    this.logger.info(`STDIO Server Ready`);\n    this.logger.info('Listening for JSON-RPC messages on stdin');\n  }\n}","import express, { Express, Request, Response } from 'express';\nimport { Server as HttpServer } from 'http';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { \n  InitializeRequestSchema,\n  LoggingMessageNotification,\n  JSONRPCNotification,\n  JSONRPCError,\n  Notification,\n  ListToolsRequestSchema,\n  CallToolRequestSchema,\n  ListResourcesRequestSchema,\n  ListPromptsRequestSchema,\n  GetPromptRequestSchema,\n  ReadResourceRequestSchema\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Resource, Tool, Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport { BaseMCPServer } from '~/servers/BaseMCPServer.js';\nimport type { MCPServerOptions, ToolWithHandler } from '~/interfaces/MCPServer.js';\nimport { WorkerpoolAdapter } from '~/workers/index.js';\nimport type { ToolWorkerPool } from '~/interfaces/ToolWorkerPool.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport packageJson from '../../package.json' assert { type: 'json' };\n\nconst SESSION_ID_HEADER_NAME = \"mcp-session-id\";\n\n/**\n * HTTP流式MCP服务器实现\n * \n * 使用 MCP SDK 的 StreamableHTTPServerTransport 处理所有协议细节\n * 支持HTTP JSON-RPC和SSE(Server-Sent Events)\n */\nexport class StreamableHttpMCPServer extends BaseMCPServer {\n  private app?: Express;\n  private httpServer?: HttpServer;\n  private port: number;\n  private host: string;\n  private corsEnabled: boolean;\n  private workerPool: ToolWorkerPool;\n  \n  // 支持多个并发连接 - 每个session独立的Server和Transport实例\n  private servers: Map<string, Server> = new Map();\n  private transports: Map<string, StreamableHTTPServerTransport> = new Map();\n  \n  constructor(options: MCPServerOptions & {\n    port?: number;\n    host?: string;\n    corsEnabled?: boolean;\n  }) {\n    super(options);\n    this.port = options.port || 8080;\n    this.host = options.host || '127.0.0.1';  // 使用 IPv4 避免 IPv6 问题\n    this.corsEnabled = options.corsEnabled || false;\n    \n    // 初始化 worker pool\n    this.workerPool = new WorkerpoolAdapter({\n      minWorkers: 2,\n      maxWorkers: 4,\n      workerTimeout: 30000\n    });\n  }\n  \n  /**\n   * 连接HTTP传输层\n   */\n  protected async connectTransport(): Promise<void> {\n    this.logger.info('Starting HTTP server...');\n    \n    // 初始化 worker pool\n    await this.workerPool.initialize();\n    this.logger.info('Worker pool initialized');\n    \n    // 创建Express应用\n    this.app = express();\n    \n    // 设置Express应用 - 完全仿照官方\n    this.setupExpress();\n    \n    // 启动HTTP服务器\n    await new Promise<void>((resolve, reject) => {\n      this.httpServer = this.app!.listen(this.port, this.host, () => {\n        this.logger.info(`HTTP server listening on http://${this.host}:${this.port}/mcp`);\n        resolve();\n      });\n      \n      this.httpServer.on('error', reject);\n    });\n  }\n  \n  /**\n   * 获取或创建session对应的Server实例\n   * \n   * 形式化规约:\n   * 前置条件:sessionId ≠ null ∧ sessionId ≠ \"\"\n   * 后置条件:返回的Server是sessionId唯一对应的\n   * 不变式:servers.get(sessionId) 存在 ⟺ transports.get(sessionId) 存在\n   */\n  private getOrCreateServer(sessionId: string): Server {\n    // 断言:sessionId必须有效\n    if (!sessionId) {\n      throw new Error('SessionId cannot be null or empty');\n    }\n    \n    // 如果已存在,直接返回\n    if (this.servers.has(sessionId)) {\n      return this.servers.get(sessionId)!;\n    }\n    \n    // 创建新的Server实例(注意:不监听端口)\n    const server = new Server(\n      {\n        name: this.options.name,\n        version: this.options.version\n      },\n      {\n        capabilities: {\n          tools: {},\n          resources: {},\n          prompts: {}\n        }\n      }\n    );\n    \n    // 为这个Server注册处理器(独立副本)\n    this.setupServerHandlers(server);\n    \n    // 保存Server实例\n    this.servers.set(sessionId, server);\n    this.logger.info(`Created new Server instance for session: ${sessionId}`);\n    \n    return server;\n  }\n  \n  /**\n   * 为Server实例设置请求处理器\n   * 注意:这些处理器是每个Server独立的\n   */\n  private setupServerHandlers(server: Server): void {\n    // 工具列表请求\n    server.setRequestHandler(ListToolsRequestSchema, async () => {\n      this.logger.debug('Handling list tools request');\n      return {\n        tools: Array.from(this.tools.values()).map(({ handler, ...tool }) => tool)\n      };\n    });\n    \n    // 工具调用请求\n    server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      this.logger.debug(`Handling tool call: ${request.params.name}`);\n      return this.executeTool(request.params.name, request.params.arguments);\n    });\n    \n    // 资源列表请求\n    server.setRequestHandler(ListResourcesRequestSchema, async () => {\n      this.logger.debug('Handling list resources request');\n      return {\n        resources: Array.from(this.resources.values())\n      };\n    });\n    \n    // 读取资源请求\n    server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n      this.logger.debug(`Handling read resource: ${request.params.uri}`);\n      const resource = this.resources.get(request.params.uri);\n      if (!resource) {\n        throw new Error(`Resource not found: ${request.params.uri}`);\n      }\n      return this.readResource(resource);\n    });\n    \n    // 提示词列表请求\n    server.setRequestHandler(ListPromptsRequestSchema, async () => {\n      this.logger.debug('Handling list prompts request');\n      return {\n        prompts: Array.from(this.prompts.values())\n      };\n    });\n    \n    // 获取提示词请求\n    server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n      this.logger.debug(`Handling get prompt: ${request.params.name}`);\n      const prompt = this.prompts.get(request.params.name);\n      if (!prompt) {\n        throw new Error(`Prompt not found: ${request.params.name}`);\n      }\n      return { prompt };\n    });\n  }\n  \n  /**\n   * 设置中间件和路由 - 完全仿照官方实现\n   */\n  private setupExpress(): void {\n    if (!this.app) return;\n    \n    // 仿照官方:只有基础的 JSON 解析\n    this.app.use(express.json());\n    \n    // 仿照官方:使用 Router\n    const router = express.Router();\n    \n    // 健康检查端点 - 在其他路由之前定义\n    router.get('/health', (req, res) => {\n      this.handleHealthCheck(req, res);\n    });\n    \n    // 仿照官方:路由定义\n    router.post('/mcp', async (req, res) => {\n      await this.handlePostRequest(req, res);\n    });\n    \n    router.get('/mcp', async (req, res) => {\n      await this.handleGetRequest(req, res);\n    });\n    \n    // 仿照官方:挂载路由\n    this.app.use('/', router);\n  }\n  \n  /**\n   * 处理健康检查请求\n   * \n   * 形式化保证:\n   * - 无副作用(幂等性)\n   * - O(1)时间复杂度\n   * - 始终返回有效JSON\n   */\n  private handleHealthCheck(req: Request, res: Response): void {\n    const healthStatus = {\n      status: 'ok',\n      timestamp: new Date().toISOString(),\n      service: 'mcp-server',\n      uptime: process.uptime(),\n      version: this.getVersion(),\n      transport: 'http',\n      sessions: this.servers.size,  // 显示当前活跃的session数量\n      servers: this.servers.size,   // 独立Server实例数量\n      transports: this.transports.size  // Transport实例数量\n    };\n    \n    res.status(200).json(healthStatus);\n  }\n  \n  /**\n   * 获取服务版本信息\n   */\n  private getVersion(): string {\n    return packageJson.version || 'unknown';\n  }\n  \n  /**\n   * 处理 GET 请求(SSE)\n   * 使用独立的Server实例处理SSE连接\n   */\n  private async handleGetRequest(req: Request, res: Response): Promise<void> {\n    const sessionId = req.headers[SESSION_ID_HEADER_NAME] as string | undefined;\n    \n    if (!sessionId) {\n      res.status(400).json(\n        this.createErrorResponse('Bad Request: session ID required for SSE.')\n      );\n      return;\n    }\n    \n    // 确保session存在(获取或创建Server和Transport)\n    if (!this.transports.has(sessionId)) {\n      this.logger.info(`Session ${sessionId} not found for SSE, creating...`);\n      \n      // 获取或创建Server\n      const server = this.getOrCreateServer(sessionId);\n      \n      // 创建Transport\n      const transport = new StreamableHTTPServerTransport({\n        sessionIdGenerator: () => sessionId\n      });\n      \n      // 连接\n      await server.connect(transport);\n      this.transports.set(sessionId, transport);\n    }\n    \n    this.logger.info(`Establishing SSE stream for session ${sessionId}`);\n    \n    // 设置 SSE 必需的响应头\n    res.setHeader('Content-Type', 'text/event-stream');\n    res.setHeader('Cache-Control', 'no-cache');\n    res.setHeader('Connection', 'keep-alive');\n    res.setHeader('X-Accel-Buffering', 'no'); // 禁用 Nginx 缓冲\n    \n    // 启动心跳机制 - 每 20 秒发送一次\n    const heartbeatInterval = setInterval(() => {\n      try {\n        // SSE 心跳格式:注释行\n        res.write(':heartbeat\\n\\n');\n        this.logger.info(`Sent SSE heartbeat for session ${sessionId}`);\n      } catch (error) {\n        this.logger.error(`Failed to send heartbeat for session ${sessionId}: ${error}`);\n        clearInterval(heartbeatInterval);\n      }\n    }, 20000); // 20 秒间隔\n    \n    // 监听连接关闭事件\n    req.on('close', () => {\n      this.logger.info(`SSE connection closed for session ${sessionId}`);\n      clearInterval(heartbeatInterval);\n      // 注意:暂时不清理session,因为客户端可能重连\n    });\n    \n    const transport = this.transports.get(sessionId)!;\n    await transport.handleRequest(req, res);\n    await this.streamMessages(transport);\n    \n    return;\n  }\n  \n  /**\n   * 发送 SSE 流消息 - 完全复制官方实现\n   */\n  private async streamMessages(transport: StreamableHTTPServerTransport): Promise<void> {\n    try {\n      // 基于 LoggingMessageNotificationSchema 触发客户端的 setNotificationHandler\n      const message = {\n        method: 'notifications/message',\n        params: { level: 'info', data: 'SSE Connection established' }\n      };\n      \n      this.sendNotification(transport, message);\n      \n      let messageCount = 0;\n      \n      const interval = setInterval(async () => {\n        messageCount++;\n        \n        const data = `Message ${messageCount} at ${new Date().toISOString()}`;\n        \n        const message = {\n          method: 'notifications/message',\n          params: { level: 'info', data: data }\n        };\n        \n        try {\n          this.sendNotification(transport, message);\n          \n          if (messageCount === 2) {\n            clearInterval(interval);\n            \n            const message = {\n              method: 'notifications/message',\n              params: { level: 'info', data: 'Streaming complete!' }\n            };\n            \n            this.sendNotification(transport, message);\n          }\n        } catch (error) {\n          this.logger.error(`Error sending message: ${error}`);\n          clearInterval(interval);\n        }\n      }, 1000);\n    } catch (error) {\n      this.logger.error(`Error sending message: ${error}`);\n    }\n  }\n  \n  /**\n   * 发送通知 - 完全复制官方实现\n   */\n  private async sendNotification(\n    transport: StreamableHTTPServerTransport,\n    notification: any\n  ): Promise<void> {\n    const rpcNotification = {\n      ...notification,\n      jsonrpc: '2.0'\n    };\n    await transport.send(rpcNotification);\n  }\n  \n  /**\n   * 处理 POST 请求(JSON-RPC)\n   * 使用独立的Server实例处理每个session\n   */\n  private async handlePostRequest(req: Request, res: Response): Promise<void> {\n    const sessionId = req.headers[SESSION_ID_HEADER_NAME] as string | undefined;\n    \n    this.logger.info('=== POST Request ===');\n    this.logger.info(`Headers: ${JSON.stringify(req.headers, null, 2)}`);\n    this.logger.info(`Body: ${JSON.stringify(req.body, null, 2)}`);\n    this.logger.info(`Session ID: ${sessionId}`);\n    \n    try {\n      // 处理已有session的请求\n      if (sessionId && this.transports.has(sessionId)) {\n        this.logger.info(`Reusing existing Server and Transport for session: ${sessionId}`);\n        const transport = this.transports.get(sessionId)!;\n        await transport.handleRequest(req, res, req.body);\n        return;\n      }\n      \n      // 处理initialize请求(创建新session)\n      if (!sessionId && this.isInitializeRequest(req.body)) {\n        this.logger.info('Creating new session for initialize request');\n        \n        // 生成新的session ID\n        const newSessionId = randomUUID();\n        \n        // 获取或创建该session的Server\n        const server = this.getOrCreateServer(newSessionId);\n        \n        // 创建新的Transport\n        const transport = new StreamableHTTPServerTransport({\n          sessionIdGenerator: () => newSessionId\n        });\n        \n        // 连接Server和Transport\n        await server.connect(transport);\n        \n        // 保存Transport(Server已在getOrCreateServer中保存)\n        this.transports.set(newSessionId, transport);\n        \n        // 处理请求\n        await transport.handleRequest(req, res, req.body);\n        \n        this.logger.info(`New session created: ${newSessionId}`);\n        return;\n      }\n      \n      // 处理带session ID但Transport不存在的情况(可能是服务器重启)\n      if (sessionId && !this.transports.has(sessionId)) {\n        this.logger.info(`Session ${sessionId} not found, recreating...`);\n        \n        // 获取或创建Server\n        const server = this.getOrCreateServer(sessionId);\n        \n        // 创建新的Transport\n        const transport = new StreamableHTTPServerTransport({\n          sessionIdGenerator: () => sessionId\n        });\n        \n        // 连接\n        await server.connect(transport);\n        this.transports.set(sessionId, transport);\n        \n        // 处理请求\n        await transport.handleRequest(req, res, req.body);\n        return;\n      }\n      \n      // 无效请求\n      this.logger.info('Invalid request - no session ID and not initialize request');\n      this.logger.info(`isInitializeRequest result: ${this.isInitializeRequest(req.body)}`);\n      res.status(400).json({\n        jsonrpc: '2.0',\n        error: {\n          code: -32000,\n          message: 'Bad Request: invalid session ID or method.'\n        },\n        id: randomUUID()\n      });\n      \n    } catch (error) {\n      this.logger.error(`Error handling MCP request: ${error}`);\n      res.status(500).json({\n        jsonrpc: '2.0',\n        error: {\n          code: -32603,\n          message: 'Internal server error.'\n        },\n        id: randomUUID()\n      });\n    }\n  }\n  \n  /**\n   * 检查是否是 initialize 请求 - 完全复制官方实现\n   */\n  private isInitializeRequest(body: any): boolean {\n    const isInitial = (data: any) => {\n      const result = InitializeRequestSchema.safeParse(data);\n      return result.success;\n    };\n    if (Array.isArray(body)) {\n      return body.some((request) => isInitial(request));\n    }\n    return isInitial(body);\n  }\n  \n  /**\n   * 创建错误响应 - 完全复制官方实现\n   */\n  private createErrorResponse(message: string): any {\n    return {\n      jsonrpc: '2.0',\n      error: {\n        code: -32000,\n        message: message\n      },\n      id: randomUUID()\n    };\n  }\n  \n  /**\n   * 断开HTTP传输层\n   */\n  protected async disconnectTransport(): Promise<void> {\n    this.logger.info('Stopping HTTP server...');\n    \n    // 关闭所有 transports 和 servers\n    for (const [sessionId, transport] of this.transports.entries()) {\n      this.logger.info(`Closing transport for session: ${sessionId}`);\n      await transport.close();\n    }\n    \n    // 清理所有servers(不需要显式关闭,因为它们不监听端口)\n    this.servers.clear();\n    this.transports.clear();\n    \n    // 关闭HTTP服务器\n    if (this.httpServer) {\n      await new Promise<void>((resolve) => {\n        this.httpServer!.close(() => {\n          this.logger.info('HTTP server stopped');\n          resolve();\n        });\n      });\n      \n      this.httpServer = undefined;\n    }\n    \n    // 终止 worker pool\n    await this.workerPool.terminate();\n    this.logger.info('Worker pool terminated');\n    \n    this.app = undefined;\n  }\n  \n  /**\n   * 清理特定session的资源\n   * 可以在session超时或客户端断开时调用\n   */\n  private async cleanupSession(sessionId: string): Promise<void> {\n    this.logger.info(`Cleaning up session: ${sessionId}`);\n    \n    // 关闭Transport\n    const transport = this.transports.get(sessionId);\n    if (transport) {\n      await transport.close();\n      this.transports.delete(sessionId);\n    }\n    \n    // 移除Server(垃圾回收会处理)\n    this.servers.delete(sessionId);\n    \n    this.logger.info(`Session cleaned up: ${sessionId}`);\n  }\n  \n  /**\n   * 读取资源内容\n   */\n  protected async readResource(resource: Resource): Promise<any> {\n    try {\n      const uri = new URL(resource.uri);\n      \n      if (uri.protocol === 'file:') {\n        const filePath = uri.pathname;\n        const resolvedPath = path.resolve(filePath);\n        const content = await fs.readFile(resolvedPath, 'utf-8');\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else if (uri.protocol === 'http:' || uri.protocol === 'https:') {\n        // 支持HTTP资源\n        const response = await fetch(resource.uri);\n        const content = await response.text();\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || response.headers.get('content-type') || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else {\n        throw new Error(`Unsupported resource protocol: ${uri.protocol}`);\n      }\n    } catch (error: any) {\n      this.logger.error(`Failed to read resource: ${resource.uri} - ${error}`);\n      throw new Error(`Failed to read resource: ${error.message}`);\n    }\n  }\n  \n  /**\n   * 重写 executeTool 方法,使用 WorkerPool 执行所有工具\n   */\n  async executeTool(name: string, args: any): Promise<any> {\n    if (!this.isRunning()) {\n      this.logger.warn(`Attempted to execute tool '${name}' while server is not running`);\n      throw new Error('Server is not running');\n    }\n    \n    const tool = this.tools.get(name);\n    if (!tool) {\n      this.logger.error(`Tool not found: ${name}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`);\n      throw new Error(`Tool not found: ${name}`);\n    }\n    \n    const startTime = Date.now();\n    \n    this.logger.info(`[TOOL_EXEC_START] Tool: ${name} (via WorkerPool)`);\n    this.logger.debug(`[TOOL_ARGS] ${name}: ${JSON.stringify(args)}`);\n    \n    try {\n      // 所有工具都通过 WorkerPool 执行\n      const result = await this.workerPool.execute(tool, args);\n      \n      const responseTime = Date.now() - startTime;\n      this.logger.info(`[TOOL_EXEC_SUCCESS] Tool: ${name}, Time: ${responseTime}ms`);\n      \n      // 更新指标\n      this.metrics.requestCount++;\n      this.metrics.avgResponseTime = \n        (this.metrics.avgResponseTime * (this.metrics.requestCount - 1) + responseTime) / \n        this.metrics.requestCount;\n      \n      return result;\n      \n    } catch (error: any) {\n      const responseTime = Date.now() - startTime;\n      this.logger.error(`[TOOL_EXEC_ERROR] Tool: ${name}, Time: ${responseTime}ms, Error: ${error.message}`);\n      \n      // 更新错误计数\n      this.metrics.errorCount++;\n      this.lastError = error;\n      \n      // 重新抛出错误\n      throw error;\n    }\n  }\n}","import * as workerpool from 'workerpool';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { \n  ToolWorkerPool, \n  PoolStats, \n  ToolWorkerPoolOptions \n} from '../interfaces/ToolWorkerPool';\nimport { ToolWithHandler } from '../interfaces/MCPServer';\nimport logger from '@promptx/logger';\n\n/**\n * 基于 workerpool 的 ToolWorkerPool 实现\n */\nexport class WorkerpoolAdapter implements ToolWorkerPool {\n  private pool: workerpool.Pool | null = null;\n  private options: Required<ToolWorkerPoolOptions>;\n  \n  constructor(options: ToolWorkerPoolOptions = {}) {\n    this.options = {\n      minWorkers: options.minWorkers ?? 2,\n      maxWorkers: options.maxWorkers ?? 4,\n      workerTimeout: options.workerTimeout ?? 30000,\n    };\n  }\n  \n  /**\n   * 初始化 worker pool\n   */\n  async initialize(): Promise<void> {\n    if (this.pool) {\n      logger.warn('WorkerpoolAdapter: Pool already initialized');\n      return;\n    }\n    \n    // tsup 会把 worker.ts 编译到 dist/worker.js\n    // WorkerpoolAdapter 会在某个 chunk 文件中,所以用相对路径找 worker.js\n    const workerPath = fileURLToPath(new URL('./worker.js', import.meta.url));\n    \n    this.pool = workerpool.pool(workerPath, {\n      minWorkers: this.options.minWorkers,\n      maxWorkers: this.options.maxWorkers,\n      workerType: 'process', // 使用进程而非线程\n      workerTerminateTimeout: 5000,\n      forkOpts: {\n        env: process.env,\n        cwd: process.cwd(),\n      }\n    });\n    \n    logger.info(`WorkerpoolAdapter initialized: ${this.options.minWorkers}-${this.options.maxWorkers} workers`);\n  }\n  \n  /**\n   * 执行工具\n   */\n  async execute<T = any>(tool: ToolWithHandler, args: any): Promise<T> {\n    if (!this.pool) {\n      throw new Error('WorkerpoolAdapter: Pool not initialized. Call initialize() first.');\n    }\n    \n    try {\n      logger.debug(`Executing tool '${tool.name}' in worker pool`);\n      \n      // 准备执行数据(只传递工具名和参数)\n      const taskData = {\n        toolName: tool.name,\n        args\n      };\n      \n      // 在 worker 中执行\n      const result = await this.pool.exec('executeTool', [taskData]);\n      \n      logger.debug(`Tool '${tool.name}' execution completed`);\n      return result as T;\n      \n    } catch (error: any) {\n      logger.error(`Tool '${tool.name}' execution failed: ${error.message}`);\n      \n      // 处理超时错误\n      if (error.message?.includes('timeout')) {\n        throw new Error(`Tool '${tool.name}' execution timeout after ${this.options.workerTimeout}ms`);\n      }\n      \n      // 重新抛出其他错误\n      throw error;\n    }\n  }\n  \n  /**\n   * 获取 pool 状态\n   */\n  getStats(): PoolStats {\n    if (!this.pool) {\n      return {\n        active: 0,\n        pending: 0,\n        available: 0,\n        total: 0\n      };\n    }\n    \n    const stats = this.pool.stats();\n    return {\n      active: stats.activeTasks,\n      pending: stats.pendingTasks,\n      available: stats.idleWorkers,\n      total: stats.totalWorkers\n    };\n  }\n  \n  /**\n   * 终止 pool\n   */\n  async terminate(): Promise<void> {\n    if (!this.pool) {\n      logger.warn('WorkerpoolAdapter: No pool to terminate');\n      return;\n    }\n    \n    logger.info('Terminating worker pool...');\n    await this.pool.terminate();\n    this.pool = null;\n    logger.info('Worker pool terminated');\n  }\n  \n  /**\n   * 判断工具是否需要使用 worker pool\n   */\n  static shouldUsePool(toolName: string): boolean {\n    // 需要隔离执行的工具列表\n    const isolatedTools = [\n      'toolx',           // 主要目标\n      'build',           // 构建任务\n      'test',            // 测试任务\n      'compile',         // 编译任务\n      'heavy-compute'    // 计算密集型任务\n    ];\n    \n    return isolatedTools.includes(toolName);\n  }\n}","/**\n * PromptXMCPServer - PromptX 专用的 MCP 服务器\n * \n * 集成了所有 PromptX 工具,提供统一的启动接口\n * 支持 stdio 和 http 两种传输模式\n */\n\nimport { StdioMCPServer } from './StdioMCPServer.js';\nimport { StreamableHttpMCPServer } from './StreamableHttpMCPServer.js';\nimport { allTools } from '../tools/index.js';\nimport type { MCPServer } from '../interfaces/MCPServer.js';\nimport logger from '@promptx/logger';\n\nexport interface PromptXServerOptions {\n  // 基础选项\n  transport: 'stdio' | 'http';\n  name?: string;\n  version?: string;\n  \n  // HTTP 特定选项\n  port?: number;\n  host?: string;\n  corsEnabled?: boolean;\n  cors?: boolean; // 别名兼容\n  \n  // PromptX 特定选项\n  workingDirectory?: string;  // 工作目录\n  ideType?: string;           // IDE 类型(cursor, vscode, claude 等)\n  debug?: boolean;            // 调试模式\n}\n\nexport class PromptXMCPServer {\n  private server: MCPServer;\n  private options: PromptXServerOptions;\n  \n  constructor(options: PromptXServerOptions) {\n    this.options = options;\n    \n    // 处理别名\n    if (options.cors !== undefined && options.corsEnabled === undefined) {\n      options.corsEnabled = options.cors;\n    }\n    \n    // 根据 transport 创建对应的服务器\n    if (options.transport === 'stdio') {\n      this.server = new StdioMCPServer({\n        name: options.name || 'promptx-mcp-server',\n        version: options.version || process.env.npm_package_version || '1.0.0'\n      });\n    } else {\n      this.server = new StreamableHttpMCPServer({\n        name: options.name || 'promptx-mcp-server',\n        version: options.version || process.env.npm_package_version || '1.0.0',\n        port: options.port || 5203,\n        host: options.host || 'localhost',\n        corsEnabled: options.corsEnabled || false\n      });\n    }\n    \n    // 自动注册 PromptX 工具\n    this.registerTools();\n  }\n  \n  /**\n   * 注册所有 PromptX 工具\n   */\n  private registerTools(): void {\n    // 注册标准工具集\n    allTools.forEach(tool => {\n      this.server.registerTool(tool);\n      logger.debug(`Registered tool: ${tool.name}`);\n    });\n    \n    logger.info(`Registered ${allTools.length} PromptX tools`);\n    \n    // 未来可以在这里加载:\n    // 1. 项目特定工具(基于 workingDirectory)\n    // 2. IDE 特定工具(基于 ideType)\n    // 3. 用户自定义工具\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async start(): Promise<void> {\n    await this.server.start();\n  }\n  \n  /**\n   * 停止服务器\n   */\n  async stop(): Promise<void> {\n    await this.server.stop();\n  }\n  \n  /**\n   * 优雅关闭\n   */\n  async gracefulShutdown(timeoutMs?: number): Promise<void> {\n    await this.server.gracefulShutdown(timeoutMs || 5000);\n  }\n  \n  /**\n   * 获取内部服务器实例(用于高级操作)\n   */\n  getServer(): MCPServer {\n    return this.server;\n  }\n  \n  // ========== 静态方法 ==========\n  \n  /**\n   * 统一启动方法(向后兼容 MCPServerManager.launch)\n   * \n   * 这个方法会:\n   * 1. 创建并启动服务器\n   * 2. 设置信号处理\n   * 3. 保持进程存活(stdio 模式)\n   */\n  static async launch(options: PromptXServerOptions): Promise<PromptXMCPServer> {\n    // 设置环境变量,通知 logger 当前的传输模式\n    process.env.MCP_TRANSPORT = options.transport;\n\n    // MCP STDIO模式最佳实践:劫持console防止stdout污染\n    if (options.transport === 'stdio') {\n      // 将所有console输出重定向到stderr,遵循MCP官方最佳实践\n      // 参考:https://modelcontextprotocol.io/quickstart/server\n      const originalLog = console.log;\n      console.log = console.error;  // 重定向到stderr\n      console.info = console.error;\n      console.debug = console.error;\n      console.warn = console.error;\n      // 保留原始方法以备需要\n      (console as any)._originalLog = originalLog;\n    }\n\n    const server = new PromptXMCPServer(options);\n\n    // 设置信号处理\n    const shutdown = async (signal: string) => {\n      logger.info(`\\nReceived ${signal}, shutting down gracefully...`);\n      try {\n        await server.gracefulShutdown(5000);\n        logger.info('Server stopped cleanly');\n        process.exit(0);\n      } catch (error) {\n        logger.error('Error during shutdown:', error);\n        process.exit(1);\n      }\n    };\n    \n    process.on('SIGINT', () => shutdown('SIGINT'));\n    process.on('SIGTERM', () => shutdown('SIGTERM'));\n    \n    // 启动服务器\n    await server.start();\n    \n    // 显示启动信息\n    if (options.transport === 'http') {\n      const port = options.port || 5203;\n      const host = options.host || '127.0.0.1';\n      logger.info(`HTTP Server Ready at http://${host}:${port}`);\n      logger.info('Use MCP-Session-Id header for session management');\n    } else {\n      logger.info('STDIO Server Ready');\n      logger.info('Listening for JSON-RPC messages on stdin');\n    }\n    \n    // 保持进程存活(对于 stdio 模式,防止进程退出)\n    if (options.transport === 'stdio') {\n      await new Promise(() => {}); // 永远等待\n    }\n    \n    return server;\n  }\n}\n\n// 导出向后兼容的别名\nexport { PromptXMCPServer as MCPServerManager };\nexport default PromptXMCPServer;"],"mappings":"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","names":["logger","ErrorCategory","logger","resolve","Server","ListToolsRequestSchema","CallToolRequestSchema","ListResourcesRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","ReadResourceRequestSchema","logger","fs","path","resolve","Server","ListToolsRequestSchema","CallToolRequestSchema","ListResourcesRequestSchema","ReadResourceRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","transport","message","logger"]}
Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �����뢻?0#Į�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ����ǫ����+ky��nW���L�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��n�J뢴��!�Wl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��n�J뢴��!�Wl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .� �x z���h�'�q�b�t���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �+ky��nW���L�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: >�&���z�ެ�m���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: >�&���z�ެ�m���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: >�&���z�ެ�m���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: >�&���z�ެ�m���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ���'$�֫�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highSC-003Suspicious CommandsMedium ConfidenceLine 0

Dynamic code execution via exec()

Detected by automated pattern matching (rule SC-003) with medium confidence. May be a false positive.

    776:         args
    777:       };
>>> 778:       const result = await this.pool.exec("executeTool", [taskData]);
    779:       logger3.debug(`Tool '${tool.name}' execution completed`);
    780:       return result;
Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��n�J뢴��!�Wl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��n�J뢴��!�Wl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: .+->�&��z���Ԝ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �ZjQ+��¢Y^r�+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.0 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.0 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.8 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.2 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumNS-003Network SuspiciousMedium ConfidenceLine 0

JavaScript fetch() call

Detected by automated pattern matching (rule NS-003) with medium confidence. May be a false positive.

>>> 1: {"version":3,"sources":["../src/servers/BaseMCPServer.ts","../src/errors/MCPError.ts","../src/errors/ErrorCollector.ts","../src/servers/StdioMCPServer.ts","../src/servers/StreamableHttpMCPServer.ts","../src/workers/WorkerpoolAdapter.ts","../src/servers/PromptXMCPServer.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { Tool, Resource, Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport {\n  ListToolsRequestSchema,\n  CallToolRequestSchema,\n  ListResourcesRequestSchema,\n  ListPromptsRequestSchema,\n  GetPromptRequestSchema,\n  ReadResourceRequestSchema\n} from '@modelcontextprotocol/sdk/types.js';\nimport logger, { type Logger } from '@promptx/logger';\nimport type {\n  MCPServer,\n  MCPServerOptions,\n  ServerState,\n  ToolHandler,\n  ToolWithHandler,\n  HealthCheckResult,\n  ServerMetrics,\n  SessionContext\n} from '~/interfaces/MCPServer.js';\nimport { \n  MCPError, \n  ToolExecutionError, \n  ResourceAccessError,\n  ErrorHelper,\n  ErrorSeverity \n} from '~/errors/MCPError.js';\nimport { globalErrorCollector } from '~/errors/ErrorCollector.js';\n\n/**\n * 基础MCP服务器实现\n * \n * 设计模式:Template Method Pattern\n * 子类需要实现特定的传输层逻辑\n * \n * 不变式:\n * 1. 状态转换必须原子性\n * 2. 资源注册必须幂等\n * 3. 错误不能破坏内部状态\n */\nexport abstract class BaseMCPServer implements MCPServer {\n  protected server: Server;\n  protected logger: Logger;\n  protected state: ServerState = 'IDLE';\n  protected options: MCPServerOptions;\n  \n  // 资源存储\n  protected tools = new Map<string, ToolWithHandler>();\n  protected resources = new Map<string, Resource>();\n  protected prompts = new Map<string, Prompt>();\n  protected sessions = new Map<string, SessionContext>();\n  \n  // 并发控制\n  protected activeRequests = 0;\n  protected readonly requestLocks = new Map<string, Promise<any>>();\n  \n  // 指标收集\n  protected metrics: ServerMetrics = {\n    requestCount: 0,\n    errorCount: 0,\n    avgResponseTime: 0,\n    activeConnections: 0,\n    memoryUsage: process.memoryUsage(),\n    startTime: 0,\n    uptime: 0\n  };\n  \n  // 最后错误(用于诊断)\n  protected lastError?: Error;\n  \n  constructor(options: MCPServerOptions) {\n    this.options = options;\n    this.logger = options.logger || logger;\n    \n    // 设置错误阈值\n    this.setupErrorThresholds();\n    \n    // 初始化MCP SDK服务器\n    this.server = new Server(\n      {\n        name: options.name,\n        version: options.version\n      },\n      {\n        capabilities: this.buildCapabilities()\n      }\n    );\n    \n    this.setupHandlers();\n  }\n  \n  /**\n   * 设置错误阈值\n   */\n  protected setupErrorThresholds(): void {\n    // 严重错误超过5个时触发告警\n    globalErrorCollector.setThreshold('severity:critical', 5, () => {\n      this.logger.error('[ALERT] Critical error threshold reached!');\n      // 可以在这里发送告警通知\n    });\n    \n    // 致命错误立即触发\n    globalErrorCollector.setThreshold('severity:fatal', 1, () => {\n      this.logger.error('[ALERT] Fatal error occurred! Server may need restart.');\n      this.setState('FATAL_ERROR');\n    });\n    \n    // 工具执行错误过多时告警\n    globalErrorCollector.setThreshold('category:tool_execution', 10, () => {\n      this.logger.warn('[ALERT] Too many tool execution errors');\n    });\n  }\n  \n  /**\n   * 构建服务器能力声明\n   */\n  protected buildCapabilities() {\n    return {\n      tools: {},  // 始终声明支持工具\n      resources: {},  // 始终声明支持资源\n      prompts: {}  // 始终声明支持提示词\n    };\n  }\n  \n  /**\n   * 设置请求处理器\n   */\n  protected setupHandlers(): void {\n    // 工具列表请求\n    this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n      this.logger.debug('Handling list tools request');\n      return {\n        tools: Array.from(this.tools.values()).map(({ handler, ...tool }) => tool)\n      };\n    });\n    \n    // 工具调用请求\n    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      this.logger.debug(`Handling tool call: ${request.params.name}`);\n      return this.executeTool(request.params.name, request.params.arguments);\n    });\n    \n    // 资源列表请求\n    this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n      this.logger.debug('Handling list resources request');\n      return {\n        resources: Array.from(this.resources.values())\n      };\n    });\n    \n    // 读取资源请求\n    this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n      this.logger.debug(`Handling read resource: ${request.params.uri}`);\n      const resource = this.resources.get(request.params.uri);\n      if (!resource) {\n        throw new Error(`Resource not found: ${request.params.uri}`);\n      }\n      // 子类需要实现实际的资源读取逻辑\n      return this.readResource(resource);\n    });\n    \n    // 提示词列表请求\n    this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n      this.logger.debug('Handling list prompts request');\n      return {\n        prompts: Array.from(this.prompts.values())\n      };\n    });\n    \n    // 获取提示词请求\n    this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n      this.logger.debug(`Handling get prompt: ${request.params.name}`);\n      const prompt = this.prompts.get(request.params.name);\n      if (!prompt) {\n        throw new Error(`Prompt not found: ${request.params.name}`);\n      }\n      return { prompt };\n    });\n  }\n  \n  /**\n   * 子类需要实现的资源读取方法\n   */\n  protected abstract readResource(resource: Resource): Promise<any>;\n  \n  /**\n   * 子类需要实现的传输层连接方法\n   */\n  protected abstract connectTransport(): Promise<void>;\n  \n  /**\n   * 子类需要实现的传输层断开方法\n   */\n  protected abstract disconnectTransport(): Promise<void>;\n  \n  // ============ 生命周期管理 ============\n  \n  async start(options?: MCPServerOptions): Promise<void> {\n    if (this.state === 'RUNNING' || this.state === 'STARTING') {\n      throw new Error('Server is already running or starting');\n    }\n    \n    this.setState('STARTING');\n    this.logger.info('Starting MCP server...');\n    \n    try {\n      // 合并选项\n      if (options) {\n        this.options = { ...this.options, ...options };\n      }\n      \n      // 连接传输层\n      await this.connectTransport();\n      \n      // 记录启动时间\n      this.metrics.startTime = Date.now();\n      \n      this.setState('RUNNING');\n      this.logger.info('MCP server started successfully');\n    } catch (error) {\n      this.setState('ERROR');\n      this.lastError = error as Error;\n      this.logger.error('Failed to start server', error);\n      throw error;\n    }\n  }\n  \n  async stop(): Promise<void> {\n    if (this.state !== 'RUNNING') {\n      throw new Error(`Invalid state transition: cannot stop from ${this.state}`);\n    }\n    \n    this.setState('STOPPING');\n    this.logger.info('Stopping MCP server...');\n    \n    try {\n      // 等待所有活跃请求完成\n      await this.waitForActiveRequests();\n      \n      // 断开传输层\n      await this.disconnectTransport();\n      \n      // 清理会话\n      this.sessions.clear();\n      \n      this.setState('STOPPED');\n      this.logger.info('MCP server stopped');\n    } catch (error) {\n      this.setState('ERROR');\n      this.lastError = error as Error;\n      this.logger.error('Error stopping server', error);\n      throw error;\n    }\n  }\n  \n  async gracefulShutdown(timeoutMs: number): Promise<void> {\n    this.logger.info(`Graceful shutdown initiated with ${timeoutMs}ms timeout`);\n    \n    const shutdownPromise = this.stop();\n    const timeoutPromise = new Promise<void>((_, reject) => {\n      setTimeout(() => reject(new Error('Shutdown timeout')), timeoutMs);\n    });\n    \n    try {\n      await Promise.race([shutdownPromise, timeoutPromise]);\n    } catch (error) {\n      if ((error as Error).message === 'Shutdown timeout') {\n        this.logger.warn('Graceful shutdown timeout, forcing stop');\n        this.setState('STOPPED');\n      } else {\n        throw error;\n      }\n    }\n  }\n  \n  // 删除recover方法 - 错误就是错误,不要自动恢复\n  \n  isRunning(): boolean {\n    return this.state === 'RUNNING';\n  }\n  \n  getState(): ServerState {\n    return this.state;\n  }\n  \n  protected setState(newState: ServerState): void {\n    const oldState = this.state;\n    this.state = newState;\n    this.logger.info(`[STATE_CHANGE] ${oldState} -> ${newState}`);\n    \n    // 发出状态变化事件(如果有监听器)\n    if (oldState !== newState) {\n      this.logger.debug(`[STATE_DETAILS] Previous: ${oldState}, Current: ${newState}, Running: ${this.isRunning()}`);\n    }\n  }\n  \n  // ============ 工具管理 ============\n  \n  registerTool(tool: ToolWithHandler): void {\n    if (this.tools.has(tool.name)) {\n      throw new Error(`Tool ${tool.name} already registered`);\n    }\n    \n    this.tools.set(tool.name, tool);\n    this.logger.info(`Tool registered: ${tool.name}`);\n  }\n  \n  unregisterTool(name: string): void {\n    if (!this.tools.has(name)) {\n      this.logger.warn(`Tool ${name} not found for unregistration`);\n      return;\n    }\n    \n    this.tools.delete(name);\n    this.logger.info(`Tool unregistered: ${name}`);\n  }\n  \n  getTool(name: string): Tool | undefined {\n    const tool = this.tools.get(name);\n    if (tool) {\n      const { handler, ...toolDef } = tool;\n      return toolDef;\n    }\n    return undefined;\n  }\n  \n  listTools(): Tool[] {\n    return Array.from(this.tools.values()).map(({ handler, ...tool }) => tool);\n  }\n  \n  async executeTool(name: string, args: any): Promise<any> {\n    if (!this.isRunning()) {\n      this.logger.warn(`Attempted to execute tool '${name}' while server is not running`);\n      throw new Error('Server is not running');\n    }\n    \n    const tool = this.tools.get(name);\n    if (!tool) {\n      this.logger.error(`Tool not found: ${name}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`);\n      throw new Error(`Tool not found: ${name}`);\n    }\n    \n    const startTime = Date.now();\n    \n    this.logger.info(`[TOOL_EXEC_START] Tool: ${name}`);\n    this.logger.debug(`[TOOL_ARGS] ${name}:`, args);\n    \n    try {\n      const result = await tool.handler(args);\n      \n      const responseTime = Date.now() - startTime;\n      this.logger.info(`[TOOL_EXEC_SUCCESS] Tool: ${name}, Time: ${responseTime}ms`);\n      this.logger.debug(`[TOOL_RESULT] ${name}:`, result);\n      \n      return result;\n    } catch (error: any) {\n      // 直接失败,不重试,不计数,简单明了\n      this.logger.error(`[TOOL_EXEC_ERROR] Tool: ${name}`, error);\n      throw error;\n    }\n  }\n  \n  // ============ 资源管理 ============\n  \n  registerResource(resource: Resource): void {\n    if (this.resources.has(resource.uri)) {\n      throw new Error(`Resource ${resource.uri} already registered`);\n    }\n    \n    this.resources.set(resource.uri, resource);\n    this.logger.info(`Resource registered: ${resource.uri}`);\n  }\n  \n  unregisterResource(uri: string): void {\n    if (!this.resources.has(uri)) {\n      this.logger.warn(`Resource ${uri} not found for unregistration`);\n      return;\n    }\n    \n    this.resources.delete(uri);\n    this.logger.info(`Resource unregistered: ${uri}`);\n  }\n  \n  getResource(uri: string): Resource | undefined {\n    return this.resources.get(uri);\n  }\n  \n  listResources(): Resource[] {\n    return Array.from(this.resources.values());\n  }\n  \n  // ============ 提示词管理 ============\n  \n  registerPrompt(prompt: Prompt): void {\n    if (this.prompts.has(prompt.name)) {\n      throw new Error(`Prompt ${prompt.name} already registered`);\n    }\n    \n    this.prompts.set(prompt.name, prompt);\n    this.logger.info(`Prompt registered: ${prompt.name}`);\n  }\n  \n  unregisterPrompt(name: string): void {\n    if (!this.prompts.has(name)) {\n      this.logger.warn(`Prompt ${name} not found for unregistration`);\n      return;\n    }\n    \n    this.prompts.delete(name);\n    this.logger.info(`Prompt unregistered: ${name}`);\n  }\n  \n  getPrompt(name: string): Prompt | undefined {\n    return this.prompts.get(name);\n  }\n  \n  listPrompts(): Prompt[] {\n    return Array.from(this.prompts.values());\n  }\n  \n  // ============ 会话管理 ============\n  \n  async createSession(metadata?: Record<string, any>): Promise<SessionContext> {\n    const sessionId = this.generateSessionId();\n    const session: SessionContext = {\n      id: sessionId,\n      createdAt: Date.now(),\n      lastActivity: Date.now(),\n      metadata\n    };\n    \n    this.sessions.set(sessionId, session);\n    this.logger.info(`Session created: ${sessionId}`);\n    \n    // 会话清理\n    if (this.options.sessionTimeout) {\n      setTimeout(() => {\n        this.destroySession(sessionId);\n      }, this.options.sessionTimeout);\n    }\n    \n    return session;\n  }\n  \n  getSession(sessionId: string): SessionContext | undefined {\n    const session = this.sessions.get(sessionId);\n    if (session) {\n      session.lastActivity = Date.now();\n    }\n    return session;\n  }\n  \n  async destroySession(sessionId: string): Promise<void> {\n    if (!this.sessions.has(sessionId)) {\n      this.logger.warn(`Session ${sessionId} not found for destruction`);\n      return;\n    }\n    \n    this.sessions.delete(sessionId);\n    this.logger.info(`Session destroyed: ${sessionId}`);\n  }\n  \n  listSessions(): SessionContext[] {\n    return Array.from(this.sessions.values());\n  }\n  \n  // ============ 监控与可观测性 ============\n  \n  /**\n   * 获取错误统计报告\n   */\n  getErrorReport(): string {\n    return globalErrorCollector.exportReport();\n  }\n  \n  /**\n   * 获取错误统计\n   */\n  getErrorStats(): any {\n    return globalErrorCollector.getStats();\n  }\n  \n  async healthCheck(): Promise<HealthCheckResult> {\n    const memUsage = process.memoryUsage();\n    const memoryPercentage = (memUsage.heapUsed / memUsage.heapTotal) * 100;\n    \n    const health: HealthCheckResult = {\n      status: 'healthy',\n      timestamp: Date.now(),\n      checks: {\n        server: {\n          status: this.isRunning() ? 'up' : 'down',\n          message: `Server is ${this.state}`\n        },\n        resources: {\n          registered: this.tools.size + this.resources.size + this.prompts.size,\n          available: this.tools.size + this.resources.size + this.prompts.size\n        },\n        memory: {\n          used: memUsage.heapUsed,\n          limit: memUsage.heapTotal,\n          percentage: memoryPercentage\n        }\n      }\n    };\n    \n    // 判断健康状态\n    if (this.state === 'ERROR' || this.state === 'FATAL_ERROR') {\n      health.status = 'unhealthy';\n      health.errors = [this.lastError?.message || 'Unknown error'];\n    } else if (memoryPercentage > 80 || this.activeRequests > (this.options.maxConcurrentRequests || 100)) {\n      health.status = 'degraded';\n    }\n    \n    return health;\n  }\n  \n  getMetrics(): ServerMetrics {\n    this.metrics.memoryUsage = process.memoryUsage();\n    this.metrics.uptime = this.metrics.startTime ? Date.now() - this.metrics.startTime : 0;\n    this.metrics.activeConnections = this.sessions.size;\n    return { ...this.metrics };\n  }\n  \n  setLogger(logger: Logger): void {\n    this.logger = logger;\n  }\n  \n  // ============ 辅助方法 ============\n  \n  protected generateSessionId(): string {\n    return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n  }\n  \n  protected async waitForActiveRequests(): Promise<void> {\n    while (this.activeRequests > 0) {\n      this.logger.debug(`Waiting for ${this.activeRequests} active requests to complete`);\n      await new Promise(resolve => setTimeout(resolve, 100));\n    }\n  }\n  \n  protected updateAvgResponseTime(newTime: number): void {\n    const count = this.metrics.requestCount;\n    const currentAvg = this.metrics.avgResponseTime;\n    this.metrics.avgResponseTime = (currentAvg * (count - 1) + newTime) / count;\n  }\n}","/**\n * MCP错误类型系统\n * \n * 提供统一的错误分类和处理机制\n */\n\n/**\n * 错误严重程度\n */\nexport enum ErrorSeverity {\n  /** 可忽略的警告 */\n  WARNING = 'warning',\n  /** 需要人工干预的错误 */\n  CRITICAL = 'critical',\n  /** 致命错误,需要重启 */\n  FATAL = 'fatal'\n}\n\n/**\n * 错误类别\n */\nexport enum ErrorCategory {\n  /** 网络相关错误 */\n  NETWORK = 'network',\n  /** 协议错误(JSON-RPC等) */\n  PROTOCOL = 'protocol',\n  /** 工具执行错误 */\n  TOOL_EXECUTION = 'tool_execution',\n  /** 资源访问错误 */\n  RESOURCE_ACCESS = 'resource_access',\n  /** 会话管理错误 */\n  SESSION = 'session',\n  /** 传输层错误 */\n  TRANSPORT = 'transport',\n  /** 配置错误 */\n  CONFIGURATION = 'configuration',\n  /** 内部错误 */\n  INTERNAL = 'internal'\n}\n\n/**\n * MCP基础错误类\n */\nexport class MCPError extends Error {\n  /** 错误代码 */\n  public readonly code: string;\n  /** 错误严重程度 */\n  public readonly severity: ErrorSeverity;\n  /** 错误类别 */\n  public readonly category: ErrorCategory;\n  /** 错误上下文 */\n  public readonly context?: any;\n  /** 错误发生时间 */\n  public readonly timestamp: number;\n  /** 原始错误 */\n  public readonly cause?: Error;\n  \n  constructor(\n    message: string,\n    code: string,\n    severity: ErrorSeverity,\n    category: ErrorCategory,\n    options?: {\n      cause?: Error;\n      context?: any;\n    }\n  ) {\n    super(message);\n    this.name = 'MCPError';\n    this.code = code;\n    this.severity = severity;\n    this.category = category;\n    this.cause = options?.cause;\n    this.context = options?.context;\n    this.timestamp = Date.now();\n    \n    \n    // 保持原始堆栈信息\n    if (options?.cause && options.cause.stack) {\n      this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\n    }\n  }\n  \n  /**\n   * 转换为JSON-RPC错误格式\n   */\n  toJsonRpcError(): { code: number; message: string; data?: any } {\n    // 根据类别映射到JSON-RPC错误码\n    let jsonRpcCode: number;\n    \n    switch (this.category) {\n      case ErrorCategory.PROTOCOL:\n        jsonRpcCode = -32700; // Parse error\n        break;\n      case ErrorCategory.TOOL_EXECUTION:\n        jsonRpcCode = -32602; // Invalid params\n        break;\n      case ErrorCategory.RESOURCE_ACCESS:\n        jsonRpcCode = -32001; // Custom: Resource error\n        break;\n      case ErrorCategory.SESSION:\n        jsonRpcCode = -32002; // Custom: Session error\n        break;\n      case ErrorCategory.TRANSPORT:\n        jsonRpcCode = -32003; // Custom: Transport error\n        break;\n      default:\n        jsonRpcCode = -32603; // Internal error\n    }\n    \n    return {\n      code: jsonRpcCode,\n      message: this.message,\n      data: {\n        mcp_code: this.code,\n        category: this.category,\n        severity: this.severity,\n        context: this.context\n      }\n    };\n  }\n  \n}\n\n/**\n * 网络错误\n */\nexport class NetworkError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'NETWORK_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.NETWORK,\n      options\n    );\n    this.name = 'NetworkError';\n  }\n}\n\n/**\n * 协议错误\n */\nexport class ProtocolError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'PROTOCOL_ERROR',\n      ErrorSeverity.CRITICAL,\n      ErrorCategory.PROTOCOL,\n      { ...options, recoverable: false }\n    );\n    this.name = 'ProtocolError';\n  }\n}\n\n/**\n * 工具执行错误\n */\nexport class ToolExecutionError extends MCPError {\n  constructor(\n    toolName: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Tool '${toolName}' execution failed: ${message}`,\n      'TOOL_EXECUTION_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.TOOL_EXECUTION,\n      { ...options, context: { ...options?.context, toolName } }\n    );\n    this.name = 'ToolExecutionError';\n  }\n}\n\n/**\n * 资源访问错误\n */\nexport class ResourceAccessError extends MCPError {\n  constructor(\n    resourceUri: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Resource '${resourceUri}' access failed: ${message}`,\n      'RESOURCE_ACCESS_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.RESOURCE_ACCESS,\n      { ...options, context: { ...options?.context, resourceUri } }\n    );\n    this.name = 'ResourceAccessError';\n  }\n}\n\n/**\n * 会话错误\n */\nexport class SessionError extends MCPError {\n  constructor(\n    sessionId: string,\n    message: string,\n    options?: { cause?: Error; context?: any }\n  ) {\n    super(\n      `Session '${sessionId}' error: ${message}`,\n      'SESSION_ERROR',\n      ErrorSeverity.WARNING,\n      ErrorCategory.SESSION,\n      { ...options, context: { ...options?.context, sessionId } }\n    );\n    this.name = 'SessionError';\n  }\n}\n\n/**\n * 传输层错误\n */\nexport class TransportError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'TRANSPORT_ERROR',\n      ErrorSeverity.CRITICAL,\n      ErrorCategory.TRANSPORT,\n      options\n    );\n    this.name = 'TransportError';\n  }\n}\n\n/**\n * 配置错误\n */\nexport class ConfigurationError extends MCPError {\n  constructor(message: string, options?: { cause?: Error; context?: any }) {\n    super(\n      message,\n      'CONFIGURATION_ERROR',\n      ErrorSeverity.FATAL,\n      ErrorCategory.CONFIGURATION,\n      { ...options, recoverable: false }\n    );\n    this.name = 'ConfigurationError';\n  }\n}\n\n/**\n * 错误帮助函数\n */\nexport class ErrorHelper {\n  /**\n   * 判断错误是否可恢复\n   */\n  static isRecoverable(error: Error): boolean {\n    if (error instanceof MCPError) {\n      return error.recoverable;\n    }\n    \n    // 对于标准错误,根据类型判断\n    if (error.name === 'ECONNRESET' || error.name === 'ETIMEDOUT') {\n      return true;\n    }\n    \n    return false;\n  }\n  \n  /**\n   * 将普通错误包装为MCPError\n   */\n  static wrap(error: Error, category: ErrorCategory = ErrorCategory.INTERNAL): MCPError {\n    if (error instanceof MCPError) {\n      return error;\n    }\n    \n    return new MCPError(\n      error.message,\n      'WRAPPED_ERROR',\n      ErrorSeverity.WARNING,\n      category,\n      { cause: error }\n    );\n  }\n  \n  /**\n   * 创建错误上下文\n   */\n  static createContext(\n    method?: string,\n    params?: any,\n    sessionId?: string,\n    requestId?: string | number\n  ): any {\n    return {\n      method,\n      params,\n      sessionId,\n      requestId,\n      timestamp: Date.now()\n    };\n  }\n}","import { MCPError, ErrorSeverity, ErrorCategory } from '~/errors/MCPError.js';\nimport logger from '@promptx/logger';\n\n/**\n * 错误统计信息\n */\nexport interface ErrorStats {\n  /** 总错误数 */\n  totalErrors: number;\n  /** 按严重程度分类 */\n  bySeverity: Record<ErrorSeverity, number>;\n  /** 按类别分类 */\n  byCategory: Record<ErrorCategory, number>;\n  /** 按错误代码分类 */\n  byCode: Record<string, number>;\n  /** 最近错误 */\n  recentErrors: Array<{\n    timestamp: number;\n    code: string;\n    message: string;\n    severity: ErrorSeverity;\n    category: ErrorCategory;\n  }>;\n  /** 错误率(每分钟) */\n  errorRate: number;\n  /** 恢复成功率 */\n  recoveryRate: number;\n}\n\n/**\n * 错误收集器\n * \n * 收集、分析和报告错误信息\n */\nexport class ErrorCollector {\n  private errors: MCPError[] = [];\n  private maxErrors: number;\n  private windowSize: number; // 时间窗口(毫秒)\n  \n  // 错误阈值触发器\n  private thresholds: Map<string, { count: number; action: () => void }> = new Map();\n  \n  constructor(options: {\n    maxErrors?: number;\n    windowSize?: number;\n  } = {}) {\n    this.maxErrors = options.maxErrors || 1000;\n    this.windowSize = options.windowSize || 60000; // 默认1分钟\n    \n    // 定期清理旧错误\n    setInterval(() => this.cleanup(), this.windowSize);\n  }\n  \n  /**\n   * 收集错误\n   */\n  collect(error: Error): void {\n    const mcpError = error instanceof MCPError \n      ? error \n      : new MCPError(\n          error.message,\n          'UNKNOWN_ERROR',\n          ErrorSeverity.WARNING,\n          ErrorCategory.INTERNAL,\n          { cause: error }\n        );\n    \n    this.errors.push(mcpError);\n    \n    // 记录到日志\n    this.logError(mcpError);\n    \n    // 检查阈值\n    this.checkThresholds(mcpError);\n    \n    // 限制内存使用\n    if (this.errors.length > this.maxErrors) {\n      this.errors = this.errors.slice(-this.maxErrors);\n    }\n  }\n  \n  \n  /**\n   * 获取错误统计\n   */\n  getStats(): ErrorStats {\n    const now = Date.now();\n    const recentErrors = this.getRecentErrors();\n    \n    const stats: ErrorStats = {\n      totalErrors: recentErrors.length,\n      bySeverity: this.groupBySeverity(recentErrors),\n      byCategory: this.groupByCategory(recentErrors),\n      byCode: this.groupByCode(recentErrors),\n      recentErrors: recentErrors.slice(-10).map(e => ({\n        timestamp: e.timestamp,\n        code: e.code,\n        message: e.message,\n        severity: e.severity,\n        category: e.category\n      })),\n      errorRate: this.calculateErrorRate(recentErrors),\n    };\n    \n    return stats;\n  }\n  \n  /**\n   * 设置错误阈值触发器\n   */\n  setThreshold(\n    key: string,\n    count: number,\n    action: () => void\n  ): void {\n    this.thresholds.set(key, { count, action });\n  }\n  \n  /**\n   * 清除错误历史\n   */\n  clear(): void {\n    this.errors = [];\n  }\n  \n  /**\n   * 导出错误报告\n   */\n  exportReport(): string {\n    const stats = this.getStats();\n    const report = [\n      '=== Error Report ===',\n      `Time: ${new Date().toISOString()}`,\n      `Total Errors: ${stats.totalErrors}`,\n      `Error Rate: ${stats.errorRate.toFixed(2)} errors/min`,\n      `Recovery Rate: ${(stats.recoveryRate * 100).toFixed(2)}%`,\n      '',\n      '--- By Severity ---',\n      ...Object.entries(stats.bySeverity).map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- By Category ---',\n      ...Object.entries(stats.byCategory).map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- Top Error Codes ---',\n      ...Object.entries(stats.byCode)\n        .sort((a, b) => b[1] - a[1])\n        .slice(0, 5)\n        .map(([k, v]) => `${k}: ${v}`),\n      '',\n      '--- Recent Errors ---',\n      ...stats.recentErrors.map(e => \n        `[${new Date(e.timestamp).toISOString()}] ${e.severity} - ${e.code}: ${e.message}`\n      )\n    ];\n    \n    return report.join('\\n');\n  }\n  \n  // ============ 私有方法 ============\n  \n  private logError(error: MCPError): void {\n    const logMessage = `[ERROR_COLLECTED] ${error.code} - ${error.message}`;\n    const context = {\n      code: error.code,\n      severity: error.severity,\n      category: error.category,\n      recoverable: error.recoverable,\n      context: error.context\n    };\n    \n    switch (error.severity) {\n      case ErrorSeverity.WARNING:\n        logger.warn(logMessage, context);\n        break;\n      case ErrorSeverity.FATAL:\n        logger.error(`[FATAL] ${logMessage}`, context);\n        break;\n      default:\n        logger.error(logMessage, context);\n    }\n  }\n  \n  private checkThresholds(error: MCPError): void {\n    // 检查严重程度阈值\n    const severityKey = `severity:${error.severity}`;\n    const severityCount = this.getRecentErrors()\n      .filter(e => e.severity === error.severity).length;\n    \n    const severityThreshold = this.thresholds.get(severityKey);\n    if (severityThreshold && severityCount >= severityThreshold.count) {\n      logger.warn(`[THRESHOLD] ${severityKey} threshold reached: ${severityCount}`);\n      severityThreshold.action();\n    }\n    \n    // 检查类别阈值\n    const categoryKey = `category:${error.category}`;\n    const categoryCount = this.getRecentErrors()\n      .filter(e => e.category === error.category).length;\n    \n    const categoryThreshold = this.thresholds.get(categoryKey);\n    if (categoryThreshold && categoryCount >= categoryThreshold.count) {\n      logger.warn(`[THRESHOLD] ${categoryKey} threshold reached: ${categoryCount}`);\n      categoryThreshold.action();\n    }\n    \n    // 检查特定错误代码阈值\n    const codeKey = `code:${error.code}`;\n    const codeCount = this.getRecentErrors()\n      .filter(e => e.code === error.code).length;\n    \n    const codeThreshold = this.thresholds.get(codeKey);\n    if (codeThreshold && codeCount >= codeThreshold.count) {\n      logger.warn(`[THRESHOLD] ${codeKey} threshold reached: ${codeCount}`);\n      codeThreshold.action();\n    }\n  }\n  \n  private getRecentErrors(): MCPError[] {\n    const cutoff = Date.now() - this.windowSize;\n    return this.errors.filter(e => e.timestamp > cutoff);\n  }\n  \n  private cleanup(): void {\n    const before = this.errors.length;\n    this.errors = this.getRecentErrors();\n    const after = this.errors.length;\n    \n    if (before > after) {\n      logger.debug(`[ERROR_COLLECTOR] Cleaned up ${before - after} old errors`);\n    }\n  }\n  \n  private groupBySeverity(errors: MCPError[]): Record<ErrorSeverity, number> {\n    const result = {\n      [ErrorSeverity.WARNING]: 0,\n      [ErrorSeverity.CRITICAL]: 0,\n      [ErrorSeverity.FATAL]: 0\n    };\n    \n    for (const error of errors) {\n      result[error.severity]++;\n    }\n    \n    return result;\n  }\n  \n  private groupByCategory(errors: MCPError[]): Record<ErrorCategory, number> {\n    const result = {} as Record<ErrorCategory, number>;\n    \n    for (const category of Object.values(ErrorCategory)) {\n      result[category] = 0;\n    }\n    \n    for (const error of errors) {\n      result[error.category]++;\n    }\n    \n    return result;\n  }\n  \n  private groupByCode(errors: MCPError[]): Record<string, number> {\n    const result: Record<string, number> = {};\n    \n    for (const error of errors) {\n      result[error.code] = (result[error.code] || 0) + 1;\n    }\n    \n    return result;\n  }\n  \n  private calculateErrorRate(errors: MCPError[]): number {\n    if (errors.length === 0) return 0;\n    \n    // 计算每分钟错误率\n    const timeSpan = Math.min(\n      Date.now() - errors[0].timestamp,\n      this.windowSize\n    );\n    \n    const minutes = timeSpan / 60000;\n    return errors.length / Math.max(minutes, 1);\n  }\n}\n\n/**\n * 全局错误收集器实例\n */\nexport const globalErrorCollector = new ErrorCollector();","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type { Resource } from '@modelcontextprotocol/sdk/types.js';\nimport { BaseMCPServer } from '~/servers/BaseMCPServer.js';\nimport type { MCPServerOptions } from '~/interfaces/MCPServer.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * 标准输入输出MCP服务器实现\n * \n * 通过stdin/stdout进行JSON-RPC通信\n * 适用于命令行工具和进程间通信\n * \n * 使用 MCP SDK 的 StdioServerTransport 处理所有协议细节\n */\nexport class StdioMCPServer extends BaseMCPServer {\n  private transport?: StdioServerTransport;\n  \n  constructor(options: MCPServerOptions) {\n    super(options);\n  }\n  \n  /**\n   * 连接标准输入输出传输层\n   */\n  protected async connectTransport(): Promise<void> {\n    this.logger.info('Connecting stdio transport...');\n    \n    // 创建stdio传输 - SDK会处理所有stdin/stdout通信\n    this.transport = new StdioServerTransport();\n    \n    // 连接到MCP服务器 - SDK会自动处理initialize等协议消息\n    await this.server.connect(this.transport);\n    \n    this.logger.info('Stdio transport connected');\n  }\n  \n  /**\n   * 断开标准输入输出传输层\n   */\n  protected async disconnectTransport(): Promise<void> {\n    this.logger.info('Disconnecting stdio transport...');\n    \n    // 关闭传输\n    if (this.transport) {\n      await this.transport.close();\n      this.transport = undefined;\n    }\n    \n    this.logger.info('Stdio transport disconnected');\n  }\n  \n  /**\n   * 读取资源内容\n   * 实现文件系统资源读取\n   */\n  protected async readResource(resource: Resource): Promise<any> {\n    try {\n      // 解析URI\n      const uri = new URL(resource.uri);\n      \n      if (uri.protocol === 'file:') {\n        // 读取文件\n        const filePath = uri.pathname;\n        \n        // 安全检查:确保文件路径在允许的范围内\n        const resolvedPath = path.resolve(filePath);\n        \n        // 读取文件内容\n        const content = await fs.readFile(resolvedPath, 'utf-8');\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else {\n        throw new Error(`Unsupported resource protocol: ${uri.protocol}`);\n      }\n    } catch (error: any) {\n      this.logger.error(`Failed to read resource: ${resource.uri}`, error);\n      throw new Error(`Failed to read resource: ${error.message}`);\n    }\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async start(options?: MCPServerOptions): Promise<void> {\n    await super.start(options);\n    \n    // 输出启动信息到stderr(不干扰stdout的JSON-RPC通信)\n    this.logger.info(`STDIO Server Ready`);\n    this.logger.info('Listening for JSON-RPC messages on stdin');\n  }\n}","import express, { Express, Request, Response } from 'express';\nimport { Server as HttpServer } from 'http';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { \n  InitializeRequestSchema,\n  LoggingMessageNotification,\n  JSONRPCNotification,\n  JSONRPCError,\n  Notification,\n  ListToolsRequestSchema,\n  CallToolRequestSchema,\n  ListResourcesRequestSchema,\n  ListPromptsRequestSchema,\n  GetPromptRequestSchema,\n  ReadResourceRequestSchema\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Resource, Tool, Prompt } from '@modelcontextprotocol/sdk/types.js';\nimport { BaseMCPServer } from '~/servers/BaseMCPServer.js';\nimport type { MCPServerOptions, ToolWithHandler } from '~/interfaces/MCPServer.js';\nimport { WorkerpoolAdapter } from '~/workers/index.js';\nimport type { ToolWorkerPool } from '~/interfaces/ToolWorkerPool.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { randomUUID } from 'crypto';\nimport packageJson from '../../package.json' assert { type: 'json' };\n\nconst SESSION_ID_HEADER_NAME = \"mcp-session-id\";\n\n/**\n * HTTP流式MCP服务器实现\n * \n * 使用 MCP SDK 的 StreamableHTTPServerTransport 处理所有协议细节\n * 支持HTTP JSON-RPC和SSE(Server-Sent Events)\n */\nexport class StreamableHttpMCPServer extends BaseMCPServer {\n  private app?: Express;\n  private httpServer?: HttpServer;\n  private port: number;\n  private host: string;\n  private corsEnabled: boolean;\n  private workerPool: ToolWorkerPool;\n  \n  // 支持多个并发连接 - 每个session独立的Server和Transport实例\n  private servers: Map<string, Server> = new Map();\n  private transports: Map<string, StreamableHTTPServerTransport> = new Map();\n  \n  constructor(options: MCPServerOptions & {\n    port?: number;\n    host?: string;\n    corsEnabled?: boolean;\n  }) {\n    super(options);\n    this.port = options.port || 8080;\n    this.host = options.host || '127.0.0.1';  // 使用 IPv4 避免 IPv6 问题\n    this.corsEnabled = options.corsEnabled || false;\n    \n    // 初始化 worker pool\n    this.workerPool = new WorkerpoolAdapter({\n      minWorkers: 2,\n      maxWorkers: 4,\n      workerTimeout: 30000\n    });\n  }\n  \n  /**\n   * 连接HTTP传输层\n   */\n  protected async connectTransport(): Promise<void> {\n    this.logger.info('Starting HTTP server...');\n    \n    // 初始化 worker pool\n    await this.workerPool.initialize();\n    this.logger.info('Worker pool initialized');\n    \n    // 创建Express应用\n    this.app = express();\n    \n    // 设置Express应用 - 完全仿照官方\n    this.setupExpress();\n    \n    // 启动HTTP服务器\n    await new Promise<void>((resolve, reject) => {\n      this.httpServer = this.app!.listen(this.port, this.host, () => {\n        this.logger.info(`HTTP server listening on http://${this.host}:${this.port}/mcp`);\n        resolve();\n      });\n      \n      this.httpServer.on('error', reject);\n    });\n  }\n  \n  /**\n   * 获取或创建session对应的Server实例\n   * \n   * 形式化规约:\n   * 前置条件:sessionId ≠ null ∧ sessionId ≠ \"\"\n   * 后置条件:返回的Server是sessionId唯一对应的\n   * 不变式:servers.get(sessionId) 存在 ⟺ transports.get(sessionId) 存在\n   */\n  private getOrCreateServer(sessionId: string): Server {\n    // 断言:sessionId必须有效\n    if (!sessionId) {\n      throw new Error('SessionId cannot be null or empty');\n    }\n    \n    // 如果已存在,直接返回\n    if (this.servers.has(sessionId)) {\n      return this.servers.get(sessionId)!;\n    }\n    \n    // 创建新的Server实例(注意:不监听端口)\n    const server = new Server(\n      {\n        name: this.options.name,\n        version: this.options.version\n      },\n      {\n        capabilities: {\n          tools: {},\n          resources: {},\n          prompts: {}\n        }\n      }\n    );\n    \n    // 为这个Server注册处理器(独立副本)\n    this.setupServerHandlers(server);\n    \n    // 保存Server实例\n    this.servers.set(sessionId, server);\n    this.logger.info(`Created new Server instance for session: ${sessionId}`);\n    \n    return server;\n  }\n  \n  /**\n   * 为Server实例设置请求处理器\n   * 注意:这些处理器是每个Server独立的\n   */\n  private setupServerHandlers(server: Server): void {\n    // 工具列表请求\n    server.setRequestHandler(ListToolsRequestSchema, async () => {\n      this.logger.debug('Handling list tools request');\n      return {\n        tools: Array.from(this.tools.values()).map(({ handler, ...tool }) => tool)\n      };\n    });\n    \n    // 工具调用请求\n    server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      this.logger.debug(`Handling tool call: ${request.params.name}`);\n      return this.executeTool(request.params.name, request.params.arguments);\n    });\n    \n    // 资源列表请求\n    server.setRequestHandler(ListResourcesRequestSchema, async () => {\n      this.logger.debug('Handling list resources request');\n      return {\n        resources: Array.from(this.resources.values())\n      };\n    });\n    \n    // 读取资源请求\n    server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n      this.logger.debug(`Handling read resource: ${request.params.uri}`);\n      const resource = this.resources.get(request.params.uri);\n      if (!resource) {\n        throw new Error(`Resource not found: ${request.params.uri}`);\n      }\n      return this.readResource(resource);\n    });\n    \n    // 提示词列表请求\n    server.setRequestHandler(ListPromptsRequestSchema, async () => {\n      this.logger.debug('Handling list prompts request');\n      return {\n        prompts: Array.from(this.prompts.values())\n      };\n    });\n    \n    // 获取提示词请求\n    server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n      this.logger.debug(`Handling get prompt: ${request.params.name}`);\n      const prompt = this.prompts.get(request.params.name);\n      if (!prompt) {\n        throw new Error(`Prompt not found: ${request.params.name}`);\n      }\n      return { prompt };\n    });\n  }\n  \n  /**\n   * 设置中间件和路由 - 完全仿照官方实现\n   */\n  private setupExpress(): void {\n    if (!this.app) return;\n    \n    // 仿照官方:只有基础的 JSON 解析\n    this.app.use(express.json());\n    \n    // 仿照官方:使用 Router\n    const router = express.Router();\n    \n    // 健康检查端点 - 在其他路由之前定义\n    router.get('/health', (req, res) => {\n      this.handleHealthCheck(req, res);\n    });\n    \n    // 仿照官方:路由定义\n    router.post('/mcp', async (req, res) => {\n      await this.handlePostRequest(req, res);\n    });\n    \n    router.get('/mcp', async (req, res) => {\n      await this.handleGetRequest(req, res);\n    });\n    \n    // 仿照官方:挂载路由\n    this.app.use('/', router);\n  }\n  \n  /**\n   * 处理健康检查请求\n   * \n   * 形式化保证:\n   * - 无副作用(幂等性)\n   * - O(1)时间复杂度\n   * - 始终返回有效JSON\n   */\n  private handleHealthCheck(req: Request, res: Response): void {\n    const healthStatus = {\n      status: 'ok',\n      timestamp: new Date().toISOString(),\n      service: 'mcp-server',\n      uptime: process.uptime(),\n      version: this.getVersion(),\n      transport: 'http',\n      sessions: this.servers.size,  // 显示当前活跃的session数量\n      servers: this.servers.size,   // 独立Server实例数量\n      transports: this.transports.size  // Transport实例数量\n    };\n    \n    res.status(200).json(healthStatus);\n  }\n  \n  /**\n   * 获取服务版本信息\n   */\n  private getVersion(): string {\n    return packageJson.version || 'unknown';\n  }\n  \n  /**\n   * 处理 GET 请求(SSE)\n   * 使用独立的Server实例处理SSE连接\n   */\n  private async handleGetRequest(req: Request, res: Response): Promise<void> {\n    const sessionId = req.headers[SESSION_ID_HEADER_NAME] as string | undefined;\n    \n    if (!sessionId) {\n      res.status(400).json(\n        this.createErrorResponse('Bad Request: session ID required for SSE.')\n      );\n      return;\n    }\n    \n    // 确保session存在(获取或创建Server和Transport)\n    if (!this.transports.has(sessionId)) {\n      this.logger.info(`Session ${sessionId} not found for SSE, creating...`);\n      \n      // 获取或创建Server\n      const server = this.getOrCreateServer(sessionId);\n      \n      // 创建Transport\n      const transport = new StreamableHTTPServerTransport({\n        sessionIdGenerator: () => sessionId\n      });\n      \n      // 连接\n      await server.connect(transport);\n      this.transports.set(sessionId, transport);\n    }\n    \n    this.logger.info(`Establishing SSE stream for session ${sessionId}`);\n    \n    // 设置 SSE 必需的响应头\n    res.setHeader('Content-Type', 'text/event-stream');\n    res.setHeader('Cache-Control', 'no-cache');\n    res.setHeader('Connection', 'keep-alive');\n    res.setHeader('X-Accel-Buffering', 'no'); // 禁用 Nginx 缓冲\n    \n    // 启动心跳机制 - 每 20 秒发送一次\n    const heartbeatInterval = setInterval(() => {\n      try {\n        // SSE 心跳格式:注释行\n        res.write(':heartbeat\\n\\n');\n        this.logger.info(`Sent SSE heartbeat for session ${sessionId}`);\n      } catch (error) {\n        this.logger.error(`Failed to send heartbeat for session ${sessionId}: ${error}`);\n        clearInterval(heartbeatInterval);\n      }\n    }, 20000); // 20 秒间隔\n    \n    // 监听连接关闭事件\n    req.on('close', () => {\n      this.logger.info(`SSE connection closed for session ${sessionId}`);\n      clearInterval(heartbeatInterval);\n      // 注意:暂时不清理session,因为客户端可能重连\n    });\n    \n    const transport = this.transports.get(sessionId)!;\n    await transport.handleRequest(req, res);\n    await this.streamMessages(transport);\n    \n    return;\n  }\n  \n  /**\n   * 发送 SSE 流消息 - 完全复制官方实现\n   */\n  private async streamMessages(transport: StreamableHTTPServerTransport): Promise<void> {\n    try {\n      // 基于 LoggingMessageNotificationSchema 触发客户端的 setNotificationHandler\n      const message = {\n        method: 'notifications/message',\n        params: { level: 'info', data: 'SSE Connection established' }\n      };\n      \n      this.sendNotification(transport, message);\n      \n      let messageCount = 0;\n      \n      const interval = setInterval(async () => {\n        messageCount++;\n        \n        const data = `Message ${messageCount} at ${new Date().toISOString()}`;\n        \n        const message = {\n          method: 'notifications/message',\n          params: { level: 'info', data: data }\n        };\n        \n        try {\n          this.sendNotification(transport, message);\n          \n          if (messageCount === 2) {\n            clearInterval(interval);\n            \n            const message = {\n              method: 'notifications/message',\n              params: { level: 'info', data: 'Streaming complete!' }\n            };\n            \n            this.sendNotification(transport, message);\n          }\n        } catch (error) {\n          this.logger.error(`Error sending message: ${error}`);\n          clearInterval(interval);\n        }\n      }, 1000);\n    } catch (error) {\n      this.logger.error(`Error sending message: ${error}`);\n    }\n  }\n  \n  /**\n   * 发送通知 - 完全复制官方实现\n   */\n  private async sendNotification(\n    transport: StreamableHTTPServerTransport,\n    notification: any\n  ): Promise<void> {\n    const rpcNotification = {\n      ...notification,\n      jsonrpc: '2.0'\n    };\n    await transport.send(rpcNotification);\n  }\n  \n  /**\n   * 处理 POST 请求(JSON-RPC)\n   * 使用独立的Server实例处理每个session\n   */\n  private async handlePostRequest(req: Request, res: Response): Promise<void> {\n    const sessionId = req.headers[SESSION_ID_HEADER_NAME] as string | undefined;\n    \n    this.logger.info('=== POST Request ===');\n    this.logger.info(`Headers: ${JSON.stringify(req.headers, null, 2)}`);\n    this.logger.info(`Body: ${JSON.stringify(req.body, null, 2)}`);\n    this.logger.info(`Session ID: ${sessionId}`);\n    \n    try {\n      // 处理已有session的请求\n      if (sessionId && this.transports.has(sessionId)) {\n        this.logger.info(`Reusing existing Server and Transport for session: ${sessionId}`);\n        const transport = this.transports.get(sessionId)!;\n        await transport.handleRequest(req, res, req.body);\n        return;\n      }\n      \n      // 处理initialize请求(创建新session)\n      if (!sessionId && this.isInitializeRequest(req.body)) {\n        this.logger.info('Creating new session for initialize request');\n        \n        // 生成新的session ID\n        const newSessionId = randomUUID();\n        \n        // 获取或创建该session的Server\n        const server = this.getOrCreateServer(newSessionId);\n        \n        // 创建新的Transport\n        const transport = new StreamableHTTPServerTransport({\n          sessionIdGenerator: () => newSessionId\n        });\n        \n        // 连接Server和Transport\n        await server.connect(transport);\n        \n        // 保存Transport(Server已在getOrCreateServer中保存)\n        this.transports.set(newSessionId, transport);\n        \n        // 处理请求\n        await transport.handleRequest(req, res, req.body);\n        \n        this.logger.info(`New session created: ${newSessionId}`);\n        return;\n      }\n      \n      // 处理带session ID但Transport不存在的情况(可能是服务器重启)\n      if (sessionId && !this.transports.has(sessionId)) {\n        this.logger.info(`Session ${sessionId} not found, recreating...`);\n        \n        // 获取或创建Server\n        const server = this.getOrCreateServer(sessionId);\n        \n        // 创建新的Transport\n        const transport = new StreamableHTTPServerTransport({\n          sessionIdGenerator: () => sessionId\n        });\n        \n        // 连接\n        await server.connect(transport);\n        this.transports.set(sessionId, transport);\n        \n        // 处理请求\n        await transport.handleRequest(req, res, req.body);\n        return;\n      }\n      \n      // 无效请求\n      this.logger.info('Invalid request - no session ID and not initialize request');\n      this.logger.info(`isInitializeRequest result: ${this.isInitializeRequest(req.body)}`);\n      res.status(400).json({\n        jsonrpc: '2.0',\n        error: {\n          code: -32000,\n          message: 'Bad Request: invalid session ID or method.'\n        },\n        id: randomUUID()\n      });\n      \n    } catch (error) {\n      this.logger.error(`Error handling MCP request: ${error}`);\n      res.status(500).json({\n        jsonrpc: '2.0',\n        error: {\n          code: -32603,\n          message: 'Internal server error.'\n        },\n        id: randomUUID()\n      });\n    }\n  }\n  \n  /**\n   * 检查是否是 initialize 请求 - 完全复制官方实现\n   */\n  private isInitializeRequest(body: any): boolean {\n    const isInitial = (data: any) => {\n      const result = InitializeRequestSchema.safeParse(data);\n      return result.success;\n    };\n    if (Array.isArray(body)) {\n      return body.some((request) => isInitial(request));\n    }\n    return isInitial(body);\n  }\n  \n  /**\n   * 创建错误响应 - 完全复制官方实现\n   */\n  private createErrorResponse(message: string): any {\n    return {\n      jsonrpc: '2.0',\n      error: {\n        code: -32000,\n        message: message\n      },\n      id: randomUUID()\n    };\n  }\n  \n  /**\n   * 断开HTTP传输层\n   */\n  protected async disconnectTransport(): Promise<void> {\n    this.logger.info('Stopping HTTP server...');\n    \n    // 关闭所有 transports 和 servers\n    for (const [sessionId, transport] of this.transports.entries()) {\n      this.logger.info(`Closing transport for session: ${sessionId}`);\n      await transport.close();\n    }\n    \n    // 清理所有servers(不需要显式关闭,因为它们不监听端口)\n    this.servers.clear();\n    this.transports.clear();\n    \n    // 关闭HTTP服务器\n    if (this.httpServer) {\n      await new Promise<void>((resolve) => {\n        this.httpServer!.close(() => {\n          this.logger.info('HTTP server stopped');\n          resolve();\n        });\n      });\n      \n      this.httpServer = undefined;\n    }\n    \n    // 终止 worker pool\n    await this.workerPool.terminate();\n    this.logger.info('Worker pool terminated');\n    \n    this.app = undefined;\n  }\n  \n  /**\n   * 清理特定session的资源\n   * 可以在session超时或客户端断开时调用\n   */\n  private async cleanupSession(sessionId: string): Promise<void> {\n    this.logger.info(`Cleaning up session: ${sessionId}`);\n    \n    // 关闭Transport\n    const transport = this.transports.get(sessionId);\n    if (transport) {\n      await transport.close();\n      this.transports.delete(sessionId);\n    }\n    \n    // 移除Server(垃圾回收会处理)\n    this.servers.delete(sessionId);\n    \n    this.logger.info(`Session cleaned up: ${sessionId}`);\n  }\n  \n  /**\n   * 读取资源内容\n   */\n  protected async readResource(resource: Resource): Promise<any> {\n    try {\n      const uri = new URL(resource.uri);\n      \n      if (uri.protocol === 'file:') {\n        const filePath = uri.pathname;\n        const resolvedPath = path.resolve(filePath);\n        const content = await fs.readFile(resolvedPath, 'utf-8');\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else if (uri.protocol === 'http:' || uri.protocol === 'https:') {\n        // 支持HTTP资源\n        const response = await fetch(resource.uri);\n        const content = await response.text();\n        \n        return {\n          contents: [\n            {\n              uri: resource.uri,\n              mimeType: resource.mimeType || response.headers.get('content-type') || 'text/plain',\n              text: content\n            }\n          ]\n        };\n      } else {\n        throw new Error(`Unsupported resource protocol: ${uri.protocol}`);\n      }\n    } catch (error: any) {\n      this.logger.error(`Failed to read resource: ${resource.uri} - ${error}`);\n      throw new Error(`Failed to read resource: ${error.message}`);\n    }\n  }\n  \n  /**\n   * 重写 executeTool 方法,使用 WorkerPool 执行所有工具\n   */\n  async executeTool(name: string, args: any): Promise<any> {\n    if (!this.isRunning()) {\n      this.logger.warn(`Attempted to execute tool '${name}' while server is not running`);\n      throw new Error('Server is not running');\n    }\n    \n    const tool = this.tools.get(name);\n    if (!tool) {\n      this.logger.error(`Tool not found: ${name}. Available tools: ${Array.from(this.tools.keys()).join(', ')}`);\n      throw new Error(`Tool not found: ${name}`);\n    }\n    \n    const startTime = Date.now();\n    \n    this.logger.info(`[TOOL_EXEC_START] Tool: ${name} (via WorkerPool)`);\n    this.logger.debug(`[TOOL_ARGS] ${name}: ${JSON.stringify(args)}`);\n    \n    try {\n      // 所有工具都通过 WorkerPool 执行\n      const result = await this.workerPool.execute(tool, args);\n      \n      const responseTime = Date.now() - startTime;\n      this.logger.info(`[TOOL_EXEC_SUCCESS] Tool: ${name}, Time: ${responseTime}ms`);\n      \n      // 更新指标\n      this.metrics.requestCount++;\n      this.metrics.avgResponseTime = \n        (this.metrics.avgResponseTime * (this.metrics.requestCount - 1) + responseTime) / \n        this.metrics.requestCount;\n      \n      return result;\n      \n    } catch (error: any) {\n      const responseTime = Date.now() - startTime;\n      this.logger.error(`[TOOL_EXEC_ERROR] Tool: ${name}, Time: ${responseTime}ms, Error: ${error.message}`);\n      \n      // 更新错误计数\n      this.metrics.errorCount++;\n      this.lastError = error;\n      \n      // 重新抛出错误\n      throw error;\n    }\n  }\n}","import * as workerpool from 'workerpool';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { \n  ToolWorkerPool, \n  PoolStats, \n  ToolWorkerPoolOptions \n} from '../interfaces/ToolWorkerPool';\nimport { ToolWithHandler } from '../interfaces/MCPServer';\nimport logger from '@promptx/logger';\n\n/**\n * 基于 workerpool 的 ToolWorkerPool 实现\n */\nexport class WorkerpoolAdapter implements ToolWorkerPool {\n  private pool: workerpool.Pool | null = null;\n  private options: Required<ToolWorkerPoolOptions>;\n  \n  constructor(options: ToolWorkerPoolOptions = {}) {\n    this.options = {\n      minWorkers: options.minWorkers ?? 2,\n      maxWorkers: options.maxWorkers ?? 4,\n      workerTimeout: options.workerTimeout ?? 30000,\n    };\n  }\n  \n  /**\n   * 初始化 worker pool\n   */\n  async initialize(): Promise<void> {\n    if (this.pool) {\n      logger.warn('WorkerpoolAdapter: Pool already initialized');\n      return;\n    }\n    \n    // tsup 会把 worker.ts 编译到 dist/worker.js\n    // WorkerpoolAdapter 会在某个 chunk 文件中,所以用相对路径找 worker.js\n    const workerPath = fileURLToPath(new URL('./worker.js', import.meta.url));\n    \n    this.pool = workerpool.pool(workerPath, {\n      minWorkers: this.options.minWorkers,\n      maxWorkers: this.options.maxWorkers,\n      workerType: 'process', // 使用进程而非线程\n      workerTerminateTimeout: 5000,\n      forkOpts: {\n        env: process.env,\n        cwd: process.cwd(),\n      }\n    });\n    \n    logger.info(`WorkerpoolAdapter initialized: ${this.options.minWorkers}-${this.options.maxWorkers} workers`);\n  }\n  \n  /**\n   * 执行工具\n   */\n  async execute<T = any>(tool: ToolWithHandler, args: any): Promise<T> {\n    if (!this.pool) {\n      throw new Error('WorkerpoolAdapter: Pool not initialized. Call initialize() first.');\n    }\n    \n    try {\n      logger.debug(`Executing tool '${tool.name}' in worker pool`);\n      \n      // 准备执行数据(只传递工具名和参数)\n      const taskData = {\n        toolName: tool.name,\n        args\n      };\n      \n      // 在 worker 中执行\n      const result = await this.pool.exec('executeTool', [taskData]);\n      \n      logger.debug(`Tool '${tool.name}' execution completed`);\n      return result as T;\n      \n    } catch (error: any) {\n      logger.error(`Tool '${tool.name}' execution failed: ${error.message}`);\n      \n      // 处理超时错误\n      if (error.message?.includes('timeout')) {\n        throw new Error(`Tool '${tool.name}' execution timeout after ${this.options.workerTimeout}ms`);\n      }\n      \n      // 重新抛出其他错误\n      throw error;\n    }\n  }\n  \n  /**\n   * 获取 pool 状态\n   */\n  getStats(): PoolStats {\n    if (!this.pool) {\n      return {\n        active: 0,\n        pending: 0,\n        available: 0,\n        total: 0\n      };\n    }\n    \n    const stats = this.pool.stats();\n    return {\n      active: stats.activeTasks,\n      pending: stats.pendingTasks,\n      available: stats.idleWorkers,\n      total: stats.totalWorkers\n    };\n  }\n  \n  /**\n   * 终止 pool\n   */\n  async terminate(): Promise<void> {\n    if (!this.pool) {\n      logger.warn('WorkerpoolAdapter: No pool to terminate');\n      return;\n    }\n    \n    logger.info('Terminating worker pool...');\n    await this.pool.terminate();\n    this.pool = null;\n    logger.info('Worker pool terminated');\n  }\n  \n  /**\n   * 判断工具是否需要使用 worker pool\n   */\n  static shouldUsePool(toolName: string): boolean {\n    // 需要隔离执行的工具列表\n    const isolatedTools = [\n      'toolx',           // 主要目标\n      'build',           // 构建任务\n      'test',            // 测试任务\n      'compile',         // 编译任务\n      'heavy-compute'    // 计算密集型任务\n    ];\n    \n    return isolatedTools.includes(toolName);\n  }\n}","/**\n * PromptXMCPServer - PromptX 专用的 MCP 服务器\n * \n * 集成了所有 PromptX 工具,提供统一的启动接口\n * 支持 stdio 和 http 两种传输模式\n */\n\nimport { StdioMCPServer } from './StdioMCPServer.js';\nimport { StreamableHttpMCPServer } from './StreamableHttpMCPServer.js';\nimport { allTools } from '../tools/index.js';\nimport type { MCPServer } from '../interfaces/MCPServer.js';\nimport logger from '@promptx/logger';\n\nexport interface PromptXServerOptions {\n  // 基础选项\n  transport: 'stdio' | 'http';\n  name?: string;\n  version?: string;\n  \n  // HTTP 特定选项\n  port?: number;\n  host?: string;\n  corsEnabled?: boolean;\n  cors?: boolean; // 别名兼容\n  \n  // PromptX 特定选项\n  workingDirectory?: string;  // 工作目录\n  ideType?: string;           // IDE 类型(cursor, vscode, claude 等)\n  debug?: boolean;            // 调试模式\n}\n\nexport class PromptXMCPServer {\n  private server: MCPServer;\n  private options: PromptXServerOptions;\n  \n  constructor(options: PromptXServerOptions) {\n    this.options = options;\n    \n    // 处理别名\n    if (options.cors !== undefined && options.corsEnabled === undefined) {\n      options.corsEnabled = options.cors;\n    }\n    \n    // 根据 transport 创建对应的服务器\n    if (options.transport === 'stdio') {\n      this.server = new StdioMCPServer({\n        name: options.name || 'promptx-mcp-server',\n        version: options.version || process.env.npm_package_version || '1.0.0'\n      });\n    } else {\n      this.server = new StreamableHttpMCPServer({\n        name: options.name || 'promptx-mcp-server',\n        version: options.version || process.env.npm_package_version || '1.0.0',\n        port: options.port || 5203,\n        host: options.host || 'localhost',\n        corsEnabled: options.corsEnabled || false\n      });\n    }\n    \n    // 自动注册 PromptX 工具\n    this.registerTools();\n  }\n  \n  /**\n   * 注册所有 PromptX 工具\n   */\n  private registerTools(): void {\n    // 注册标准工具集\n    allTools.forEach(tool => {\n      this.server.registerTool(tool);\n      logger.debug(`Registered tool: ${tool.name}`);\n    });\n    \n    logger.info(`Registered ${allTools.length} PromptX tools`);\n    \n    // 未来可以在这里加载:\n    // 1. 项目特定工具(基于 workingDirectory)\n    // 2. IDE 特定工具(基于 ideType)\n    // 3. 用户自定义工具\n  }\n  \n  /**\n   * 启动服务器\n   */\n  async start(): Promise<void> {\n    await this.server.start();\n  }\n  \n  /**\n   * 停止服务器\n   */\n  async stop(): Promise<void> {\n    await this.server.stop();\n  }\n  \n  /**\n   * 优雅关闭\n   */\n  async gracefulShutdown(timeoutMs?: number): Promise<void> {\n    await this.server.gracefulShutdown(timeoutMs || 5000);\n  }\n  \n  /**\n   * 获取内部服务器实例(用于高级操作)\n   */\n  getServer(): MCPServer {\n    return this.server;\n  }\n  \n  // ========== 静态方法 ==========\n  \n  /**\n   * 统一启动方法(向后兼容 MCPServerManager.launch)\n   * \n   * 这个方法会:\n   * 1. 创建并启动服务器\n   * 2. 设置信号处理\n   * 3. 保持进程存活(stdio 模式)\n   */\n  static async launch(options: PromptXServerOptions): Promise<PromptXMCPServer> {\n    // 设置环境变量,通知 logger 当前的传输模式\n    process.env.MCP_TRANSPORT = options.transport;\n\n    // MCP STDIO模式最佳实践:劫持console防止stdout污染\n    if (options.transport === 'stdio') {\n      // 将所有console输出重定向到stderr,遵循MCP官方最佳实践\n      // 参考:https://modelcontextprotocol.io/quickstart/server\n      const originalLog = console.log;\n      console.log = console.error;  // 重定向到stderr\n      console.info = console.error;\n      console.debug = console.error;\n      console.warn = console.error;\n      // 保留原始方法以备需要\n      (console as any)._originalLog = originalLog;\n    }\n\n    const server = new PromptXMCPServer(options);\n\n    // 设置信号处理\n    const shutdown = async (signal: string) => {\n      logger.info(`\\nReceived ${signal}, shutting down gracefully...`);\n      try {\n        await server.gracefulShutdown(5000);\n        logger.info('Server stopped cleanly');\n        process.exit(0);\n      } catch (error) {\n        logger.error('Error during shutdown:', error);\n        process.exit(1);\n      }\n    };\n    \n    process.on('SIGINT', () => shutdown('SIGINT'));\n    process.on('SIGTERM', () => shutdown('SIGTERM'));\n    \n    // 启动服务器\n    await server.start();\n    \n    // 显示启动信息\n    if (options.transport === 'http') {\n      const port = options.port || 5203;\n      const host = options.host || '127.0.0.1';\n      logger.info(`HTTP Server Ready at http://${host}:${port}`);\n      logger.info('Use MCP-Session-Id header for session management');\n    } else {\n      logger.info('STDIO Server Ready');\n      logger.info('Listening for JSON-RPC messages on stdin');\n    }\n    \n    // 保持进程存活(对于 stdio 模式,防止进程退出)\n    if (options.transport === 'stdio') {\n      await new Promise(() => {}); // 永远等待\n    }\n    \n    return server;\n  }\n}\n\n// 导出向后兼容的别名\nexport { PromptXMCPServer as MCPServerManager };\nexport default PromptXMCPServer;"],"mappings":"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","names":["logger","ErrorCategory","logger","resolve","Server","ListToolsRequestSchema","CallToolRequestSchema","ListResourcesRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","ReadResourceRequestSchema","logger","fs","path","resolve","Server","ListToolsRequestSchema","CallToolRequestSchema","ListResourcesRequestSchema","ReadResourceRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","transport","message","logger"]}
Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.0 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.0 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.9 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumNS-003Network SuspiciousMedium ConfidenceLine 0

JavaScript fetch() call

Detected by automated pattern matching (rule NS-003) with medium confidence. May be a false positive.

    1241:         };
    1242:       } else if (uri.protocol === "http:" || uri.protocol === "https:") {
>>> 1243:         const response = await fetch(resource.uri);
    1244:         const content = await response.text();
    1245:         return {
Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive

Scan History

DateRiskFindings
Feb 25, 2026critical59
Feb 23, 2026critical59
Feb 22, 2026critical59