构建 Cline 级智能体:LangChain 与 MCP Server 的深度集成实战

本文档详细复盘了我们如何基于 LangChain 构建一个能够连接 Model Context Protocol (MCP) Server 的智能 Agent (GithubAgent)。我们的目标是复刻 Cline 等先进 IDE 插件的核心能力:自动工具发现自动规则注入以及智能工具调用

1. 架构概览:GithubAgent 的解剖

GithubAgent不仅仅是一个简单的 LLM 包装器,它是一个具备完整思考-行动-观察 (ReAct)循环的自治单元。

1.1 调用链路图

MCP Server (GitHub)Gemini ModelGithubAgent前端用户MCP Server (GitHub)Gemini ModelGithubAgent前端用户初始化阶段循环结束alt[发现 ToolCall][无 ToolCall]loop[ReAct Loop]"列出我的 repo"SSE Connect & HandshakeInitializeResult (含 Instructions)注入 System PromptListToolsTools List (含 Schema & Description)转换为 StructuredTool (Pydantic)Bind Tools对话历史 (Messages)AIMessage (含 ToolCall: get_repo_list)yield "[Thinking: Calling get_repo_list...]"CallTool(get_repo_list, args)ToolResult (Repo JSON)Append ToolMessage to Historyyield "Here are your repos..." (流式文本)

1.2 Agent 内部方法调用流 (Internal Flow)

为了更清晰地展示代码结构,我们将GithubAgent内部的方法调用关系绘制如下:

ReAct Loop

1. 初始化连接
2. 提取指令
3. 获取工具
4. 转换工具
5. 绑定模型
6. 进入循环

Stream

Decide

No

Yes

Result

Continue

_connect_and_execute

session.initialize()

_extract_instructions

_fetch_mcp_tools

_convert_mcp_tools

llm.bind_tools()

_agent_loop

LLM.astream()

Has Tool Calls?

Break Loop

_execute_tool_call

Append ToolMessage

2. 核心方法详解

代码:
https://github.com/jason-nvd11-org/askc-backend/blob/github-mcp-agent/src/agents/github_agent.py

为了实现上述架构,我们将GithubAgent拆分为五个单一职责的核心方法。

2.1_fetch_mcp_tools: 工具发现

代码职责:连接 MCP Server,拉取原始工具定义。

asyncdef_fetch_mcp_tools(self,session:ClientSession)->List[McpTool]:logger.info("Fetching tools from MCP...")result=awaitsession.list_tools()returnresult.tools

解释:这是实现“自动发现”的第一步。无论 Server 端增加了什么新工具,Agent 只要重启就能看到。

2.2_convert_mcp_tools: 智能适配器

代码职责:将 MCP 的 JSON Schema 转换为 LangChainStructuredTool
关键技术pydantic.create_model

def_convert_mcp_tools(self,mcp_tools:List[McpTool],session:ClientSession)->List[StructuredTool]:# ... 遍历 mcp_tools ...args_model=create_model(f"{tool.name}Schema",**fields)returnStructuredTool.from_function(...,args_schema=args_model)

解决的问题:这是解决“参数对齐”的关键。它确保 LLM 知道参数名是owner而不是username

2.3_extract_instructions: 规则注入

代码职责:从握手响应中提取 Server 端的instructions

def_extract_instructions(self,init_result:Any)->str:ifhasattr(init_result,'instructions')andinit_result.instructions:returnf"\n\n[Server Instructions]\n{init_result.instructions}"return""

解决的问题:Cline 能读懂 Server 的“潜规则”(如“别用浏览器”),靠的就是这一步。我们将这些规则强行注入到了 System Prompt 中。

2.4_agent_loop: 大脑回路

代码职责:维护 ReAct 循环,处理流式输出与工具调用的分流。

asyncdef_agent_loop(self,llm_with_tools,session,messages):whileTrue:# 1. 思考 (Think)asyncforchunkinllm_with_tools.astream(messages):# ... 累加 chunk ...ifchunk.content:yieldchunk# 实时输出文本# 2. 决策 (Decide)ifnotgetattr(final_chunk,'tool_calls',None):break# 没工具用,结束# 3. 行动 (Act)fortool_callinfinal_chunk.tool_calls:yieldAIMessageChunk(content=f"[Thinking: Calling{tool_call['name']}...]")tool_msg=awaitself._execute_tool_call(session,tool_call)messages.append(tool_msg)

2.5 流式输出机制 (Streaming Mechanism)

Agent 的流式能力不仅仅是简单地调用 LLM 的astream,它实现了一个混合流 (Hybrid Stream)

  1. 透传流 (Pass-through):
    当 LLM 生成普通文本时,Agent 作为中间管道,收到一个 chunk 就立刻yield一个 chunk。

    asyncforchunkinllm_with_tools.astream(messages):ifchunk.content:yieldchunk
  2. 合成流 (Synthesized):
    当 Agent 处于“思考”或“执行”状态时,LLM 是静默的。为了保持前端连接活跃并提供反馈,Agent 会手动构造AIMessageChunk并推送。

    yieldAIMessageChunk(content=f"[Thinking: Calling{tool_name}...]")
  3. 协议一致性:
    无论是 LLM 生成的,还是 Agent 伪造的,输出给前端的都是标准的BaseMessageChunk对象。这使得上层调用者(如ChatService)无需区分数据来源,统一处理。

3. 关键问题深度解析

Q1: Agent 如何像 Cline 一样发现工具?

A: 通过 MCP 协议的session.list_tools()
MCP 协议标准定义了tools/list接口。只要连接建立,Client 就可以询问 Server:“你有什么本事?” Server 会返回一份详细的清单(包含名称、描述、参数结构)。我们的 Agent 正是利用这个接口实现了动态发现。

Q2: Agent 如何获取 Instructions 并注入 Prompt?

A: 通过session.initialize()的返回值。
FastMCP 框架将instructions放在了初始化握手响应(InitializeResult)中。我们的_extract_instructions方法专门负责捕获这个字段,并将其追加到self.system_prompt后。这样,LLM 在每一次对话开始前,都会先“读”一遍这份说明书。

Q3: Agent 如何读懂 Tool 的注解?

A: 通过全链路透传description字段。
Server 代码里的 docstring -> MCP Protocol (description字段) ->session.list_tools()->GithubAgent->StructuredTool(description=...)-> LLM Prompt。
我们在代码中显式地传递了description=tool.description,确保 LLM 能看到工具的用途说明。

Q4: LLM 的 Tool Call 输出在哪里?

A: 藏在AIMessage.tool_calls属性里。
现代 LLM API(OpenAI/Gemini)将“内容”与“指令”分流了。

  • Content: 给用户看的文本。当调用工具时,这通常是空的。
  • Tool Calls: 给程序看的指令。LangChain 将其解析并存放在message.tool_calls列表里。
    我们在_agent_loop中通过检查if final_chunk.tool_calls:来捕捉 LLM 的意图。

Q5: 如何实现 “Thinking…” 流式反馈?

A: 手动 YieldAIMessageChunk
既然 Tool Call 阶段content是空的,前端默认看不到任何东西。
我们在检测到tool_calls后、执行工具前,手动构造了一个包含提示文本的消息块并yield出去:

yieldAIMessageChunk(content=f"\n[Thinking: Calling tool `{tool_name}`...]\n")``` 这模拟了类似 ChatGPT 的思考状态展示。## 4. 实战演示 (Sample Output)以下是运行 `GithubAgent` 时的真实日志输出(已脱敏),展示了完整的思考与执行过程: ```text INFO|src.agents.github_agent:_connect_and_execute:110-Connecting to GitHub MCP at https://.../sse...INFO|src.agents.github_agent:_connect_and_execute:116-MCP Session initialized.INFO|src.agents.github_agent:_extract_instructions:44-Loaded server instructions.INFO|src.agents.github_agent:_fetch_mcp_tools:33-Fetched2toolsfromMCP.INFO|src.tools.mcp_tool_converter:convert:13-Converting tool:get_repo_list,Description:Fetches alistof repositories...INFO|src.agents.github_agent:_agent_loop:99-AI requested1tool calls[Thinking:Calling tool `get_repo_list`...]INFO|src.agents.github_agent:_execute_tool_call:54-Executing tool:get_repo_listwithargs:{'limit':3,'owner':'nvd11'}INFO|src.agents.github_agent:_execute_tool_call:64-Tool result:[{"name":"mail-service",...}]Here are the first3repositoriesforuser nvd11:1.mail-service:https://github.com/nvd11/mail-service2.envoy-config:https://github.com/nvd11/envoy-config3.first-mcp:https://github.com/nvd11/first-mcp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1146467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ResNet18应用指南:智能城市管理解决方案

ResNet18应用指南:智能城市管理解决方案 1. 引言:通用物体识别在智慧城市中的价值 随着城市智能化进程的加速,视觉感知能力成为构建“城市大脑”的核心基础。从交通监控到公共安全,从环境监测到设施管理,海量图像数据…

mptools v8.0配置文件解析:系统学习与实践应用

深入理解 mptools v8.0 配置系统:从结构到实战的完整指南在现代工程实践中,自动化运维工具早已不再是“可有可无”的附加组件,而是支撑高效交付、稳定运行的核心基础设施。面对日益复杂的部署环境和多变的操作需求,如何通过一份配…

ResNet18部署指南:医疗影像识别系统搭建步骤

ResNet18部署指南:医疗影像识别系统搭建步骤 1. 引言:通用物体识别中的ResNet-18价值 在现代智能系统中,图像分类是实现环境感知与决策支持的核心能力之一。尽管深度学习模型日益复杂,ResNet-18 凭借其简洁的残差结构、高效的推…

ResNet18部署案例:工业质检分类系统实现

ResNet18部署案例:工业质检分类系统实现 1. 引言:通用物体识别与ResNet-18的工程价值 在智能制造和工业自动化快速发展的背景下,视觉驱动的质量检测系统正逐步取代传统人工巡检。其中,通用图像分类技术作为基础能力,…

Java基于微信小程序的鲜花销售系统,附源码+文档说明

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

ResNet18优化指南:Batch Size调优策略

ResNet18优化指南:Batch Size调优策略 1. 引言:通用物体识别中的ResNet-18角色 在现代AI应用中,通用物体识别是计算机视觉的基础能力之一。无论是智能相册分类、内容审核,还是AR/VR场景理解,都需要一个稳定、高效、准…

初学者必备:时序逻辑电路FPGA手把手教程

从零开始:在FPGA上构建你的第一个时序逻辑电路你有没有想过,电脑是如何记住当前状态的?为什么按键按一次只触发一次动作,而不是连按十次?这些“记忆”功能的背后,其实都离不开一类关键的数字电路——时序逻…

ResNet18性能测试:不同预处理方法影响

ResNet18性能测试:不同预处理方法影响 1. 引言:通用物体识别中的ResNet-18 在现代计算机视觉系统中,通用物体识别是构建智能应用的基础能力之一。从图像搜索、内容审核到自动驾驶感知,精准的图像分类模型不可或缺。其中&#xf…

ResNet18应用实例:智能交通监控系统

ResNet18应用实例:智能交通监控系统 1. 引言:通用物体识别与ResNet-18的工程价值 在智能交通系统(ITS)中,实时、准确地感知道路环境是实现车辆调度、违章检测和事故预警的核心前提。传统的图像识别方案依赖人工特征提…

ResNet18部署指南:Azure云服务最佳配置

ResNet18部署指南:Azure云服务最佳配置 1. 背景与应用场景 1.1 通用物体识别的工程需求 在当前AI应用快速落地的背景下,通用图像分类已成为智能监控、内容审核、自动化标注等场景的核心能力。ResNet-18作为经典轻量级卷积神经网络,在精度与…

多层工业控制板中走线宽度与载流优化策略

走线宽度与载流能力:工业控制板设计中的“看不见的保险丝”你有没有遇到过这样的情况?一块PLC主板在实验室测试时一切正常,可一旦部署到现场满负荷运行几小时后,突然无故重启——排查半天发现,不是软件崩溃&#xff0c…

ResNet18性能对比:CPU与GPU推理效率测试

ResNet18性能对比:CPU与GPU推理效率测试 1. 引言:通用物体识别中的ResNet-18角色 在现代计算机视觉系统中,通用物体识别是构建智能应用的基础能力之一。无论是图像搜索、内容审核,还是增强现实和自动驾驶感知模块,都…

通俗解释RISC-V异常委托与权限控制

RISC-V异常委托与权限控制:从“谁该处理”说起你有没有想过,当你的程序执行一条非法指令、访问了不该碰的内存地址,或者调用了系统服务时,CPU是怎么知道“该找谁来管这件事”的?在x86或ARM上,这些机制早已被…

Keil5安装后无法识别STC89C52?常见问题深度剖析

Keil5装好了却找不到STC89C52?别急,这锅真不怪你 最近在实验室带学生做单片机实验时,又一个同学举手:“老师,Keil5我按教程一步步装完,怎么新建工程搜‘STC89C52’啥都找不到?” 这不是个例—…

ResNet18部署教程:云端推理服务配置详细步骤

ResNet18部署教程:云端推理服务配置详细步骤 1. 引言 1.1 通用物体识别的工程需求 在当前AI应用快速落地的背景下,通用图像分类作为计算机视觉的基础能力,广泛应用于内容审核、智能相册、零售分析和辅助驾驶等场景。然而,许多开…

超详细版OpenAMP入门指南:从编译到调试全过程

OpenAMP实战手记:从零跑通Zynq双核通信的每一步最近接手一个工业控制项目,客户要求在Xilinx Zynq-7000上实现Linux 实时核的协同处理。核心诉求很明确:Cortex-A9跑网络和UI,Cortex-M4负责高精度ADC采样与电机控制,两核…

ResNet18部署指南:微服务架构实现

ResNet18部署指南:微服务架构实现 1. 通用物体识别 - ResNet18 技术背景 在当前AI应用快速落地的背景下,通用图像分类作为计算机视觉的基础任务之一,广泛应用于内容审核、智能相册、自动驾驶感知系统和增强现实等场景。其中,Res…

ResNet18技术解析:卷积神经网络的基础原理

ResNet18技术解析:卷积神经网络的基础原理 1. 引言:通用物体识别中的ResNet18 在计算机视觉领域,图像分类是基础且关键的任务之一。从智能手机相册的自动标签到自动驾驶系统的环境感知,背后都离不开强大的图像识别模型。其中&am…

一文说清硬件电路中的LDO设计要点

LDO设计的“坑”与“道”:从选型到热管理,一文讲透硬件电路中的关键细节在嵌入式系统和高精度电子设备的设计中,电源往往决定成败。而在这条“看不见”的电力通路末端,低压差线性稳压器(LDO)常常扮演着“守…

ResNet18部署指南:企业级图像识别服务配置

ResNet18部署指南:企业级图像识别服务配置 1. 引言:通用物体识别的工程化需求 在当前AI应用快速落地的背景下,通用物体识别已成为智能安防、内容审核、自动化分拣、AR交互等场景的核心能力之一。尽管深度学习模型层出不穷,但在实…