什么是mcp
mcp(model context protocol,模型上下文协议)
标准化协议:让大模型用统一的方式来调用工具,是llm和工具之间的桥梁
A2A:Agent-to-Agent协议
mcp通信机制
提供mcp服务查询的平台
具有工具合集的平台称为mcp server
热门mcp服务
- filesystem:允许访问本地文件系统
- mysqldb-mcp-server:与数据库进行交互
- amap-maps:高德地图(api key免费额度很少)
- firecrawl:爬虫
- github:和github交互(先去github设置里申请自己的token)
- git:git操作
- memory:记忆图谱,长期历史记忆
- desktop-commander:终端命令
- Slack:社交软件(去https://app.slack.com/intl/zh-cn注册并获取自己的 team id)
注意有些配置需要先去对应平台获取api key
mcp两种指令对应环境的安装
在安装 stdio
的本地环境时,有两种不同的方式 。一种是基于Python语言编写的服务,安装它要用到 uvx
指令;另一种是基于TypeScript语言编写的服务,安装时得用 npx
指令 。就好比你要安装两个不同类型的小工具,一个工具得用A方法安装,另一个得用B方法安装。
基于Python——
pip install uv
uvx --version
基于TypeScript——
安装node.js,把文件夹的路径添加到path里
在cmd终端输入:node -v和npm -v
cursor配置mcp服务
1、查看——外观——辅助侧边栏,有自然语言的交互
2、案例需求(需要用到mysql,高德地图和filesystem服务):
- 现在交给你一个任务,编写一个北京一日游的出行攻略
- 从高德地图的MCP服务中获取北京站到天安门、天安门到颐和园、颐和园到南锣鼓巷的地铁路线,并保存在数据库beijing_transit的表subway_trips中
- 从高德地图的MCP中获取颐和园、南锣鼓巷附近的美食信息,每处获取三家美食店铺信息,并将相应的信息存入表location_foods中
- 在工作日录D:\MyWorkSpace下创建一个新的文件夹,命名为“北京旅行”在其中创建两个txt,分别从数据库中得到两个表的内容提取出存放进去。
- 从最后在两个表的内容生成一个精美的html前端展示页面,并存放在该目录下
3、cursor中添加server
项目级别:在项目的.cursor目录中新建mcp.json文件进行配置,仅对特定项目生效。(推荐)
全局设置:Settings——MCP——add new global MCP server
alt+shift+F 调整格式
cline配置mcp服务
cline可以分为plan和act两种模式,先plan再act更精准
配置:installed-config mcp servers
mcp服务使用的注意事项:
- 需要自己创建好大的目录,agent才能访问
比如:你要求agent“在工作目录E:\ClineWorkSpace\test_cline下创建一个新的文件夹,命名为“北京旅行”。那你就要先自己创建好E:\ClineWorkSpace\test_cline这个目录,否则会有系统找不到指定的路径的问题。 - 连接数据库时,要确保数据库已经自己手动创建,mcp才能连接上,否则会出现client_close的问题。
- 在cline连接基于npx的mcp服务时,即使已经安装好了nodejs,也可能出现spawn npx ENOENT的问题,这可能是因为对windows支持不太友好。
解决办法:
将使用npx的命令替换为cmd(适用于 Windows 系统):如果是在 Windows 系统下,将command字段的值从npx改为cmd,并在args数组开头添加/c,后续再跟上原来的npx命令及参数。
"amap-maps": {"command": "npx","args": ["-y","@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "***"}}//变成下面这样"amap-maps": {"command": "cmd","args": ["/c","npx","-y","@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "***"}}
cherry studio的使用
- 配置模型(去硅基流动或者阿里云百炼平台获取api key,然后测试连接,开启模型服务)
- 配置mcp服务(编辑mcp服务,把.json内容粘贴进去)
- 选择回答的模型,多选mcp服务
手动开发mcp服务
-
新建项目
在E盘终端:uv init mcp-project
打开创建client.py和server.py,以及.env -
配置.env:
BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
MODEL=qwen2.5-vl-32b-instruct
DASHSCOPE_API_KEY="sk-f2466b8bdfa848c69051054f184939f6"SERPER_API_KEY="8d98f7e8a23442f6c83c3398d6283c956b727a74"SMTP_SERVER=smtp.163.com
SMTP_PORT=465
EMAIL_USER=16620017551@163.com
EMAIL_PASS=XKXbB4gT4trhqbGa
获取几个权限:
- 阿里云百炼控制台api key——大模型
- Serper平台api key——提供谷歌搜索(注意要谷歌邮箱注册)
- 163网易邮箱(开启POP3/SMTP服务,获得授权密码)
- 运行client.py
终端环境与 VS Code 选择的解释器不一致。虽然你在 VS Code 中选择了 Python 3.12 解释器,但终端可能仍在使用 Anaconda 的默认环境(Python 版本低于 3.10)
python --version
conda activate mcp_env
代码思路
client.py:
class MCPClient:def __init__(self): # 初始化:加载环境变量,配置OpenAI(创建客户端和会话)...async def connect_to_server(self, server_script_path: str):# 启动服务器(判断服务器脚本是.py还是.js的,启动方式;构造参数;启动服务得通道;从通道中提取读写对象) # 连接服务器(和服务端通道相连,创建会话)...async def process_query(self, query: str) -> str:# 从查询中提取关键词,生成要填写的报告文件名,加入查询中使其更新,包装用户消息# 请求可用的工具列表 self.session.list_tools()# 分析要用哪些工具self.plan_tool_usage(query, available_tools)# 依次调用工具self.session.call_tool(tool_name, tool_args),收集结果,将其加到messages后面messages[{"role": "user","content": "分析苹果公司的市场表现 [md_filename=sentiment_苹果公司_20230515_143022.md] [md_path=./sentiment_reports/sentiment_苹果公司_20230515_143022.md]"},{"role": "tool","tool_call_id": "fetch_data","content": "已获取苹果公司近30天的市场数据(2023-04-15至2023-05-15)"},{"role": "tool","tool_call_id": "analyze_sentiment","content": "苹果公司市场情绪分析结果:积极(85%),中性(10%),消极(5%)\n详细报告已保存至 sentiment_苹果公司_20230515_143022.md"}
]final_output='根据最近30天的市场数据(2023-04-15至2023-05-15),苹果公司的市场情绪分析如下:- 积极情绪占比:85%
- 中性情绪占比:10%
- 消极情绪占比:5%整体来看,市场对苹果公司的评价非常积极,可能反映了其产品表现、财务状况或行业地位的优势。详细分析已生成报告,可查看:
[sentiment_苹果公司_20230515_143022.md](file:///./sentiment_reports/sentiment_苹果公司_20230515_143022.md)如需进一步分析或其他帮助,请随时告知。'...async def plan_tool_usage(self, query: str, tools: List[dict]) -> List[dict]:# 定义llm的system_prompt为“智能任务规划助手”# 将system_prompt和用户消息一起包装成新消息# 通过llm分析 query,规划应该调用哪些工具和参数(返回 JSON 数组)response = self.client.chat.completions.create(model,messages,tools)...async def chat_loop(self):# 交互的入口,可以循环提问,process_query处理问题生成回答...async def cleanup(self):# 优雅退出 MCP 会话...async def main():client = MCPClient()await client.connect_to_server(...)await client.chat_loop()
server.py:
# 加载环境变量
load_dotenv()# 初始化 MCP 服务器
mcp = FastMCP("NewsServer")# 注册工具:@mcp.tool() 是 MCP 框架的装饰器,表明这是一个 MCP 工具。
# 服务端:通过装饰器注册工具,MCP 框架收集元数据。
# 客户端:调用 list_tools 向服务端请求工具列表,构造为 LLM 可用的格式。@mcp.tool()
async def search_google_news(keyword: str) -> str:@mcp.tool()
async def analyze_sentiment(text: str, filename: str) -> str:@mcp.tool()
async def send_email_with_attachment(to: str, subject: str, body: str, filename: str) -> str:
分析工具使用、对新闻进行情感分析、总结都需要llm