我抓包了 Cline 与模型的通信,发现了一件有趣的事
# MCP 规定了工具怎么注册和调用但没规定工具信息怎么传给 LLM。Cline 是怎么做的通过搭建一个中间人服务器抓包完整的通信协议暴露在眼前。从一个问题开始学完 MCP 基础之后你可能会有一个疑问“MCP 定义了 Host 和 Server 之间的通信但是 Host 怎么把工具信息传递给 LLM”官方文档语焉不详。不同的 Host 实现方式不一样Cline 怎么做的只有一种方法能知道——抓包。搭建中间人服务器思路很简单在 Cline 和真实 LLM API 之间插入一个代理服务器记录所有流量。正常流程 Cline → OpenRouter/Claude API 抓包流程 Cline → 本地代理服务器记录流量→ OpenRouter/Claude API实现代理服务器FastAPI httpx# proxy.pyfromfastapiimportFastAPI,Requestfromfastapi.responsesimportStreamingResponseimporthttpximportjsonimporttime appFastAPI()TARGET_APIhttps://openrouter.ai/api/v1LOG_FILEllm.logapp.post(/v1/chat/completions)asyncdefproxy_chat(request:Request):bodyawaitrequest.json()headersdict(request.headers)# 记录请求withopen(LOG_FILE,a,encodingutf-8)asf:f.write(f\n{*60}\n)f.write(f[{time.strftime(%H:%M:%S)}] REQUEST\n)f.write(json.dumps(body,ensure_asciiFalse,indent2))f.write(\n)# 转发给真实 APIasyncdefgenerate():asyncwithhttpx.AsyncClient()asclient:asyncwithclient.stream(POST,f{TARGET_API}/chat/completions,jsonbody,headers{Authorization:fBearer{YOUR_API_KEY},Content-Type:application/json},timeout120.0)asresponse:full_responseasyncforchunkinresponse.aiter_text():full_responsechunkyieldchunk# 记录响应withopen(LOG_FILE,a,encodingutf-8)asf:f.write(f[{time.strftime(%H:%M:%S)}] RESPONSE\n)f.write(full_response[:5000])# 只记录前 5000 字符f.write(\n)returnStreamingResponse(generate(),media_typetext/event-stream)if__name____main__:importuvicorn uvicorn.run(app,host0.0.0.0,port8000)配置 Cline 使用代理在 Cline 的 API 设置中ProviderOpenAI CompatibleBase URLhttp://localhost:8000API Key任意字符串代理会替换抓包结果Cline 发送了什么启动代理在 Cline 里输入一个需要调用 MCP 工具的任务“帮我查一下纽约今天的天气”日志文件里出现了一段令人震惊的内容System Prompt 长达数万字符Cline 发送给 LLM 的 System Prompt不是你想象中简单的几句话而是一个数万字符的庞然大物包含角色定义你是一个高度熟练的软件工程师…工具调用格式XML 标签规范所有内置工具的说明read_file、write_to_file、execute_command…所有 MCP 工具的说明来自已配置的 MCP Server详细的行为规范何时询问用户、如何处理错误…!-- System Prompt 片段极度简化 --你是 Cline一位高度熟练的软件工程师能够使用各种工具完成各种任务。 ## 工具使用格式 你可以通过 XML 标签格式使用工具tool_nameparameter_nameparameter_value/parameter_name/tool_name## 可用工具 ### read_file 读取文件内容read_filepath目标文件路径/path/read_file### use_mcp_tool 使用 MCP 工具use_mcp_toolserver_name服务器名/server_nametool_name工具名/tool_namearguments{参数: 值}/arguments/use_mcp_tool## 已配置的 MCP 服务器 ### weather天气查询服务 - get_forecast获取指定经纬度的天气预报 参数latitude纬度、longitude经度用户消息被包装成 XMLtask帮我查一下纽约今天的天气/taskenvironment_details当前时间2026-03-16 21:00:00 操作系统macOS 14.0 打开的文件无/environment_detailsLLM 的响应也是 XML 格式thinking用户想知道纽约的天气。我需要使用 get_forecast 工具。 纽约的坐标大约是纬度 40.71经度 -74.01。/thinkinguse_mcp_toolserver_nameweather/server_nametool_nameget_forecast/tool_namearguments{latitude: 40.7128, longitude: -74.0060}/arguments/use_mcp_toolCline 解析到use_mcp_tool标签执行工具调用把结果返回给 LLMtool_result纽约今天晴气温 18°C偏北风 2 级紫外线指数中等。/tool_resultLLM 收到工具结果后输出最终答案并用attempt_completion标记任务完成attempt_completionresult纽约今天天气晴好气温 18°C偏北风 2 级适合出行。紫外线指数中等建议出门涂防晒。/result/attempt_completion这揭示了什么核心发现一Cline 用 XML 而非 Function CallingOpenAI 定义了标准的 Function Calling 格式JSON Schema但 Cline 没有用——它自己发明了一套 XML 格式。这说明MCP 协议不规定 Host 如何与 LLM 交互每个 Host 可以自行设计。CherryStudio 用 Function CallingCline 用 XML——这是两种完全不同的实现但都能工作因为 MCP 只管 Host 和 Server 之间的通信。核心发现二ReAct 模式的工程化实现Cline 的整个交互流程就是ReActReasoning Acting模式的工程落地Thought思考→ Action行动→ Observation观察→ 重复通过thinking标签强制模型先思考再行动通过 XML 结构化输出解析工具调用通过工具结果反馈推动下一轮推理。核心发现三System Prompt 是 Agent 的真正配置文件Cline 的 System Prompt 动辄数万 Token占整个 Context 的相当大一部分。这个巨大的 System Prompt包含了 Agent 的所有规则和能力清单。这也解释了为什么Cline 的启动成本高每次对话都要发送这个巨大的 System PromptCline 的 Agent 能力强工具使用规范非常详细模型很少用错能学到什么抓包分析的实践价值1. 调试工具调用失败当 LLM 不调用工具或者调用参数错误看日志能快速定位是 Tool 的 description 写得不够好还是 LLM 理解错了。2. 自定义 Agent 开发参考Cline 的 XML 格式是一种可以借鉴的设计思路。如果你要开发自己的 Agent可以参考这种先思考、再行动的 Prompt 结构。3. 成本控制看到 System Prompt 多大你就知道每次对话基础成本是多少可以合理规划 Context 预算。动手试一试代码仓库里有完整的中间人代理代码gitclone https://github.com/MarkTechStation/VideoCodecdVideoCode/MCP终极指南-番外篇 pipinstallfastapi uvicorn httpx python proxy.py配置完 Cline随便问一个需要工具的问题然后打开llm.log——你会看到比任何文档都更真实的 MCP 工作原理。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431577.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!