McpAgentExecutor:用几行代码让模型自主调用 HTTP 工具多步推理
标签JavaMCPFunction CallingAgentj-langchainMcpAgentExecutor工具调用前置阅读Java Agent 集成 MCP 工具协议让 AI 真正驱动企业系统 → MCP Function Calling让模型自主驱动工具链完成多步推理适合人群已配置好 MCP 工具不想手写 Function Calling 循环的 Java 开发者一、上篇留下的样板代码上篇文章实现了一个完整的MCP Function Calling多步推理链路核心部分大致是这样的// 循环条件有 ToolCall 就继续FunctionInteger,BooleanshouldContinueround-{...};// 工具执行处理器解析 ToolCall → 执行 MCP → 写回 ObservationTranslateHandlerObject,AIMessageexecuteMcpToolnewTranslateHandler(msg-{// 把 ToolCall 记入历史// 解析工具名和参数// 执行 mcpManager.runForInput(...)// 把结果以 ToolMessage 写回 Prompt...});// 组装链路FlowInstancechainchainActor.builder().next(prompt).loop(shouldContinue,llm,chainActor.builder().next(Info.c(needsToolExecution,executeMcpTool),Info.c(...)).build()).next(newStrOutputParser()).build();这段代码的结构是正确的理解它对掌握底层原理很有价值。但如果项目中有多个 Agent 都要接 MCP 工具每次都写这些样板代码就显得多余了。McpAgentExecutor把这些逻辑封装进去对外只暴露真正需要配置的部分用哪个模型、加载哪组工具、系统提示写什么。二、最简示例五行代码完成多步工具调用TestpublicvoidmcpManagerAgent(){McpAgentExecutoragentMcpAgentExecutor.builder(chainActor).llm(ChatAliyun.builder().model(qwen3.6-plus).temperature(0f).build()).tools(mcpManager,default)// 加载 mcp.config.json 的 default 工具组.systemPrompt(你是一个智能助手可以调用工具获取信息后回答用户问题。).maxIterations(5).onToolCall(tc-System.out.println( Tool call: tc)).onObservation(obs-System.out.println( Observation: obs)).build();ChatGenerationresultagent.invoke(帮我查一下我的公网 IP 是什么);System.out.println(\n 最终答案 );System.out.println(result.getText());}.tools(mcpManager, default)这一行做了上篇需要手写的所有准备工作读取mcp.config.json中default分组的工具列表转成 Function Calling 所需的 JSON Schema注册给模型。三、执行效果 Tool call: ToolCall(id..., functionget_export_ip, arguments{}) Observation: 123.117.177.40 最终答案 你的公网 IP 为 123.117.177.40。如果换一个需要多步推理的问题例如查我的公网 IP 并告诉我当前天气模型会在同一次invoke中自动完成多轮 ToolCall整个过程对调用方完全透明 Tool call: get_export_ip → 123.117.177.40 Tool call: get_ip_location → {city: Dongcheng Qu, latitude: 39.91, ...} Tool call: get_weather_open_meteo → {temperature: 18.3, weathercode: 1} 最终答案 你位于北京市东城区当前气温 18.3°C天气晴朗。工具数量、调用顺序、参数拼装全部由模型决定开发者只需保证所需工具在mcp.config.json的同一分组中。四、与上篇手写版本的对比维度手写 Function Calling 循环文章 11McpAgentExecutor本篇代码量~60 行循环、处理器、链路组装~10 行循环逻辑自己维护shouldContinue和处理器框架内置ToolCall 解析手动解析 JSON、写回 ToolMessage框架自动处理调试能力完全自定义日志位置onToolCall/onObservation回调适合场景需要在循环内插入自定义逻辑标准工具调用无需定制两种方式并不互斥。McpAgentExecutor处理不了的场景比如工具调用前需要做权限校验或者需要根据中间结果动态切换工具组退回手写循环即可。五、Builder 参数说明参数必填说明llm(...)✅支持 Function Calling 的模型如阿里云qwen3.6-plus、OpenAIgpt-4otools(mcpManager, group)✅从McpManager加载指定分组的工具systemPrompt(...)✅告诉模型它能做什么以及任务的约束条件maxIterations(n)可选最大工具调用轮次默认 5复杂任务可适当调大onToolCall(...)可选每次 ToolCall 触发时的回调可用于埋点、审计onObservation(...)可选工具执行结果回调可用于实时展示进度六、几个实用建议System Prompt 要具体。笼统的你是智能助手往往不够用最好说明任务目标和约束例如你是一个网络诊断助手可以调用工具检测公网 IP、查询地理位置和天气。 请按需调用工具获取足够信息后直接给出结论不要询问用户额外信息。按业务域拆分工具组。mcp.config.json支持多个分组建议按职责拆分不同 Agent 加载各自需要的组{network:[get_export_ip,get_ip_location],weather:[get_weather_open_meteo],crm:[query_customer,update_order]}这样做有两个好处模型不会因为看到不相关的工具而产生错误调用每个分组的工具列表更短Function Calling 的准确率更高。maxIterations留有余量但不要过大。一般按预估最大 ToolCall 次数 2 来设置。设得过大时如果模型陷入重复调用会消耗更多 Token 才能触发终止条件。七、总结McpAgentExecutor解决的问题很直接上篇手写的那 60 行样板代码现在 10 行搞定内部机制完全相同。工具的维护和 Agent 的逻辑彻底分离——改工具只需改mcp.config.json改 Agent 行为只需改systemPrompt和maxIterations两者互不影响。如果你需要让 Agent 同时操作文件系统、数据库等 NPX MCP 服务器下一篇会介绍McpClient版本的McpAgentExecutor接入方式与本篇基本一致。 相关资源完整示例Article12McpManagerAgent.java对应方法mcpManagerAgent()工具配置mcp.config.jsonj-langchain GitHubhttps://github.com/flower-trees/j-langchainj-langchain Gitee 镜像https://gitee.com/flower-trees-z/j-langchain运行环境需配置阿里云 API Key示例模型qwen3.6-plus