@n0ts123/mcplink-core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/MCPManager.ts","../src/types.ts","../src/Agent.ts","../src/PromptBasedAgent.ts","../src/MCPLink.ts"],"names":["MCPLinkEventType","duration","streamText"],"mappings":"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","file":"index.js","sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js'\r\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\r\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\r\nimport type { MCPServerConfig, MCPServerConfigStdio, MCPServerConfigSSE, MCPTool, MCPServerStatus } from './types.js'\r\n\r\n/**\r\n * MCP 服务器实例\r\n */\r\ninterface MCPServerInstance {\r\n id: string\r\n config: MCPServerConfig\r\n client: Client\r\n transport: StdioClientTransport | SSEClientTransport\r\n tools: MCPTool[]\r\n status: 'stopped' | 'starting' | 'running' | 'error'\r\n error?: string\r\n}\r\n\r\n/**\r\n * MCP 管理器\r\n * 负责管理多个 MCP 服务器的连接、工具发现和调用\r\n */\r\nexport class MCPManager {\r\n private servers: Map<string, MCPServerInstance> = new Map()\r\n\r\n /**\r\n * 添加 MCP 服务器配置\r\n */\r\n addServer(id: string, config: MCPServerConfig): void {\r\n if (this.servers.has(id)) {\r\n throw new Error(`MCP server \"${id}\" already exists`)\r\n }\r\n\r\n // 创建 Client\r\n const client = new Client({ name: 'mcplink', version: '0.0.1' }, { capabilities: {} })\r\n\r\n // 创建 Transport\r\n let transport: StdioClientTransport | SSEClientTransport\r\n\r\n if (config.type === 'sse') {\r\n const sseConfig = config as MCPServerConfigSSE\r\n transport = new SSEClientTransport(new URL(sseConfig.url))\r\n } else {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n // 合并当前进程的环境变量和配置的环境变量\r\n // 过滤掉 undefined 值\r\n const processEnv: Record<string, string> = {}\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (value !== undefined) {\r\n processEnv[key] = value\r\n }\r\n }\r\n const mergedEnv = {\r\n ...processEnv,\r\n ...stdioConfig.env,\r\n }\r\n\r\n // Windows 兼容性处理\r\n // 在 Windows 上,npx/npm 等命令实际上是 .cmd 文件,需要通过 shell 执行\r\n const isWindows = process.platform === 'win32'\r\n let command = stdioConfig.command\r\n let args = stdioConfig.args || []\r\n\r\n if (isWindows) {\r\n // 对于 npx, npm, node 等命令,在 Windows 上需要通过 cmd /c 执行\r\n const windowsCommands = ['npx', 'npm', 'node', 'pnpm', 'yarn', 'bunx']\r\n if (windowsCommands.includes(command.toLowerCase())) {\r\n args = ['/c', command, ...args]\r\n command = 'cmd'\r\n }\r\n }\r\n\r\n transport = new StdioClientTransport({\r\n command,\r\n args,\r\n env: mergedEnv,\r\n })\r\n }\r\n\r\n this.servers.set(id, {\r\n id,\r\n config,\r\n client,\r\n transport,\r\n tools: [],\r\n status: 'stopped',\r\n })\r\n }\r\n\r\n /**\r\n * 启动 MCP 服务器\r\n */\r\n async startServer(id: string): Promise<void> {\r\n const server = this.servers.get(id)\r\n if (!server) {\r\n throw new Error(`MCP server \"${id}\" not found`)\r\n }\r\n\r\n if (server.status === 'running') {\r\n return\r\n }\r\n\r\n server.status = 'starting'\r\n server.error = undefined\r\n\r\n // 打印启动信息\r\n const config = server.config\r\n if (config.type === 'stdio') {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n const isWindows = process.platform === 'win32'\r\n const windowsCommands = ['npx', 'npm', 'node', 'pnpm', 'yarn', 'bunx']\r\n let displayCmd = stdioConfig.command\r\n let displayArgs = stdioConfig.args || []\r\n\r\n if (isWindows && windowsCommands.includes(stdioConfig.command.toLowerCase())) {\r\n displayCmd = 'cmd'\r\n displayArgs = ['/c', stdioConfig.command, ...displayArgs]\r\n }\r\n\r\n console.log(`\\n🔧 [MCP] 正在启动服务器 \"${id}\"...`)\r\n console.log(` 命令: ${displayCmd} ${displayArgs.join(' ')}`)\r\n if (stdioConfig.env && Object.keys(stdioConfig.env).length > 0) {\r\n console.log(` 环境变量: ${Object.keys(stdioConfig.env).join(', ')}`)\r\n }\r\n } else {\r\n const sseConfig = config as MCPServerConfigSSE\r\n console.log(`\\n🔧 [MCP] 正在连接 SSE 服务器 \"${id}\"...`)\r\n console.log(` URL: ${sseConfig.url}`)\r\n }\r\n\r\n try {\r\n // 连接到服务器\r\n await server.client.connect(server.transport)\r\n\r\n // 获取工具列表\r\n const toolsResult = await server.client.listTools()\r\n server.tools = toolsResult.tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description || '',\r\n inputSchema: tool.inputSchema as MCPTool['inputSchema'],\r\n }))\r\n\r\n server.status = 'running'\r\n console.log(`✅ [MCP] 服务器 \"${id}\" 启动成功,发现 ${server.tools.length} 个工具`)\r\n if (server.tools.length > 0) {\r\n console.log(` 工具: ${server.tools.map((t) => t.name).join(', ')}`)\r\n }\r\n } catch (error) {\r\n server.status = 'error'\r\n\r\n // 提供更详细的错误信息\r\n let errorMessage = error instanceof Error ? error.message : String(error)\r\n\r\n if (errorMessage.includes('Connection closed')) {\r\n if (config.type === 'stdio') {\r\n const stdioConfig = config as MCPServerConfigStdio\r\n errorMessage =\r\n `MCP 服务器启动失败: 进程立即退出。\\n` +\r\n `命令: ${stdioConfig.command} ${(stdioConfig.args || []).join(' ')}\\n` +\r\n `可能原因:\\n` +\r\n `1. 命令 \"${stdioConfig.command}\" 不存在或不在 PATH 中\\n` +\r\n `2. 如果使用 Docker,请确保 Docker 正在运行\\n` +\r\n `3. 检查环境变量是否正确配置\\n` +\r\n `4. 尝试在终端手动运行命令查看具体错误`\r\n }\r\n }\r\n\r\n // 打印错误到控制台\r\n console.error(`❌ [MCP] 服务器 \"${id}\" 启动失败:`)\r\n console.error(` ${errorMessage.split('\\n').join('\\n ')}`)\r\n\r\n server.error = errorMessage\r\n throw new Error(errorMessage)\r\n }\r\n }\r\n\r\n /**\r\n * 停止 MCP 服务器\r\n */\r\n async stopServer(id: string): Promise<void> {\r\n const server = this.servers.get(id)\r\n if (!server) {\r\n throw new Error(`MCP server \"${id}\" not found`)\r\n }\r\n\r\n if (server.status === 'stopped') {\r\n return\r\n }\r\n\r\n console.log(`🔧 [MCP] 正在停止服务器 \"${id}\"...`)\r\n\r\n try {\r\n await server.client.close()\r\n console.log(`✅ [MCP] 服务器 \"${id}\" 已停止`)\r\n } catch (error) {\r\n console.error(`⚠️ [MCP] 停止服务器 \"${id}\" 时出错:`, error)\r\n } finally {\r\n server.status = 'stopped'\r\n server.tools = []\r\n }\r\n }\r\n\r\n /**\r\n * 启动所有已配置的服务器\r\n */\r\n async startAll(): Promise<void> {\r\n const startPromises = Array.from(this.servers.keys()).map((id) =>\r\n this.startServer(id).catch((error) => {\r\n console.error(`Failed to start MCP server \"${id}\":`, error)\r\n })\r\n )\r\n await Promise.all(startPromises)\r\n }\r\n\r\n /**\r\n * 停止所有服务器\r\n */\r\n async stopAll(): Promise<void> {\r\n const stopPromises = Array.from(this.servers.keys()).map((id) =>\r\n this.stopServer(id).catch((error) => {\r\n console.error(`Failed to stop MCP server \"${id}\":`, error)\r\n })\r\n )\r\n await Promise.all(stopPromises)\r\n }\r\n\r\n /**\r\n * 获取所有可用的工具\r\n */\r\n getAllTools(): MCPTool[] {\r\n const tools: MCPTool[] = []\r\n for (const server of this.servers.values()) {\r\n if (server.status === 'running') {\r\n tools.push(...server.tools)\r\n }\r\n }\r\n return tools\r\n }\r\n\r\n /**\r\n * 调用工具\r\n */\r\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\r\n // 找到提供该工具的服务器\r\n for (const server of this.servers.values()) {\r\n if (server.status !== 'running') continue\r\n\r\n const tool = server.tools.find((t) => t.name === toolName)\r\n if (tool) {\r\n const result = await server.client.callTool({\r\n name: toolName,\r\n arguments: args,\r\n })\r\n\r\n // 处理结果\r\n if (result.content && Array.isArray(result.content)) {\r\n // 如果是文本内容,拼接返回\r\n const textContents = result.content\r\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\r\n .map((c) => c.text)\r\n\r\n if (textContents.length > 0) {\r\n const textResult = textContents.join('\\n')\r\n // 检查是否是错误结果\r\n if (result.isError) {\r\n throw new Error(textResult || '工具执行失败')\r\n }\r\n return textResult\r\n }\r\n }\r\n\r\n // 检查是否是错误结果\r\n if (result.isError) {\r\n const errorContent = result.content\r\n throw new Error(\r\n typeof errorContent === 'string'\r\n ? errorContent\r\n : JSON.stringify(errorContent) || '工具执行失败'\r\n )\r\n }\r\n\r\n return result.content\r\n }\r\n }\r\n\r\n throw new Error(`Tool \"${toolName}\" not found in any running MCP server`)\r\n }\r\n\r\n /**\r\n * 获取所有服务器状态\r\n */\r\n getServerStatuses(): MCPServerStatus[] {\r\n return Array.from(this.servers.values()).map((server) => ({\r\n id: server.id,\r\n name: server.id,\r\n config: server.config,\r\n status: server.status,\r\n tools: server.tools,\r\n error: server.error,\r\n }))\r\n }\r\n\r\n /**\r\n * 移除服务器\r\n */\r\n async removeServer(id: string): Promise<void> {\r\n await this.stopServer(id)\r\n this.servers.delete(id)\r\n }\r\n}\r\n","import type { LanguageModel } from 'ai'\r\n\r\n// ============ 配置类型 ============\r\n\r\n/** MCP 服务器配置 - stdio 模式 */\r\nexport interface MCPServerConfigStdio {\r\n type?: 'stdio'\r\n /** 启动命令 */\r\n command: string\r\n /** 命令参数 */\r\n args?: string[]\r\n /** 环境变量 */\r\n env?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 - SSE 模式 */\r\nexport interface MCPServerConfigSSE {\r\n type: 'sse'\r\n /** SSE 服务地址 */\r\n url: string\r\n /** 请求头 */\r\n headers?: Record<string, string>\r\n}\r\n\r\n/** MCP 服务器配置 */\r\nexport type MCPServerConfig = MCPServerConfigStdio | MCPServerConfigSSE\r\n\r\n/** MCPLink 配置 */\r\nexport interface MCPLinkConfig {\r\n /** AI 模型实例 (Vercel AI SDK) */\r\n model: LanguageModel\r\n /** 模型名称(用于自动检测是否支持原生工具调用) */\r\n modelName?: string\r\n /** MCP 服务器配置 */\r\n mcpServers?: Record<string, MCPServerConfig>\r\n /** 系统提示词 */\r\n systemPrompt?: string\r\n /** 最大迭代次数 (防止无限循环) */\r\n maxIterations?: number\r\n /** 是否允许并行工具调用 */\r\n parallelToolCalls?: boolean\r\n /**\r\n * 是否使用基于 Prompt 的工具调用\r\n * - true: 使用 prompt 让模型输出特定格式来调用工具(支持所有模型)\r\n * - false: 使用原生 function calling(需要模型支持)\r\n * - 'auto': 自动检测(默认)\r\n */\r\n usePromptBasedTools?: boolean | 'auto'\r\n}\r\n\r\n// ============ 消息类型 ============\r\n\r\n/** 工具调用 */\r\nexport interface ToolCall {\r\n id: string\r\n name: string\r\n arguments: Record<string, unknown>\r\n}\r\n\r\n/** 工具结果 */\r\nexport interface ToolResult {\r\n toolCallId: string\r\n toolName: string\r\n result: unknown\r\n isError?: boolean\r\n duration?: number\r\n}\r\n\r\n/** 消息角色 */\r\nexport type MessageRole = 'system' | 'user' | 'assistant' | 'tool'\r\n\r\n/** 消息 */\r\nexport interface Message {\r\n role: MessageRole\r\n content: string\r\n toolCalls?: ToolCall[]\r\n toolResults?: ToolResult[]\r\n}\r\n\r\n// ============ 事件类型 ============\r\n\r\n/** 事件类型 */\r\nexport enum MCPLinkEventType {\r\n /** AI 开始思考 */\r\n THINKING_START = 'thinking_start',\r\n /** AI 思考内容 (流式) */\r\n THINKING_DELTA = 'thinking_delta',\r\n /** AI 思考结束 */\r\n THINKING_END = 'thinking_end',\r\n /** AI 思考内容(完整,用于工具调用时展示) */\r\n THINKING_CONTENT = 'thinking_content',\r\n\r\n /** AI 开始回复 */\r\n TEXT_START = 'text_start',\r\n /** AI 回复内容 (流式) */\r\n TEXT_DELTA = 'text_delta',\r\n /** AI 回复结束 */\r\n TEXT_END = 'text_end',\r\n\r\n /** 开始调用工具 */\r\n TOOL_CALL_START = 'tool_call_start',\r\n /** 工具参数 (流式) */\r\n TOOL_CALL_DELTA = 'tool_call_delta',\r\n /** 工具调用参数完成 */\r\n TOOL_CALL_END = 'tool_call_end',\r\n /** 工具正在执行 */\r\n TOOL_EXECUTING = 'tool_executing',\r\n /** 工具返回结果 */\r\n TOOL_RESULT = 'tool_result',\r\n\r\n /** 开始新一轮迭代 */\r\n ITERATION_START = 'iteration_start',\r\n /** 迭代结束 */\r\n ITERATION_END = 'iteration_end',\r\n\r\n /** 全部完成 */\r\n COMPLETE = 'complete',\r\n /** 发生错误 */\r\n ERROR = 'error',\r\n\r\n /** TODO 列表开始 */\r\n TODO_START = 'todo_start',\r\n /** 添加 TODO 项 */\r\n TODO_ITEM_ADD = 'todo_item_add',\r\n /** 更新 TODO 项状态 */\r\n TODO_ITEM_UPDATE = 'todo_item_update',\r\n /** TODO 列表完成 */\r\n TODO_END = 'todo_end',\r\n}\r\n\r\n/** 事件数据 */\r\nexport interface MCPLinkEventData {\r\n content?: string\r\n toolName?: string\r\n toolArgs?: Record<string, unknown>\r\n toolResult?: unknown\r\n toolCallId?: string\r\n duration?: number\r\n iteration?: number\r\n maxIterations?: number\r\n totalIterations?: number\r\n totalDuration?: number\r\n argsTextDelta?: string\r\n isError?: boolean\r\n error?: Error\r\n // TODO 相关\r\n todoId?: string\r\n todoTitle?: string\r\n todoItemId?: string\r\n todoItemContent?: string\r\n todoItemStatus?: TodoItemStatus\r\n todoItemResult?: string\r\n}\r\n\r\n/** 事件 */\r\nexport interface MCPLinkEvent {\r\n type: MCPLinkEventType\r\n timestamp: number\r\n data: MCPLinkEventData\r\n}\r\n\r\n// ============ 回调类型 ============\r\n\r\n/** 对话回调选项 */\r\nexport interface ChatCallbacks {\r\n /** AI 思考内容 */\r\n onThinking?: (content: string) => void\r\n /** 开始调用工具 */\r\n onToolCallStart?: (toolName: string, args: Record<string, unknown>) => void\r\n /** 工具返回结果 */\r\n onToolResult?: (toolName: string, result: unknown, duration: number) => void\r\n /** AI 输出文本 (流式) */\r\n onTextDelta?: (delta: string) => void\r\n /** 迭代开始 */\r\n onIterationStart?: (iteration: number) => void\r\n /** 迭代结束 */\r\n onIterationEnd?: (iteration: number) => void\r\n /** 发生错误 */\r\n onError?: (error: Error) => void\r\n /** TODO 列表开始 */\r\n onTodoStart?: (todoId: string, title: string) => void\r\n /** TODO 项添加 */\r\n onTodoItemAdd?: (todoId: string, item: TodoItem) => void\r\n /** TODO 项更新 */\r\n onTodoItemUpdate?: (todoId: string, itemId: string, status: TodoItemStatus, result?: string) => void\r\n /** TODO 列表完成 */\r\n onTodoEnd?: (todoId: string) => void\r\n}\r\n\r\n// ============ 返回类型 ============\r\n\r\n/** 对话结果 */\r\nexport interface ChatResult {\r\n /** 最终回复内容 */\r\n content: string\r\n /** 执行过的工具调用记录 */\r\n toolCalls: Array<{\r\n name: string\r\n arguments: Record<string, unknown>\r\n result: unknown\r\n duration: number\r\n }>\r\n /** 完整消息历史 */\r\n messages: Message[]\r\n /** Token 使用量 */\r\n usage: {\r\n promptTokens: number\r\n completionTokens: number\r\n totalTokens: number\r\n }\r\n /** 总迭代次数 */\r\n iterations: number\r\n /** 总耗时 (ms) */\r\n duration: number\r\n}\r\n\r\n// ============ MCP 工具类型 ============\r\n\r\n/** MCP 工具定义 */\r\nexport interface MCPTool {\r\n name: string\r\n description: string\r\n inputSchema: {\r\n type: 'object'\r\n properties?: Record<string, unknown>\r\n required?: string[]\r\n }\r\n}\r\n\r\n/** MCP 服务器状态 */\r\nexport interface MCPServerStatus {\r\n id: string\r\n name: string\r\n config: MCPServerConfig\r\n status: 'stopped' | 'starting' | 'running' | 'error'\r\n tools: MCPTool[]\r\n error?: string\r\n}\r\n\r\n// ============ TODO 任务类型 ============\r\n\r\n/** TODO 项状态 */\r\nexport type TodoItemStatus = 'pending' | 'in_progress' | 'completed' | 'failed'\r\n\r\n/** TODO 项 */\r\nexport interface TodoItem {\r\n /** 唯一标识 */\r\n id: string\r\n /** 任务内容 */\r\n content: string\r\n /** 当前状态 */\r\n status: TodoItemStatus\r\n /** 完成后的结果摘要 */\r\n result?: string\r\n}\r\n\r\n/** TODO 列表 */\r\nexport interface TodoList {\r\n /** 唯一标识 */\r\n id: string\r\n /** 整体任务标题 */\r\n title: string\r\n /** 任务项列表 */\r\n items: TodoItem[]\r\n /** 创建时间 */\r\n createdAt: number\r\n}\r\n","import { generateText, streamText, type LanguageModel, type CoreMessage, type CoreTool } from 'ai'\r\nimport { z } from 'zod'\r\nimport type { MCPManager } from './MCPManager.js'\r\nimport {\r\n MCPLinkEventType,\r\n type MCPTool,\r\n type ChatCallbacks,\r\n type ChatResult,\r\n type MCPLinkEvent,\r\n type ToolResult,\r\n} from './types.js'\r\n\r\n/** \r\n * 默认用户提示词\r\n * 这只是用户自定义的部分,核心工具调用逻辑已内置到代码中\r\n */\r\nexport const DEFAULT_SYSTEM_PROMPT = `你是一个智能助手,请使用中文回复。`\r\n\r\n/**\r\n * Agent 引擎\r\n * 负责执行 AI 对话循环,处理工具调用\r\n */\r\nexport class Agent {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private systemPrompt: string\r\n private maxIterations: number\r\n\r\n constructor(\r\n model: LanguageModel,\r\n mcpManager: MCPManager,\r\n options: {\r\n systemPrompt?: string\r\n maxIterations?: number\r\n } = {}\r\n ) {\r\n this.model = model\r\n this.mcpManager = mcpManager\r\n this.systemPrompt = options.systemPrompt || DEFAULT_SYSTEM_PROMPT\r\n this.maxIterations = options.maxIterations || 10\r\n }\r\n\r\n /**\r\n * 将 MCP 工具转换为 Vercel AI SDK 格式\r\n */\r\n private convertMCPToolsToAITools(mcpTools: MCPTool[]): Record<string, CoreTool> {\r\n const tools: Record<string, CoreTool> = {}\r\n\r\n for (const mcpTool of mcpTools) {\r\n // 将 JSON Schema 转换为 Zod Schema\r\n const zodSchema = this.jsonSchemaToZod(mcpTool.inputSchema)\r\n\r\n tools[mcpTool.name] = {\r\n description: mcpTool.description,\r\n parameters: zodSchema,\r\n }\r\n }\r\n\r\n return tools\r\n }\r\n\r\n /**\r\n * 简单的 JSON Schema 到 Zod 转换\r\n */\r\n private jsonSchemaToZod(schema: MCPTool['inputSchema']): z.ZodType {\r\n if (!schema.properties) {\r\n return z.object({})\r\n }\r\n\r\n const shape: Record<string, z.ZodType> = {}\r\n const required = schema.required || []\r\n\r\n for (const [key, prop] of Object.entries(schema.properties)) {\r\n const propSchema = prop as { type?: string; description?: string; items?: { type?: string } }\r\n let zodType: z.ZodType\r\n\r\n switch (propSchema.type) {\r\n case 'string':\r\n zodType = z.string()\r\n break\r\n case 'number':\r\n zodType = z.number()\r\n break\r\n case 'integer':\r\n zodType = z.number().int()\r\n break\r\n case 'boolean':\r\n zodType = z.boolean()\r\n break\r\n case 'array':\r\n if (propSchema.items?.type === 'string') {\r\n zodType = z.array(z.string())\r\n } else if (propSchema.items?.type === 'number') {\r\n zodType = z.array(z.number())\r\n } else {\r\n zodType = z.array(z.unknown())\r\n }\r\n break\r\n default:\r\n zodType = z.unknown()\r\n }\r\n\r\n if (propSchema.description) {\r\n zodType = zodType.describe(propSchema.description)\r\n }\r\n\r\n if (!required.includes(key)) {\r\n zodType = zodType.optional()\r\n }\r\n\r\n shape[key] = zodType\r\n }\r\n\r\n return z.object(shape)\r\n }\r\n\r\n /**\r\n * 执行对话\r\n */\r\n async chat(userMessage: string, callbacks?: ChatCallbacks): Promise<ChatResult> {\r\n const startTime = Date.now()\r\n const toolCallRecords: ChatResult['toolCalls'] = []\r\n let totalPromptTokens = 0\r\n let totalCompletionTokens = 0\r\n\r\n // 构建消息历史\r\n const messages: CoreMessage[] = [\r\n { role: 'system', content: this.systemPrompt },\r\n { role: 'user', content: userMessage },\r\n ]\r\n\r\n // 获取所有可用工具\r\n const mcpTools = this.mcpManager.getAllTools()\r\n const tools = this.convertMCPToolsToAITools(mcpTools)\r\n\r\n let iteration = 0\r\n let finalContent = ''\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n callbacks?.onIterationStart?.(iteration)\r\n\r\n // 调用 AI\r\n const response = await generateText({\r\n model: this.model,\r\n messages,\r\n tools: Object.keys(tools).length > 0 ? tools : undefined,\r\n maxSteps: 1, // 每次只执行一步,方便我们控制流程\r\n })\r\n\r\n // 累计 token 使用\r\n if (response.usage) {\r\n totalPromptTokens += response.usage.promptTokens\r\n totalCompletionTokens += response.usage.completionTokens\r\n }\r\n\r\n // 检查是否有工具调用\r\n const toolCalls = response.toolCalls || []\r\n\r\n if (toolCalls.length === 0) {\r\n // 没有工具调用,说明 AI 完成了任务\r\n finalContent = response.text || ''\r\n callbacks?.onTextDelta?.(finalContent)\r\n callbacks?.onIterationEnd?.(iteration)\r\n break\r\n }\r\n\r\n // 有工具调用,处理它们\r\n const toolResults: ToolResult[] = []\r\n\r\n for (const toolCall of toolCalls) {\r\n const toolName = toolCall.toolName\r\n const toolArgs = toolCall.args as Record<string, unknown>\r\n const toolCallId = toolCall.toolCallId\r\n\r\n callbacks?.onToolCallStart?.(toolName, toolArgs)\r\n\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolName, toolArgs)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n callbacks?.onToolResult?.(toolName, result, duration)\r\n\r\n toolResults.push({\r\n toolCallId,\r\n toolName,\r\n result,\r\n isError,\r\n duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: toolName,\r\n arguments: toolArgs,\r\n result,\r\n duration,\r\n })\r\n }\r\n\r\n // 将 AI 的回复和工具调用添加到消息历史\r\n messages.push({\r\n role: 'assistant' as const,\r\n content: [\r\n { type: 'text' as const, text: response.text || '' },\r\n ...toolCalls.map((tc) => ({\r\n type: 'tool-call' as const,\r\n toolCallId: tc.toolCallId,\r\n toolName: tc.toolName,\r\n args: tc.args as Record<string, unknown>,\r\n })),\r\n ],\r\n })\r\n\r\n // 将工具结果添加到消息历史\r\n for (const tr of toolResults) {\r\n messages.push({\r\n role: 'tool' as const,\r\n content: [\r\n {\r\n type: 'tool-result' as const,\r\n toolCallId: tr.toolCallId,\r\n toolName: tr.toolName,\r\n result: tr.result,\r\n },\r\n ],\r\n })\r\n }\r\n\r\n callbacks?.onIterationEnd?.(iteration)\r\n }\r\n\r\n const duration = Date.now() - startTime\r\n\r\n return {\r\n content: finalContent,\r\n toolCalls: toolCallRecords,\r\n messages: messages.map((m) => ({\r\n role: m.role as 'system' | 'user' | 'assistant' | 'tool',\r\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\r\n })),\r\n usage: {\r\n promptTokens: totalPromptTokens,\r\n completionTokens: totalCompletionTokens,\r\n totalTokens: totalPromptTokens + totalCompletionTokens,\r\n },\r\n iterations: iteration,\r\n duration,\r\n }\r\n }\r\n\r\n /**\r\n * 流式对话 - 返回事件生成器\r\n * @param userMessage 用户消息\r\n * @param options 可选参数\r\n * @param options.allowedTools 允许使用的工具名称列表,为空或不传则使用所有工具\r\n * @param options.history 历史消息列表\r\n */\r\n async *chatStream(\r\n userMessage: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n const startTime = Date.now()\r\n const toolCallRecords: ChatResult['toolCalls'] = []\r\n\r\n // 构建消息历史\r\n const messages: CoreMessage[] = [{ role: 'system', content: this.systemPrompt }]\r\n\r\n // 添加历史消息\r\n if (options?.history && options.history.length > 0) {\r\n for (const msg of options.history) {\r\n messages.push({\r\n role: msg.role,\r\n content: msg.content,\r\n })\r\n }\r\n }\r\n\r\n // 添加当前用户消息\r\n messages.push({ role: 'user', content: userMessage })\r\n\r\n // 获取所有可用工具\r\n let mcpTools = this.mcpManager.getAllTools()\r\n\r\n // 如果指定了允许的工具列表,则进行过滤\r\n if (options?.allowedTools && options.allowedTools.length > 0) {\r\n mcpTools = mcpTools.filter((tool) => options.allowedTools!.includes(tool.name))\r\n }\r\n\r\n const tools = this.convertMCPToolsToAITools(mcpTools)\r\n const hasTools = Object.keys(tools).length > 0\r\n\r\n let iteration = 0\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_START,\r\n timestamp: Date.now(),\r\n data: { iteration, maxIterations: this.maxIterations },\r\n }\r\n\r\n // 使用 streamText 进行流式调用\r\n const stream = streamText({\r\n model: this.model,\r\n messages,\r\n tools: hasTools ? tools : undefined,\r\n maxSteps: 1,\r\n })\r\n\r\n // 收集流式结果\r\n let fullText = ''\r\n let reasoningText = ''\r\n const toolCalls: Array<{\r\n toolCallId: string\r\n toolName: string\r\n args: Record<string, unknown>\r\n }> = []\r\n let currentToolCall: {\r\n toolCallId: string\r\n toolName: string\r\n argsText: string\r\n } | null = null\r\n let hasStartedText = false\r\n let hasStartedReasoning = false\r\n\r\n // 已发送 TOOL_CALL_START 的工具 ID 集合\r\n const sentToolCallStarts = new Set<string>()\r\n\r\n // 用于解析 <think> 标签的状态\r\n let thinkBuffer = ''\r\n let isInsideThinkTag = false\r\n let textBuffer = ''\r\n\r\n // 流式处理\r\n for await (const chunk of stream.fullStream) {\r\n switch (chunk.type) {\r\n case 'reasoning':\r\n // 流式输出思考过程(Claude 等模型支持)\r\n if (!hasStartedReasoning) {\r\n hasStartedReasoning = true\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n reasoningText += chunk.textDelta\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: chunk.textDelta },\r\n }\r\n break\r\n\r\n case 'text-delta':\r\n // 流式输出文本 - 解析 <think> 标签\r\n const delta = chunk.textDelta\r\n textBuffer += delta\r\n\r\n // 处理 <think> 标签的开始\r\n if (!isInsideThinkTag) {\r\n // 检查是否有 <think> 开始标签\r\n const thinkStartMatch = textBuffer.match(/<think>/i)\r\n if (thinkStartMatch) {\r\n // 发送标签之前的文本\r\n const beforeThink = textBuffer.substring(0, thinkStartMatch.index)\r\n if (beforeThink.trim()) {\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += beforeThink\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: beforeThink },\r\n }\r\n }\r\n // 进入思考模式\r\n isInsideThinkTag = true\r\n if (!hasStartedReasoning) {\r\n hasStartedReasoning = true\r\n yield {\r\n type: MCPLinkEventType.THINKING_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n textBuffer = textBuffer.substring(thinkStartMatch.index! + 7) // 跳过 <think>\r\n thinkBuffer = ''\r\n } else if (!textBuffer.includes('<')) {\r\n // 没有潜在的标签,直接输出\r\n if (hasStartedReasoning && !hasStartedText) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果包含 '<' 但不是完整标签,继续缓冲\r\n } else {\r\n // 在思考标签内,检查结束标签\r\n const thinkEndMatch = textBuffer.match(/<\\/think>/i)\r\n if (thinkEndMatch) {\r\n // 发送结束前的思考内容\r\n const thinkContent = textBuffer.substring(0, thinkEndMatch.index)\r\n if (thinkContent) {\r\n thinkBuffer += thinkContent\r\n reasoningText += thinkContent\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: thinkContent },\r\n }\r\n }\r\n // 结束思考\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n isInsideThinkTag = false\r\n textBuffer = textBuffer.substring(thinkEndMatch.index! + 8) // 跳过 </think>\r\n } else if (!textBuffer.includes('<')) {\r\n // 没有潜在的结束标签,直接输出思考内容\r\n thinkBuffer += textBuffer\r\n reasoningText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果包含 '<' 但不是完整标签,继续缓冲\r\n }\r\n break\r\n\r\n case 'tool-call':\r\n // 非流式工具调用(大多数模型使用这种方式)\r\n // 直接发送完整的工具调用信息\r\n if (!sentToolCallStarts.has(chunk.toolCallId)) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: chunk.toolName,\r\n toolCallId: chunk.toolCallId,\r\n toolArgs: chunk.args as Record<string, unknown>,\r\n },\r\n }\r\n sentToolCallStarts.add(chunk.toolCallId)\r\n }\r\n toolCalls.push({\r\n toolCallId: chunk.toolCallId,\r\n toolName: chunk.toolName,\r\n args: chunk.args as Record<string, unknown>,\r\n })\r\n break\r\n\r\n case 'tool-call-streaming-start':\r\n // 流式工具调用开始(部分模型支持)\r\n currentToolCall = {\r\n toolCallId: chunk.toolCallId,\r\n toolName: chunk.toolName,\r\n argsText: '',\r\n }\r\n if (!sentToolCallStarts.has(chunk.toolCallId)) {\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName: chunk.toolName,\r\n toolCallId: chunk.toolCallId,\r\n },\r\n }\r\n sentToolCallStarts.add(chunk.toolCallId)\r\n }\r\n break\r\n\r\n case 'tool-call-delta':\r\n // 流式工具参数\r\n if (currentToolCall) {\r\n currentToolCall.argsText += chunk.argsTextDelta\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_DELTA,\r\n timestamp: Date.now(),\r\n data: {\r\n toolCallId: currentToolCall.toolCallId,\r\n argsTextDelta: chunk.argsTextDelta,\r\n },\r\n }\r\n }\r\n break\r\n\r\n case 'finish':\r\n // 本轮生成结束\r\n // 处理剩余的缓冲内容\r\n if (textBuffer) {\r\n if (isInsideThinkTag) {\r\n // 仍在思考标签内,输出剩余内容作为思考\r\n reasoningText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.THINKING_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n } else {\r\n // 输出剩余文本\r\n if (!hasStartedText) {\r\n hasStartedText = true\r\n yield {\r\n type: MCPLinkEventType.TEXT_START,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n fullText += textBuffer\r\n yield {\r\n type: MCPLinkEventType.TEXT_DELTA,\r\n timestamp: Date.now(),\r\n data: { content: textBuffer },\r\n }\r\n }\r\n textBuffer = ''\r\n }\r\n // 如果有思考过程但还没结束,先结束它\r\n if (isInsideThinkTag || (hasStartedReasoning && !hasStartedText)) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n isInsideThinkTag = false\r\n }\r\n if (hasStartedText) {\r\n yield {\r\n type: MCPLinkEventType.TEXT_END,\r\n timestamp: Date.now(),\r\n data: {},\r\n }\r\n }\r\n break\r\n\r\n case 'error':\r\n yield {\r\n type: MCPLinkEventType.ERROR,\r\n timestamp: Date.now(),\r\n data: { error: chunk.error as Error },\r\n }\r\n break\r\n }\r\n }\r\n\r\n // 检查是否有工具调用\r\n if (toolCalls.length === 0) {\r\n // 没有工具调用,结束迭代\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n break\r\n }\r\n\r\n // 如果有思考文本,标记为思考过程\r\n if (fullText) {\r\n yield {\r\n type: MCPLinkEventType.THINKING_CONTENT,\r\n timestamp: Date.now(),\r\n data: { content: fullText },\r\n }\r\n }\r\n\r\n // 执行工具调用\r\n const toolResults: ToolResult[] = []\r\n\r\n for (const toolCall of toolCalls) {\r\n const toolName = toolCall.toolName\r\n const toolArgs = toolCall.args\r\n const toolCallId = toolCall.toolCallId\r\n\r\n // 发送执行中状态\r\n yield {\r\n type: MCPLinkEventType.TOOL_EXECUTING,\r\n timestamp: Date.now(),\r\n data: { toolName, toolCallId, toolArgs },\r\n }\r\n\r\n // 执行工具\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolName, toolArgs)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n // 发送结果\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: {\r\n toolName,\r\n toolResult: result,\r\n toolCallId,\r\n duration,\r\n isError,\r\n },\r\n }\r\n\r\n toolResults.push({\r\n toolCallId,\r\n toolName,\r\n result,\r\n isError,\r\n duration,\r\n })\r\n\r\n toolCallRecords.push({\r\n name: toolName,\r\n arguments: toolArgs,\r\n result,\r\n duration,\r\n })\r\n }\r\n\r\n // 更新消息历史\r\n messages.push({\r\n role: 'assistant' as const,\r\n content: [\r\n ...(fullText ? [{ type: 'text' as const, text: fullText }] : []),\r\n ...toolCalls.map((tc) => ({\r\n type: 'tool-call' as const,\r\n toolCallId: tc.toolCallId,\r\n toolName: tc.toolName,\r\n args: tc.args,\r\n })),\r\n ],\r\n })\r\n\r\n for (const tr of toolResults) {\r\n messages.push({\r\n role: 'tool' as const,\r\n content: [\r\n {\r\n type: 'tool-result' as const,\r\n toolCallId: tr.toolCallId,\r\n toolName: tr.toolName,\r\n result: tr.result,\r\n },\r\n ],\r\n })\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_END,\r\n timestamp: Date.now(),\r\n data: { iteration },\r\n }\r\n }\r\n\r\n const totalDuration = Date.now() - startTime\r\n\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: {\r\n totalIterations: iteration,\r\n totalDuration,\r\n },\r\n }\r\n }\r\n}\r\n","import { streamText, type LanguageModel, type CoreMessage } from 'ai'\r\nimport type { MCPManager } from './MCPManager.js'\r\nimport { MCPLinkEventType, type MCPTool, type MCPLinkEvent } from './types.js'\r\n\r\n/**\r\n * 基于 Prompt 的 Agent\r\n * 通过 prompt 工程让任意模型支持工具调用和思考过程\r\n * \r\n * 设计原则:\r\n * 1. 简洁 - 不做过多干预,让 AI 自己思考和决策\r\n * 2. 通用 - 支持任何模型,不依赖特定 API\r\n * 3. 可靠 - 稳定的状态机解析\r\n */\r\nexport class PromptBasedAgent {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private systemPrompt: string\r\n private maxIterations: number\r\n\r\n constructor(\r\n model: LanguageModel,\r\n mcpManager: MCPManager,\r\n options: {\r\n systemPrompt?: string\r\n maxIterations?: number\r\n } = {}\r\n ) {\r\n this.model = model\r\n this.mcpManager = mcpManager\r\n this.systemPrompt = options.systemPrompt || ''\r\n this.maxIterations = options.maxIterations || 10\r\n }\r\n\r\n /**\r\n * 生成工具列表描述\r\n */\r\n private generateToolsDescription(tools: MCPTool[]): string {\r\n if (tools.length === 0) {\r\n return '当前没有可用的工具。'\r\n }\r\n\r\n let description = ''\r\n for (const tool of tools) {\r\n description += `### ${tool.name}\\n`\r\n description += `描述: ${tool.description}\\n`\r\n description += `参数: ${JSON.stringify(tool.inputSchema, null, 2)}\\n\\n`\r\n }\r\n return description\r\n }\r\n\r\n /**\r\n * 内置系统提示词 - 强调格式约束\r\n */\r\n private readonly BUILT_IN_PROMPT = `\r\n## 工具调用格式(必须严格遵守)\r\n\r\n当你需要获取数据或执行操作时,**只能**使用以下格式:\r\n\r\n<tool_call>\r\n{\"name\": \"工具名称\", \"arguments\": {\"参数名\": \"值\"}}\r\n</tool_call>\r\n\r\n### 工作流程\r\n1. 分析用户需求\r\n2. 如需数据,输出 <tool_call>...</tool_call> 后**立即停止**\r\n3. 系统会执行工具并返回真实结果\r\n4. 收到结果后,用中文整理回复用户\r\n\r\n### 严格禁止\r\n- ❌ 自己编写工具返回结果(如 \\`结果:{...}\\` 或 \\`{\"code\":200...}\\`)\r\n- ❌ 模拟工具调用(如 \\`RPCCall:\\`、\\`FunctionCall:\\`)\r\n- ❌ 在没有真实工具结果的情况下编造数据\r\n- ❌ 一次输出中同时包含工具调用和最终回复\r\n\r\n### 正确示例\r\n用户: \"查询我的订单\"\r\n你的输出:\r\n<tool_call>\r\n{\"name\": \"get_orders\", \"arguments\": {\"token\": \"xxx\"}}\r\n</tool_call>\r\n\r\n(然后停止,等待系统返回真实结果)\r\n\r\n### 回复格式\r\n- 使用中文\r\n- 使用 Markdown 格式美化输出\r\n- 列表数据每项独占一行\r\n`\r\n\r\n /**\r\n * 构建完整的系统提示词\r\n */\r\n private buildSystemPrompt(tools: MCPTool[]): string {\r\n const toolsDescription = this.generateToolsDescription(tools)\r\n const userPrompt = this.systemPrompt || '你是一个智能助手。'\r\n\r\n return `${userPrompt}\r\n\r\n## 可用工具\r\n${toolsDescription}\r\n${this.BUILT_IN_PROMPT}`\r\n }\r\n\r\n /**\r\n * 解析工具调用\r\n */\r\n private parseToolCall(text: string): { name: string; arguments: Record<string, unknown> } | null {\r\n // 方式1: <tool_call> 标签\r\n const tagMatch = text.match(/<tool_call>\\s*([\\s\\S]*?)\\s*<\\/tool_call>/i)\r\n if (tagMatch) {\r\n try {\r\n const json = JSON.parse(tagMatch[1].trim())\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // 方式2: ```json 代码块\r\n const codeMatch = text.match(/```(?:json)?\\s*\\n?\\s*(\\{[\\s\\S]*?\"name\"[\\s\\S]*?\\})\\s*\\n?\\s*```/i)\r\n if (codeMatch) {\r\n try {\r\n const json = JSON.parse(codeMatch[1].trim())\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // 方式3: 裸 JSON\r\n const jsonMatch = text.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"[\\s\\S]*?\"arguments\"\\s*:\\s*(\\{[\\s\\S]*?\\})\\s*\\}/i)\r\n if (jsonMatch) {\r\n try {\r\n const fullMatch = jsonMatch[0]\r\n const json = JSON.parse(fullMatch)\r\n if (json.name) return { name: json.name, arguments: json.arguments || {} }\r\n } catch { /* ignore */ }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 智能压缩历史消息\r\n * - 用户消息完整保留\r\n * - AI 回复保留关键信息(ID、名称、数量、价格等)\r\n * - 去除冗长的 JSON 原始数据\r\n */\r\n private compressHistory(history: Array<{ role: 'user' | 'assistant'; content: string }>): Array<{ role: 'user' | 'assistant'; content: string }> {\r\n const MAX_HISTORY_LENGTH = 20 // 最多保留 20 条历史消息\r\n const MAX_USER_MESSAGE_LENGTH = 500 // 用户消息最大长度\r\n const MAX_ASSISTANT_MESSAGE_LENGTH = 1500 // AI 回复最大长度\r\n\r\n // 只保留最近的消息\r\n const recentHistory = history.slice(-MAX_HISTORY_LENGTH)\r\n\r\n return recentHistory.map((msg) => {\r\n if (msg.role === 'user') {\r\n // 用户消息:保持完整(通常较短)\r\n if (msg.content.length <= MAX_USER_MESSAGE_LENGTH) {\r\n return msg\r\n }\r\n return {\r\n role: msg.role,\r\n content: msg.content.slice(0, MAX_USER_MESSAGE_LENGTH) + '...'\r\n }\r\n }\r\n\r\n // AI 回复:智能压缩\r\n let content = msg.content\r\n\r\n // 1. 移除大段的 JSON 代码块,但保留摘要\r\n content = content.replace(/```json\\n[\\s\\S]*?\\n```/g, '[工具返回数据]')\r\n \r\n // 2. 移除工具返回的原始数据标记\r\n content = content.replace(/## .*?\\(原始JSON\\)[\\s\\S]*?(?=##|$)/g, '')\r\n \r\n // 3. 保留表格(通常是整理后的关键信息)\r\n // 表格不压缩\r\n\r\n // 4. 如果仍然过长,截断\r\n if (content.length > MAX_ASSISTANT_MESSAGE_LENGTH) {\r\n // 尝试保留表格部分\r\n const tableMatch = content.match(/\\|[\\s\\S]*?\\|/g)\r\n if (tableMatch) {\r\n const tables = tableMatch.join('\\n')\r\n if (tables.length < MAX_ASSISTANT_MESSAGE_LENGTH) {\r\n content = content.slice(0, MAX_ASSISTANT_MESSAGE_LENGTH - tables.length) + '\\n' + tables\r\n }\r\n }\r\n content = content.slice(0, MAX_ASSISTANT_MESSAGE_LENGTH) + '...'\r\n }\r\n\r\n return { role: msg.role, content: content.trim() || msg.content.slice(0, 500) }\r\n })\r\n }\r\n\r\n /**\r\n * 流式对话\r\n */\r\n async *chatStream(\r\n userMessage: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n const startTime = Date.now()\r\n\r\n // 获取工具\r\n let mcpTools = this.mcpManager.getAllTools()\r\n if (options?.allowedTools?.length) {\r\n mcpTools = mcpTools.filter((t) => options.allowedTools!.includes(t.name))\r\n }\r\n\r\n // 构建消息\r\n const messages: CoreMessage[] = [\r\n { role: 'system', content: this.buildSystemPrompt(mcpTools) }\r\n ]\r\n\r\n // 添加历史(压缩后)\r\n if (options?.history?.length) {\r\n const compressedHistory = this.compressHistory(options.history)\r\n console.log(`[PromptBasedAgent] 📚 历史消息: ${options.history.length} 条 -> 压缩后: ${compressedHistory.length} 条`)\r\n for (const msg of compressedHistory) {\r\n messages.push({ role: msg.role, content: msg.content })\r\n }\r\n }\r\n\r\n // 添加当前消息\r\n messages.push({ role: 'user', content: userMessage })\r\n console.log(`[PromptBasedAgent] 📝 用户消息: \"${userMessage.slice(0, 50)}${userMessage.length > 50 ? '...' : ''}\"`)\r\n console.log(`[PromptBasedAgent] 📊 总消息数: ${messages.length}`)\r\n\r\n let iteration = 0\r\n\r\n while (iteration < this.maxIterations) {\r\n iteration++\r\n\r\n yield {\r\n type: MCPLinkEventType.ITERATION_START,\r\n timestamp: Date.now(),\r\n data: { iteration, maxIterations: this.maxIterations },\r\n }\r\n\r\n // 调用模型(带超时控制)\r\n console.log(`[PromptBasedAgent] 🤖 调用模型,迭代 ${iteration}/${this.maxIterations}...`)\r\n const modelStartTime = Date.now()\r\n \r\n const stream = streamText({ \r\n model: this.model, \r\n messages,\r\n // 设置请求超时\r\n experimental_telemetry: {\r\n isEnabled: false, // 禁用遥测以减少开销\r\n },\r\n })\r\n\r\n // 状态\r\n let fullResponse = ''\r\n let buffer = ''\r\n let inThinking = false\r\n let inToolCall = false\r\n let thinkingStarted = false\r\n let thinkingEnded = false\r\n let textStarted = false\r\n\r\n // 流式处理(带超时保护)\r\n let firstChunkReceived = false\r\n const FIRST_CHUNK_TIMEOUT = 120000 // 2分钟等待首个响应\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null\r\n \r\n // 设置超时\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timeoutId = setTimeout(() => {\r\n reject(new Error(`模型响应超时 (${FIRST_CHUNK_TIMEOUT / 1000}秒无响应)`))\r\n }, FIRST_CHUNK_TIMEOUT)\r\n })\r\n\r\n try {\r\n for await (const chunk of stream.fullStream) {\r\n // 收到第一个 chunk 后取消超时\r\n if (!firstChunkReceived) {\r\n firstChunkReceived = true\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n timeoutId = null\r\n }\r\n console.log(`[PromptBasedAgent] ⚡ 首个 chunk 到达,耗时: ${Date.now() - modelStartTime}ms`)\r\n }\r\n // 原生 reasoning 支持\r\n if (chunk.type === 'reasoning') {\r\n if (!thinkingStarted) {\r\n thinkingStarted = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n }\r\n if (chunk.textDelta) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: chunk.textDelta } }\r\n }\r\n continue\r\n }\r\n\r\n if (chunk.type === 'text-delta') {\r\n const delta = chunk.textDelta\r\n buffer += delta\r\n fullResponse += delta\r\n\r\n // 简单状态机解析\r\n while (buffer.length > 0) {\r\n if (!inThinking && !inToolCall) {\r\n // 检查 <think> 开始\r\n const thinkStart = buffer.indexOf('<think>')\r\n if (thinkStart !== -1) {\r\n // 输出 <think> 之前的文本\r\n if (thinkStart > 0) {\r\n const before = buffer.substring(0, thinkStart)\r\n if (before.trim() && thinkingEnded) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: before } }\r\n }\r\n }\r\n inThinking = true\r\n if (!thinkingStarted) {\r\n thinkingStarted = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n }\r\n buffer = buffer.substring(thinkStart + 7)\r\n continue\r\n }\r\n\r\n // 检查 <tool_call> 开始\r\n const toolStart = buffer.indexOf('<tool_call>')\r\n if (toolStart !== -1) {\r\n if (toolStart > 0) {\r\n const before = buffer.substring(0, toolStart)\r\n if (before.trim() && thinkingEnded) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: before } }\r\n }\r\n }\r\n inToolCall = true\r\n buffer = buffer.substring(toolStart + 11)\r\n continue\r\n }\r\n\r\n // 没有特殊标签,检查是否可以安全输出\r\n if (!buffer.includes('<')) {\r\n if (buffer.trim() && (thinkingEnded || !thinkingStarted)) {\r\n // 如果没有思考过程,自动生成一个简短的\r\n if (!thinkingStarted && !thinkingEnded) {\r\n thinkingStarted = true\r\n thinkingEnded = true\r\n yield { type: MCPLinkEventType.THINKING_START, timestamp: Date.now(), data: {} }\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: '分析用户请求...' } }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n }\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n }\r\n buffer = ''\r\n }\r\n break\r\n }\r\n\r\n if (inThinking) {\r\n const thinkEnd = buffer.indexOf('</think>')\r\n if (thinkEnd !== -1) {\r\n const content = buffer.substring(0, thinkEnd)\r\n if (content) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content } }\r\n }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n thinkingEnded = true\r\n inThinking = false\r\n buffer = buffer.substring(thinkEnd + 8)\r\n continue\r\n }\r\n // 流式输出思考内容\r\n if (buffer.length > 10 && !buffer.includes('<')) {\r\n const safe = buffer.substring(0, buffer.length - 10)\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: safe } }\r\n buffer = buffer.substring(safe.length)\r\n }\r\n break\r\n }\r\n\r\n if (inToolCall) {\r\n const toolEnd = buffer.indexOf('</tool_call>')\r\n if (toolEnd !== -1) {\r\n inToolCall = false\r\n buffer = buffer.substring(toolEnd + 12)\r\n continue\r\n }\r\n break\r\n }\r\n\r\n break\r\n }\r\n }\r\n\r\n if (chunk.type === 'finish') {\r\n // 处理剩余内容\r\n if (buffer.trim()) {\r\n if (inThinking) {\r\n yield { type: MCPLinkEventType.THINKING_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n yield { type: MCPLinkEventType.THINKING_END, timestamp: Date.now(), data: {} }\r\n thinkingEnded = true\r\n } else if (!inToolCall) {\r\n if (!textStarted) {\r\n textStarted = true\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: buffer } }\r\n }\r\n }\r\n if (textStarted) {\r\n yield { type: MCPLinkEventType.TEXT_END, timestamp: Date.now(), data: {} }\r\n }\r\n }\r\n }\r\n } finally {\r\n // 清理超时计时器\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n\r\n // 检查工具调用\r\n const toolCall = this.parseToolCall(fullResponse)\r\n\r\n if (toolCall) {\r\n const toolCallId = `tool-${Date.now()}`\r\n\r\n // 发送工具调用事件\r\n yield {\r\n type: MCPLinkEventType.TOOL_CALL_START,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolCallId, toolArgs: toolCall.arguments },\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_EXECUTING,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolCallId, toolArgs: toolCall.arguments },\r\n }\r\n\r\n // 执行工具\r\n const toolStartTime = Date.now()\r\n let result: unknown\r\n let isError = false\r\n\r\n try {\r\n result = await this.mcpManager.callTool(toolCall.name, toolCall.arguments)\r\n } catch (error) {\r\n result = error instanceof Error ? error.message : String(error)\r\n isError = true\r\n }\r\n\r\n const duration = Date.now() - toolStartTime\r\n\r\n yield {\r\n type: MCPLinkEventType.TOOL_RESULT,\r\n timestamp: Date.now(),\r\n data: { toolName: toolCall.name, toolResult: result, toolCallId, duration, isError },\r\n }\r\n\r\n // 更新消息历史\r\n messages.push({ role: 'assistant', content: fullResponse })\r\n\r\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2)\r\n messages.push({\r\n role: 'user',\r\n content: `工具 ${toolCall.name} 返回结果:\\n${resultStr}\\n\\n请根据结果用中文回复用户。`,\r\n })\r\n\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n continue\r\n }\r\n\r\n console.log(`[PromptBasedAgent] ✅ 模型响应完成,耗时: ${Date.now() - modelStartTime}ms,响应长度: ${fullResponse.length}`)\r\n\r\n // 没有工具调用\r\n // 如果没有任何输出,尝试直接输出响应\r\n if (!textStarted && fullResponse.trim()) {\r\n // 清理标签后输出\r\n let cleanText = fullResponse\r\n .replace(/<think>[\\s\\S]*?<\\/think>/gi, '')\r\n .replace(/<tool_call>[\\s\\S]*?<\\/tool_call>/gi, '')\r\n .trim()\r\n\r\n if (cleanText) {\r\n yield { type: MCPLinkEventType.TEXT_START, timestamp: Date.now(), data: {} }\r\n yield { type: MCPLinkEventType.TEXT_DELTA, timestamp: Date.now(), data: { content: cleanText } }\r\n yield { type: MCPLinkEventType.TEXT_END, timestamp: Date.now(), data: {} }\r\n }\r\n }\r\n\r\n yield { type: MCPLinkEventType.ITERATION_END, timestamp: Date.now(), data: { iteration } }\r\n break\r\n }\r\n\r\n yield {\r\n type: MCPLinkEventType.COMPLETE,\r\n timestamp: Date.now(),\r\n data: { totalDuration: Date.now() - startTime, totalIterations: iteration },\r\n }\r\n }\r\n}\r\n","import type { LanguageModel } from 'ai'\r\nimport { MCPManager } from './MCPManager.js'\r\nimport { Agent } from './Agent.js'\r\nimport { PromptBasedAgent } from './PromptBasedAgent.js'\r\nimport type {\r\n MCPLinkConfig,\r\n MCPServerConfig,\r\n ChatCallbacks,\r\n ChatResult,\r\n MCPLinkEvent,\r\n MCPTool,\r\n MCPServerStatus,\r\n} from './types.js'\r\n\r\n/**\r\n * 支持原生 Function Calling(工具调用)的模型模式列表\r\n * 这些模型使用 Agent.ts(原生工具调用模式)\r\n * \r\n * 注意:某些\"思考模型\"(thinking models)虽然支持工具调用,\r\n * 但需要特殊的 API 处理(如 thought_signature),暂不支持\r\n */\r\nconst NATIVE_FUNCTION_CALLING_PATTERNS = [\r\n // OpenAI GPT 系列 - 支持原生 function calling\r\n /^gpt/i,\r\n // OpenAI o1/o3 需要特殊处理,暂用 PromptBased\r\n // /^o1/i,\r\n // /^o3/i,\r\n // Anthropic Claude - 支持原生 function calling\r\n /^claude/i,\r\n // Google Gemini 稳定版 - 支持原生 function calling\r\n // 注意:gemini-*-preview/thinking 版本需要特殊处理,不在此列表\r\n /^gemini-[\\d.]+-flash$/i,\r\n /^gemini-[\\d.]+-pro$/i,\r\n /^gemini-pro$/i,\r\n /^gemini-flash$/i,\r\n // Mistral - 支持原生 function calling\r\n /^mistral/i,\r\n /^mixtral/i,\r\n // Cohere Command-R - 支持原生 function calling\r\n /^command-r/i,\r\n]\r\n\r\n/**\r\n * 需要使用 Prompt-Based 方式的模型\r\n * 这些模型:\r\n * 1. 不支持原生 function calling\r\n * 2. 是\"思考模型\",需要特殊 API 处理(如 thought_signature)\r\n */\r\nconst PROMPT_BASED_PATTERNS = [\r\n // DeepSeek(不支持原生 function calling)\r\n /deepseek/i,\r\n // OpenAI o1/o3 思考模型\r\n /^o1/i,\r\n /^o3/i,\r\n // Gemini 思考/预览版本 - 需要 thought_signature,暂用 PromptBased\r\n /gemini.*preview/i,\r\n /gemini.*thinking/i,\r\n /gemini.*exp/i,\r\n // 开源模型(大多数不支持原生 function calling)\r\n /^llama/i,\r\n /^phi-/i,\r\n /^qwen/i,\r\n /^yi-/i,\r\n /^glm/i,\r\n /^baichuan/i,\r\n]\r\n\r\n/**\r\n * 检测模型是否支持原生 Function Calling\r\n * @param modelId 模型 ID\r\n * @returns true = 使用原生 Agent, false = 使用 PromptBasedAgent\r\n */\r\nfunction detectNativeToolSupport(modelId: string): boolean {\r\n console.log(`[MCPLink] 🔍 检测模型: \"${modelId}\"`)\r\n \r\n // 先检查是否明确需要 Prompt-Based(包括思考模型)\r\n for (const pattern of PROMPT_BASED_PATTERNS) {\r\n if (pattern.test(modelId)) {\r\n console.log(`[MCPLink] ✅ Model \"${modelId}\" -> PromptBasedAgent (matched: ${pattern})`)\r\n return false\r\n }\r\n }\r\n\r\n // 检查是否支持原生 function calling\r\n for (const pattern of NATIVE_FUNCTION_CALLING_PATTERNS) {\r\n if (pattern.test(modelId)) {\r\n console.log(`[MCPLink] ✅ Model \"${modelId}\" -> Agent (原生模式, matched: ${pattern})`)\r\n return true\r\n }\r\n }\r\n\r\n // 默认使用 Prompt-Based(更安全,兼容未知模型,提供思考过程)\r\n console.log(`[MCPLink] ⚠️ Model \"${modelId}\" -> PromptBasedAgent (未知模型,默认)`)\r\n return false\r\n}\r\n\r\n/**\r\n * MCPLink 主类\r\n * AI Agent 工具调用框架的入口\r\n */\r\nexport class MCPLink {\r\n private model: LanguageModel\r\n private mcpManager: MCPManager\r\n private agent: Agent\r\n private promptBasedAgent: PromptBasedAgent\r\n private config: MCPLinkConfig\r\n private initialized = false\r\n private detectedNativeSupport: boolean\r\n\r\n constructor(config: MCPLinkConfig) {\r\n this.config = config\r\n this.model = config.model\r\n this.mcpManager = new MCPManager()\r\n\r\n // 添加配置的 MCP 服务器\r\n if (config.mcpServers) {\r\n for (const [id, serverConfig] of Object.entries(config.mcpServers)) {\r\n this.mcpManager.addServer(id, serverConfig)\r\n }\r\n }\r\n\r\n // 创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: config.systemPrompt,\r\n maxIterations: config.maxIterations,\r\n })\r\n\r\n // 创建 PromptBasedAgent\r\n this.promptBasedAgent = new PromptBasedAgent(this.model, this.mcpManager, {\r\n systemPrompt: config.systemPrompt,\r\n maxIterations: config.maxIterations,\r\n })\r\n\r\n // 自动检测模型是否支持原生工具调用\r\n // 如果用户强制指定了,则使用用户的设置\r\n if (config.usePromptBasedTools === true) {\r\n this.detectedNativeSupport = false\r\n } else if (config.usePromptBasedTools === false) {\r\n this.detectedNativeSupport = true\r\n } else {\r\n // 'auto' 或未指定:自动检测\r\n // 优先使用 modelName,其次使用 model.modelId\r\n const modelNameToCheck = config.modelName || config.model.modelId\r\n this.detectedNativeSupport = detectNativeToolSupport(modelNameToCheck)\r\n }\r\n }\r\n\r\n /**\r\n * 初始化 - 连接所有 MCP 服务器\r\n */\r\n async initialize(): Promise<void> {\r\n if (this.initialized) {\r\n return\r\n }\r\n\r\n await this.mcpManager.startAll()\r\n this.initialized = true\r\n }\r\n\r\n /**\r\n * 关闭 - 断开所有 MCP 服务器连接\r\n */\r\n async close(): Promise<void> {\r\n await this.mcpManager.stopAll()\r\n this.initialized = false\r\n }\r\n\r\n /**\r\n * 发起对话\r\n */\r\n async chat(message: string, callbacks?: ChatCallbacks): Promise<ChatResult> {\r\n if (!this.initialized) {\r\n await this.initialize()\r\n }\r\n\r\n return this.agent.chat(message, callbacks)\r\n }\r\n\r\n /**\r\n * 流式对话\r\n * @param message 用户消息\r\n * @param options 可选参数\r\n * @param options.allowedTools 允许使用的工具名称列表\r\n * @param options.history 历史消息列表\r\n */\r\n async *chatStream(\r\n message: string,\r\n options?: {\r\n allowedTools?: string[]\r\n history?: Array<{ role: 'user' | 'assistant'; content: string }>\r\n }\r\n ): AsyncGenerator<MCPLinkEvent> {\r\n if (!this.initialized) {\r\n await this.initialize()\r\n }\r\n\r\n // 根据检测结果选择 Agent\r\n if (this.detectedNativeSupport) {\r\n yield* this.agent.chatStream(message, options)\r\n } else {\r\n yield* this.promptBasedAgent.chatStream(message, options)\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前使用的模式\r\n */\r\n getToolCallingMode(): 'native' | 'prompt-based' {\r\n return this.detectedNativeSupport ? 'native' : 'prompt-based'\r\n }\r\n\r\n // ============ MCP 服务器管理 ============\r\n\r\n /**\r\n * 添加 MCP 服务器\r\n */\r\n addMCPServer(id: string, config: MCPServerConfig): void {\r\n this.mcpManager.addServer(id, config)\r\n }\r\n\r\n /**\r\n * 移除 MCP 服务器\r\n */\r\n async removeMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.removeServer(id)\r\n }\r\n\r\n /**\r\n * 启动指定 MCP 服务器\r\n */\r\n async startMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.startServer(id)\r\n }\r\n\r\n /**\r\n * 停止指定 MCP 服务器\r\n */\r\n async stopMCPServer(id: string): Promise<void> {\r\n await this.mcpManager.stopServer(id)\r\n }\r\n\r\n /**\r\n * 获取所有 MCP 服务器状态\r\n */\r\n getMCPServerStatuses(): MCPServerStatus[] {\r\n return this.mcpManager.getServerStatuses()\r\n }\r\n\r\n /**\r\n * 获取所有可用工具\r\n */\r\n getTools(): MCPTool[] {\r\n return this.mcpManager.getAllTools()\r\n }\r\n\r\n /**\r\n * 手动调用工具\r\n */\r\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\r\n return this.mcpManager.callTool(toolName, args)\r\n }\r\n\r\n // ============ 配置管理 ============\r\n\r\n /**\r\n * 更新系统提示词\r\n */\r\n setSystemPrompt(prompt: string): void {\r\n this.config.systemPrompt = prompt\r\n // 重新创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: prompt,\r\n maxIterations: this.config.maxIterations,\r\n })\r\n }\r\n\r\n /**\r\n * 更新 AI 模型\r\n */\r\n setModel(model: LanguageModel): void {\r\n this.model = model\r\n this.config.model = model\r\n // 重新创建 Agent\r\n this.agent = new Agent(this.model, this.mcpManager, {\r\n systemPrompt: this.config.systemPrompt,\r\n maxIterations: this.config.maxIterations,\r\n })\r\n }\r\n}\r\n"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@n0ts123/mcplink-core",
3
+ "version": "0.0.1",
4
+ "description": "MCPLink 核心 SDK - AI Agent 工具调用框架",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "dev": "tsup --watch --no-clean",
20
+ "build": "tsup",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "npx tsx test/simple-test.ts",
23
+ "test:agent": "npx tsx test/prompt-based-agent.test.ts",
24
+ "test:tool": "npx tsx test/tool-call-test.ts",
25
+ "test:api": "npx tsx test/api-test.ts",
26
+ "test:todo": "npx tsx test/todo-test.ts",
27
+ "test:thinking": "npx tsx test/thinking-test.ts",
28
+ "test:mock": "npx tsx test/tool-continue-test.ts",
29
+ "test:frontend": "npx tsx test/frontend-simulate-test.ts"
30
+ },
31
+ "dependencies": {
32
+ "ai": "^4.0.0",
33
+ "@ai-sdk/openai": "^1.0.0",
34
+ "@ai-sdk/anthropic": "^1.0.0",
35
+ "@modelcontextprotocol/sdk": "^1.0.0",
36
+ "zod": "^3.23.0"
37
+ },
38
+ "devDependencies": {
39
+ "typescript": "^5.6.0",
40
+ "tsup": "^8.3.0",
41
+ "@types/node": "^22.0.0",
42
+ "dotenv": "^16.4.0"
43
+ },
44
+ "keywords": [
45
+ "mcp",
46
+ "ai",
47
+ "agent",
48
+ "llm",
49
+ "tool-calling",
50
+ "openai",
51
+ "claude"
52
+ ],
53
+ "license": "MIT",
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/N0ts/MCPLink.git",
57
+ "directory": "packages/core"
58
+ },
59
+ "homepage": "https://github.com/N0ts/MCPLink#readme",
60
+ "bugs": {
61
+ "url": "https://github.com/N0ts/MCPLink/issues"
62
+ },
63
+ "author": "N0ts",
64
+ "publishConfig": {
65
+ "access": "public"
66
+ }
67
+ }