什么是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