一文搞懂MCP、FunctionCalling与实际运用

大模型能真正把动作做出来了。举个现场例子:有人在任务窗口问“杭州明天的天气如何”,

一文搞懂MCP、FunctionCalling与实际运用

接下来发生的事,不像以前那样只是模型吐一段文字回答,而是整套“动手又动脑”的流程被跑通了。简单说就是:界面里有人问天气,Cline Agent 在背后自动决定去用一个叫 get_forecast 的外部工具拉数据,拿到结果后把信息回给用户。别看这话听着轻巧,背后有完整的日志和通信记录可以查——mcp_io.log 就把那段 JSON-RPC 的交互记录下来了,三阶段的信息:工具注册与发现、请求发起、结果返回并确认,一条不漏。能把这些东西记录下来,不靠嘴上说说,说明系统的确 能跑通。

把这套链路搭起来,工程上要做不少活儿。开发者在 VSCode 裡面用 Cline 的插件点 Configure MCP Servers,把要启动的 MCP Server 命令写到配置里。示例里是用一条命令来起服务:“python mcp_logger.py uv run mcp_weather_server.py”。等到配置界面里 get_forecast 那一项变绿,就说明 MCP Server 已经被注册并跑起来了。之后 Agent 跑的时候能发现这个工具,并按需调用它。你要把这部分做对,少一点错就能少走许多弯路。

一文搞懂MCP、FunctionCalling与实际运用

再说 MCP 本身是干啥的。把它想成一个中间人协议,跟模型没有绑定关系,它的职责是统一把外部工具暴露给 Agent,支持工具的发现、注册、调用。MCP 并不直接跟模型对话,而是把工具的输入输出作为上下文的一部分,供模型在一次交互里使用。日志显示它用的是 JSON-RPC,这种格式轻、结构也直接,便于把每次工具调用都记录清楚。这一点挺重大:当系统出问题时,有日志就能回溯,知道是哪一步卡住了。

说到为什么大模型会去调用工具,要从 Function Calling 说起。模型本身不会凭空知道外面有啥工具可用,必须有人在 prompt 里把工具能力、接口格式、什么时候该用它都写清楚。Cline 在这方面下的功夫很大:系统级的 prompt 超级长,接近 50K、600 行,里头写明模型的身份、能干的事、工作模式。还明确告知模型它可以按步骤推理、可以调用工具,调用时要用的格式(Cline 用 XML)以及和外部系统如何交互。由于这个 prompt 写得多,的确 会消耗不少 token,几千 token 也不是罕见。有人会吐槽“烧 token”,实际就是,想把模型当工具链的指挥官来用,得付出代价。

一文搞懂MCP、FunctionCalling与实际运用

工具本身也有分类。Cline 有一些内建的文件与命令类工具,列如 execute_command、read_file、write_to_file。出于安全思考,这些文件操作都被限制在一个工作目录下,不能随意去系统任意地方读写。除此之外,还可以把自定义工具注册进来,get_forecast 就是这样被引入的:开发者在 prompt 里加入功能描述,把工具能做的事情、参数和返回格式告知模型。换句话说,工具注册实则就是在告知模型“我这儿有这么个工具,你按这个规则能用它”。

模型按着 prompt 和工具说明把任务拆成若干子任务,然后用工具去执行每一步。每当子任务完成,模型会发出特定信号告知 Agent 列如 ,在 标签里放最终结果。Agent 根据这些信号决定什么时候结束整个操作,把最终产出展示给用户。流程里如果需要,还能演示 CLI 操作,这部分是可选的,但对调试很有协助。

一文搞懂MCP、FunctionCalling与实际运用

把上下文管理谈清楚也很关键。大模型是靠上下文“撑起世界观”的,缺少长期记忆的它每次交互都要靠给进去的信息。如果把工具能力、领域文档、历史消息全塞进 prompt,窗口很容易变得太长,模型注意力就会打折——这就是常说的 Context Rot。常用的应对办法有把信息压缩、做结构化笔记,或者把任务拆成多个小 Agent,各自管自己的上下文。这就是多 Agent 架构的出发点,用来控制单个 Agent 的上下文长度,避免信息溢出导致混乱。

多 Agent 协作又需要协议来支撑,这里用到的是 A2A(Agent to Agent protocol)。A2A 的设计有几样东西挺实用:在 /.well-known/agent.json 放 Agent Card,用来描述能力、端点和认证需求;A2A server 管理任务执行;A2A client 可以发起任务或订阅任务进展。整个通信把任务当作核心,每个任务有唯一 ID 和状态流转,消息里可以包含多个 parts,parts 既能是文本,也能是文件或数据,任务的产出称为 artefacts。为应对长时间运行的任务,协议支持用 SSE 做流式更新,也能通过 webhook 推送通知。A2A 同样采用 JSON-RPC,和 MCP 在发现、注册、调用这些环节上的思路很像。

一文搞懂MCP、FunctionCalling与实际运用

把这些零碎东西串起来,就是一个可复现的工程化流程:在 VSCode 插件里把 MCP Server 配好、用 mcp_logger 启动并把 stdin/stdout 的通信流截下来写成 mcp_io.log、等工具变绿后让 Agent 发现并按规则调用,调用结果再被回传到用户界面。日志里那三段交互——工具注册与发现、请求发起、结果返回并确认——能完整地看到并重演这个流程。对开发者来说,这样的可观察性是必须的,少了它就像修车没灯,看不到哪儿出问题。

从实现细节看,工程活既细又耐心活儿多。需要有人把 prompt 写清楚,把工具声明和接口写规范,把安全边界定好,把日志抓好,再把多 Agent 的协作协议和任务管理流程搭建起来。每一步都有坑,但只要把各个环节都能记录、能复现,就能把“模型会用工具”从口号变成能在生产环境里可靠运行的能力。看着这些流程一次次跑通,团队里的人会觉得这工作既讲究细节,也考验耐性。

一文搞懂MCP、FunctionCalling与实际运用

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
特别孙小婷的头像 - 宋马
评论 抢沙发

请登录后发表评论

    暂无评论内容