MCP 结构

bd1d8a26-ffc0-4fbd-ad34-205336e01fc8

首先需要一个支持MCP的客户端,可以是vscode,cursor,claude app等等。

然后在本地部署好各种server,比如百度地图,browser use等等,主要是搞一个server.py,采用FastMCP格式,定义好tools,输入参数,函数内就是具体干啥,可以是一堆python代码直接把事干完了,诸如加减乘除操作然后return,也可以是发送一个请求等待接收结果然后return。

请求外部的话,一般比如百度地图,接收请求,返回内容。所以除了自己电脑上server.py,外部工具也需要一个xxx.py来响应请求。

MCP客户端和server之间,最简单就是一个json来关联,诸如cline_mcp_settings.json。写清楚server名,怎么启动。

所以MCP究竟在干啥呢?简单理解或许就是提供了FastMCP的一套标准格式,然后各个工具内部写个xxx.py处理请求。各个用户在本地配置server.py来发送请求。然后这么一套标准化的东西整完,大模型就可以知道有哪些东西可以调用(通过cline_mcp_settings.json)。

Model server x:server.py

本地需要server.py,然后部署(给大模型看的,都会作为prompt的一部分,让大模型知道有什么函数,怎么用)

看起来就是import FastMCP,然后写函数,参数形式,发请求。

f60c9a2a-7d5b-4c32-85a0-b77731010ec4

MCP客户端和MCP server的桥梁

最最简单,就是个json:cline_mcp_settings.json

60367adf-4de1-4ac2-b198-4620d97f24ea

Remote service x

各个被调用的服务,接收server.py发送的请求,响应,然后返回。

具体例子感受下MCP过程的输入输出

只有一个MCP服务,百度地图。

q=“北京玉渊潭公园逛完还能去哪?请帮我安排一下午的行程”

5c486e15-4361-4478-adaf-e2e808f838c0

这个token量看着就恐怖….

==第一次请求:==

==输入:==

系统prompt:

你是Cline,一名拥有广泛编程语言、框架、设计模式和最佳实践知识的高技能软件工程师。

[讲了一堆工具使用规则,格式,例子]

[讲了一堆已有MCP工具,使用规则,例子,把baidu_map的map.py讲了一遍]

[执行模式 vs 计划模式,讲了一堆]

[规则,讲了一堆]

[系统信息]

操作系统:Linux 4.18

默认Shell:/bin/bash

主目录:/root

当前工作目录:/home

[目标]

你通过迭代方式完成任务,将其分解为清晰步骤并系统性地完成。

  1. 分析用户任务并设定明确、可实现的目标。按逻辑顺序排列这些目标优先级。
  2. 按顺序完成这些目标,根据需要逐步使用可用工具。每个目标应对应问题解决过程中的一个独立步骤。
  3. 在调用工具前,在标签内进行分析。首先分析environment_details中提供的文件结构以获取上下文。然后思考哪个工具最适合完成任务。接着检查工具所需参数是否已提供或可合理推断。如果所有必需参数都已具备,则使用工具;否则使用ask_followup_question工具询问缺失参数。
  4. 完成任务后必须使用attempt_completion工具向用户展示结果。
  5. 用户可能提供反馈,可用于改进并重试。但不要进行无意义的来回对话。

==输出:==

  1. 用户要求规划北京玉渊潭公园游玩后的下午行程安排
  2. 系统已连接百度地图MCP服务器,可以提供地点搜索、路线规划等功能
  3. 需要查找玉渊潭公园附近的景点、餐饮、休闲场所等
  4. 需要合理安排时间顺序和交通方式
  5. 需要提供具体的地点信息和路线建议

我将使用百度地图MCP服务器的工具来获取相关信息并规划行程。\n\n<use_mcp_tool>\n<server_name>baidu-map</server_name>\n<tool_name>map_search_places</tool_name>\n\n{\n "query": "景点",\n "region": "北京",\n "location": "39.913818,116.363625", // 玉渊潭公园坐标\n "radius": 5000 // 5公里范围内搜索\n}\n\n</use_mcp_tool>"

==第二次请求==

==输入:==多轮对话的格式,看起来是mcp调用格式不对,它在自我修正后再次请求

第一次的输入

assistant:

\n1. 用户要求规划北京玉渊潭公园游玩后的下午行程安排\n2. 系统已连接百度地图MCP服务器,可以提供地点搜索、路线规划等功能\n3. 需要查找玉渊潭公园附近的景点、餐饮、休闲场所等\n4. 需要合理安排时间顺序和交通方式\n5. 需要提供具体的地点信息和路线建议\n\n我将使用百度地图MCP服务器的工具来获取相关信息并规划行程。\n\n\n<use_mcp_tool>\n<server_name>baidu-map</server_name>\n<tool_name>map_search_places</tool_name>\n\n{\n "query": "景点",\n "region": "北京",\n "location": "39.913818,116.363625", // 玉渊潭公园坐标\n "radius": 5000 // 5公里范围内搜索\n}\n\n</use_mcp_tool>\n\n[Response interrupted by a tool use result. Only one tool may be used at a time and should be placed at the end of the message.]"

user:"[use_mcp_tool for ‘baidu-map’] Result:" ;“The tool execution failed with the following error:\n\nInvalid JSON argument used with baidu-map for map_search_places. Please retry with a properly formatted JSON argument.\n

==输出:==

\n1. 之前的请求格式不正确导致工具执行失败\n2. 需要重新格式化JSON参数\n3. 确保所有必填字段都正确提供\n4. 保持相同的搜索条件:玉渊潭公园5公里范围内的景点\n\n\n<use_mcp_tool>\n<server_name>baidu-map</server_name>\n<tool_name>map_search_places</tool_name>\n\n{\n "query": "景点",\n "region": "北京",\n "location": "39.913818,116.363625",\n "radius": 5000\n}\n\n</use_mcp_tool>"

==第三次请求:==

==输入:==前几次的拼接

==输出:==

\n1. 已获取玉渊潭公园周边5公里范围内的景点列表\n2. 需要筛选出适合下午游览的景点\n3. 需要规划合理的游览顺序和交通路线\n4. 建议选择3-4个景点组成下午行程\n5. 将使用百度地图的路线规划工具计算各点之间的交通时间\n\n\n<attempt_completion>\n\n我为您规划了以下玉渊潭公园后的下午行程:\n\n1. 首站:首都博物馆 (13:00-14:30)\n - 地址:北京市西城区复兴门外大街16号\n - 电话:(010)63370491\n - 从玉渊潭公园步行约15分钟或骑行5分钟可达\n - 建议游览时间:1.5小时\n\n2. 第二站:天宁寺塔 (14:45-15:30)\n - 地址:北京市西城区天宁寺前街甲3号\n - 电话:(010)63432507\n - 从首都博物馆打车约10分钟(3公里)\n - 建议游览时间:45分钟\n\n3. 第三站:琉璃厂古文化街 (15:45-17:00)\n - 地址:北京市西城区南新华街与小沙土园胡同交叉路口往北约100米\n - 从天宁寺塔打车约15分钟(4公里)\n - 建议游览时间:1小时15分钟\n - 可在此购买传统工艺品和书籍\n\n4. 晚餐推荐:郑王府 (17:15-18:30)\n - 地址:北京市西城区大木仓胡同35号\n - 从琉璃厂步行约10分钟可达\n - 传统北京官府菜餐厅\n\n整个行程紧凑合理,每个景点间交通时间控制在15分钟内,总游览时间约5.5小时。\n\n</attempt_completion>"

操作指南

vscode:首先安装cline插件

68b1ad78-5ffd-460c-9667-c91f330c73de

Cloudflare

借助AI Gateway看看大模型api的输入输出都干了什么

image-20250330215439010

openrputer获取api key

官网获取模型

填入vscode cline插件中

89a469d6-3acc-409c-936a-b2501ce3480c

MCP服务以百度地图为例

首先需要在本地有配置好这个MCP server

# 按照百度地图MCP教程,在本地配置即可
uv python install 3.11
uv init baidu_map_mcp_server
uv add "mcp[cli]" 
uv run mcp
# 下载百度MCP Server源码,把map.py放到文件夹内
uv run --with mcp[cli] mcp run {替换成您的路径}/baidu_map_mcp_server/map.py
# 如果没有报错则MCP Server启动成功

然后在vscode中把这个server配置进去,就是一个大json里面写着各种server的调用方式

0b9ffec4-3db3-47d7-bf2b-cd5e9d2cd385