参考express风格的mcpServer飞书聊天机器人事件回调测试mqtt接入事件回调测试安装依赖npminstallanthropic-ai/sdk modelcontextprotocol/sdk zod ming_nodemcp_server.jsimport{z}fromzod;importMfromming_node;importMyMcpServerfrom./lib/StdioMcpServer.js;constappnewMyMcpServer(my_mcp_server);app.listen(3000);app.begin((req,res){M.log(开始执行,req.mcpName,JSON.stringify(req.params));})app.end((req,res){M.log(执行完成,req.mcpName,res.result);})app.get(加法,{a:z.number(),b:z.number(),},async(req,res){const{a,b}req.params;constcab1;res.send(c);});app.get(设置转速,{speed:z.number()},async(req,res){const{speed}req.params;M.log(转速设置为${speed});res.send(转速设置完成);});agentimportAnthropicfromanthropic-ai/sdk;import{Client}frommodelcontextprotocol/sdk/client/index.js;import{StdioClientTransport}frommodelcontextprotocol/sdk/client/stdio.js;// ─────────────────────────────────────────────// 配置区需要修改时只动这里// ─────────────────────────────────────────────constCONFIG{api:{apiKey:ak_xxx,baseURL:https://api.longcat.chat/anthropic,model:LongCat-Flash-Chat,// ── messages.create 全参数 ──────────────maxTokens:1024,// 最大输出 token 数必填system:你是一个智能助手请用中文回答。,// 系统提示词temperature:1.0,// 随机性 0~1与 top_p 二选一// top_p: 0.9, // 核采样与 temperature 二选一// top_k: 50, // 只从概率最高的 K 个 token 中采样// stopSequences: [END], // 遇到这些字符串时停止生成// toolChoice: auto, // auto | any | none | { type:tool, name:xx }// metadata: { user_id: u1 }, // 请求元数据// stream: false, // 是否流式返回},server:{command:node,args:[mcp_server.js],// 切换 MCP Server 只改这里},};// ─────────────────────────────────────────────// 初始化 Anthropic 客户端// ─────────────────────────────────────────────functioncreateAnthropicClient(){returnnewAnthropic({apiKey:CONFIG.api.apiKey,baseURL:CONFIG.api.baseURL,defaultHeaders:{Authorization:Bearer${CONFIG.api.apiKey},x-api-key:CONFIG.api.apiKey,},});}// ─────────────────────────────────────────────// 初始化 MCP 客户端// ─────────────────────────────────────────────asyncfunctioncreateMcpClient(){consttransportnewStdioClientTransport(CONFIG.server);constclientnewClient({name:agent,version:1.0.0},{capabilities:{}});awaitclient.connect(transport);returnclient;}// MCP 工具格式 → Claude 工具格式functiontoClaudeTool(tool){return{name:tool.name,description:tool.description,input_schema:tool.inputSchema,};}// ─────────────────────────────────────────────// Agent 主循环// ─────────────────────────────────────────────asyncfunctionrunAgent(anthropic,mcpClient,tools,userMessage){console.log(\n${─.repeat(48)});console.log(${userMessage});console.log(─.repeat(48));constmessages[{role:user,content:userMessage}];while(true){constresponseawaitanthropic.messages.create({// ── 必填 ────────────────────────────model:CONFIG.api.model,max_tokens:CONFIG.api.maxTokens,messages,// ── 可选从 CONFIG 读取注释掉的参数不传 ──system:CONFIG.api.system,temperature:CONFIG.api.temperature,tools,// top_p: CONFIG.api.top_p,// top_k: CONFIG.api.top_k,// stop_sequences: CONFIG.api.stopSequences,// tool_choice: CONFIG.api.toolChoice,// metadata: CONFIG.api.metadata,// stream: CONFIG.api.stream,});// Claude 回复纯文本 → 任务完成if(response.stop_reasonend_turn){consttextresponse.content.find(bb.typetext)?.text;if(text)console.log(\n${text});break;}// Claude 请求调用工具if(response.stop_reasontool_use){messages.push({role:assistant,content:response.content});consttoolResultsawaitexecuteTools(mcpClient,response.content);messages.push({role:user,content:toolResults});}}}// 执行本轮所有工具调用返回结果列表asyncfunctionexecuteTools(mcpClient,contentBlocks){constresults[];for(constblockofcontentBlocks.filter(bb.typetool_use)){console.log(${block.name}(${JSON.stringify(block.input)}));constresultawaitmcpClient.callTool({name:block.name,arguments:block.input,});consttextresult.content[0]?.text??;console.log(→${text});results.push({type:tool_result,tool_use_id:block.id,content:text,});}returnresults;}// ─────────────────────────────────────────────// 入口// ─────────────────────────────────────────────asyncfunctionmain(){constanthropiccreateAnthropicClient();constmcpClientawaitcreateMcpClient();try{const{tools:mcpTools}awaitmcpClient.listTools();consttoolsmcpTools.map(toClaudeTool);console.log( 已连接可用工具${tools.map(tt.name).join(, )});// ↓ 在这里添加更多对话awaitrunAgent(anthropic,mcpClient,tools,帮我算一下 12 34然后把转速设置为 300);}finally{awaitmcpClient.close();}}main();测试$nodeagent.js 已连接可用工具加法, 设置转速 ──────────────────────────────────────────────── 帮我算一下1234然后把转速设置为300──────────────────────────────────────────────── 加法({a:12,b:34})→47 设置转速({speed:300})→ 转速设置完成 计算结果为46转速已设置为300