@promptx/mcp-server
v1.28.3MCP Server implementation for PromptX
59
Total
5
Critical
44
High
10
Medium
Findings
unknownEnvironment 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 positiveEnvironment 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 positiveEnvironment 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 positiveEnvironment 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 positiveEnvironment 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 positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��?���z�?>�&��������
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDynamic 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 positiveDecoded base64 content: �����뢻?0#Į�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ����ǫ����+ky��nW���L�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��n�J뢴��!�Wl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��n�J뢴��!�Wl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .� �xz���h�'�q�b�t���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �+ky��nW���L�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: >�&���z�ެ�m���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: >�&���z�ެ�m���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: >�&���z�ެ�m���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: >�&���z�ެ�m���
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ���'$�֫�����
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDynamic 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 positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��n�J뢴��!�Wl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: ��n�J뢴��!�Wl
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: .+->�&��z���Ԝ��
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: �ZjQ+��¢Y^r�+
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveDecoded base64 content: J�b�'���ӭ�즊�
Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.
Report false positiveHigh-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 positiveHigh-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 positiveHigh-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 positiveHigh-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 positiveJavaScript 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 positiveHigh-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 positiveHigh-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 positiveHigh-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 positiveJavaScript 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 positiveHigh-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 positiveScan History
| Date | Risk | Findings | Files | Duration |
|---|---|---|---|---|
| Feb 25, 2026 | critical | 59 | 13 | 0.00s |
| Feb 23, 2026 | critical | 59 | 13 | 0.00s |
| Feb 22, 2026 | critical | 59 | 13 | 0.00s |