当前位置: 首页 > news >正文

AnthropicSDK实现Agent调用MCP服务

参考

express风格的mcpServer

飞书聊天机器人事件回调测试

mqtt接入事件回调测试

安装依赖

npminstall@anthropic-ai/sdk @modelcontextprotocol/sdk zod ming_node

mcp_server.js

import{z}from'zod';importMfrom"ming_node";importMyMcpServerfrom"./lib/StdioMcpServer.js";constapp=newMyMcpServer("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;constc=a+b+1;res.send(c);});app.get("设置转速",{speed:z.number()},async(req,res)=>{const{speed}=req.params;M.log(`转速设置为${speed}`);res.send("转速设置完成");});

agent

importAnthropicfrom"@anthropic-ai/sdk";import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport}from"@modelcontextprotocol/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(){consttransport=newStdioClientTransport(CONFIG.server);constclient=newClient({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){constresponse=awaitanthropic.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_reason==="end_turn"){consttext=response.content.find(b=>b.type==="text")?.text;if(text)console.log(`\n🤖${text}`);break;}// Claude 请求调用工具if(response.stop_reason==="tool_use"){messages.push({role:"assistant",content:response.content});consttoolResults=awaitexecuteTools(mcpClient,response.content);messages.push({role:"user",content:toolResults});}}}// 执行本轮所有工具调用,返回结果列表asyncfunctionexecuteTools(mcpClient,contentBlocks){constresults=[];for(constblockofcontentBlocks.filter(b=>b.type==="tool_use")){console.log(`🔧${block.name}(${JSON.stringify(block.input)})`);constresult=awaitmcpClient.callTool({name:block.name,arguments:block.input,});consttext=result.content[0]?.text??"";console.log(`${text}`);results.push({type:"tool_result",tool_use_id:block.id,content:text,});}returnresults;}// ─────────────────────────────────────────────// 入口// ─────────────────────────────────────────────asyncfunctionmain(){constanthropic=createAnthropicClient();constmcpClient=awaitcreateMcpClient();try{const{tools:mcpTools}=awaitmcpClient.listTools();consttools=mcpTools.map(toClaudeTool);console.log(`🔌 已连接,可用工具:${tools.map(t=>t.name).join(", ")}`);// ↓ 在这里添加更多对话awaitrunAgent(anthropic,mcpClient,tools,"帮我算一下 12 + 34,然后把转速设置为 300");}finally{awaitmcpClient.close();}}main();

测试

$nodeagent.js 🔌 已连接,可用工具:加法, 设置转速 ──────────────────────────────────────────────── 👤 帮我算一下12+34,然后把转速设置为300──────────────────────────────────────────────── 🔧 加法({"a":12,"b":34})47🔧 设置转速({"speed":300})→ 转速设置完成 🤖 计算结果为46,转速已设置为300
http://www.jsqmd.com/news/463687/

相关文章:

  • System Manager vs NixOS:5大关键差异与选择指南
  • 为什么选择auto-commit?5个理由让你告别手动编写提交信息
  • graphql-client与reqwest集成:构建企业级GraphQL客户端
  • Label-Studio+SAM半自动化标注:OpenMMLab Playground提升标注效率10倍的秘诀
  • Terraform-tui深度解析:从状态树可视化到资源操作的终极教程
  • 智能化项目管理平台:AI 驱动软件研发的革命性变革
  • Python Project Template扩展指南:定制属于你的项目模板
  • Neuromancer与PyTorch深度集成:构建可微编程优化模型的终极教程
  • 从论文到代码:OpenSeg.pytorch中ISA模块的实现细节与优化技巧
  • Rust 错误处理完全指南:基于 RustMagazine 2021 的 Result 类型详解
  • dump常用命令
  • Emacs日程管理效率提升300%:calfw高级自定义技巧
  • python-OBD高级应用:自定义命令与数据解析技巧
  • discord-irc配置详解:从基础到高级的完整教程
  • django-user-accounts安全最佳实践:保护用户数据的7个关键技巧
  • 基于DSP5509的胎心检测算法探索
  • Cloud SQL与Bank of Anthos集成:告别本地数据库的完整方案
  • Style Guide Guide路线图详解:未来功能规划与设计系统演进方向
  • TVSample开发指南:自定义ViewBorder实现焦点高亮效果
  • thr/thread-pool编译指南:Linux与Windows环境下的CMake配置
  • Orca源码解析:从LinkedInActivityScraper到Insight生成的全链路
  • Logistic Regression在BitVision中的应用:56.7%准确率背后的算法原理
  • 告别内存溢出:tstorage如何解决时序数据存储的性能瓶颈
  • 蓝鲸SOPS常见问题解答:新手必知的15个运维痛点解决方案
  • Ubuntu Make vs 手动安装:为什么开发者更青睐这款工具?
  • Get-Things-Done-with-Prompt-Engineering-and-LangChain完全指南:从入门到构建AI应用
  • 终极Teensy渗透工具Brutal:从零开始掌握HID攻击的完整指南
  • StyleCop规则开发指南:如何为你的团队创建自定义代码规范
  • NASA Astrobee Robot Software完全指南:从国际空间站机器人到开源代码探索
  • Point2Mesh源码解析:网络结构与损失函数设计深度剖析