




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
MCP從開發到應用實踐1.什么是MCPMCP(ModelContextProtocol)即模型上下文協議,是由Anthropic公司于2024年底開源發布,用于標準化應用程序如何向大型語言模型(LLMs)提供上下文。將MCP想象成AI應用的USB-C接口。就像USB-C提供了一種標準化的方式來連接設備到各種外設和配件一樣,MCP提供了一種標準化的方式來連接AI模型到不同的數據源和工具。2.為什么用MCPMCP幫助你在LLMs上構建代理和復雜的工作流。LLMs經常需要與數據和工具集成,而MCP提供了:一系列不斷增長的預構建集成,你的LLM可以直接插入MCP對各個服務的接口進行了統一,這樣M個Agent可以直接使用這N個服務,大幅降低重復開發和適配的成本確保你的數據在你的基礎設施內最佳實踐在LLM提供者和供應商之間切換的靈活性3.MCP、智能體、大模型關系4.MCP架構與組件主機(Host):與大模型直接交互,處理大模型輸入輸出,保障數據準確完整,執行安全策略,處理延遲可降低至平均50毫秒以內。通常是AI應用(Agent),比如AnthropicClaudeDesktop、Cursor、Cline等,負責選擇并調用MCPClient,以便使用各種MCPServer提供的能力。客戶端(Client):位于外部系統,將外部需求轉為MCP協議格式請求,再把主機響應轉換為外部系統能理解的格式,請求準備時間可縮短至平均30毫秒以內,支持多種編程語言和平臺。服務器(Server):處理主機請求并提供服務,可提供數據查詢、文件操作等服務,處理能力可達每秒處理1000個請求以上,具備靈活擴展機制。提供資源、工具或Prompts的服務,如文件系統、數據庫、API等。Client和Server之間使用雙向的JSON-RPC2.0進行通信。當前支持stdio和StreamableHTTP兩種傳輸機制。5.MCP關鍵概念Resources資源:將服務器中的數據和內容公開給LLM,它允許服務器公開可由客戶端讀取并用作LLM交互上下文的數據和內容。Tools工具:使LLM能夠通過您的服務器執行操作它使服務器能夠向客戶端公開可執行功能。通過工具,LLM可以與外部系統交互、執行計算并在現實世界中采取行動。(執行者,API)Prompts提示:創建可重用的提示模板和工作流使服務器能夠定義可重用的提示模板和工作流,客戶端可以輕松地向用戶和LLM顯示這些模板和工作流。它們提供了一種強大的方法來標準化和共享常見的LLM交互。Sampling采樣:讓您的服務器從LLM請求完成它允許服務器通過客戶端請求LLM完成,從而在維護安全性和隱私性的同時實現復雜的代理行為。MCPServer可以發起請求到MCPClient,再MCPClient接收到請求后,執行相應的動作,比如:人工確認或者是調用大模型等。Roots根:用于定義服務器可以運行的邊界。它們為客戶端提供了一種將相關資源及其位置通知服務器的方法。根是客戶端建議服務器應該關注的URI。當客戶端連接到服務器時,它會聲明服務器應該使用哪些根。雖然root主要用于文件系統路徑,但root可以是任何有效的URI,包括HTTPURL。Projectdirectories項目目錄Repositorylocations存儲庫位置APIendpointsAPI終端節點Configurationlocations配置位置Resourceboundaries資源邊界Transports運輸:模型上下文協議(MCP)中的傳輸為客戶端和服務器之間的通信提供了基礎。傳輸處理消息發送和接收方式的基本機制。MCP使用
JSON-RPC2.0作為其傳輸格式。傳輸層負責將MCP協議消息轉換為JSON-RPC格式進行傳輸,并將收到的JSON-RPC消息轉換回MCP協議消息。6.通信方式(Transport)實戰1.構建MCP1.1前置準備開發工具:vscode開發環境:py3.13nodejs18調試工具:modelcontextprotocol/inspector@0.6.0(依賴node18+)主機CherrystudioVscode1.2環境搭建??推薦使用uv
https://docs.astral.sh/uv/getting-started/installation/1.2.1初始化工程#初始化框架uvinitmcp-math-demo#切換目錄cdmcp-math-demo#創建目錄(為什么—>因為據說是python工程規范)mkdir-psrc/example#將生成的main移動到examplemvmain.pysrc/example1.2.2創建py虛擬環境#創建虛擬環境(工程中會多一個.venv文件),并激活環境uvvenv#激活環境,mac和window有點差異,需注意下source.venv/bin/activate1.2.3配置pyproject.toml....其他已經存在的配置....dependencies=["fastmcp>=2.3.4","mcp[cli]>=1.6.0"][project.scripts]example="example.main:main"[[tool.uv.index]]name="mypypi"url="/simple"publish-url="http://your.pypi/"default=true....其他已經存在的配置....1.2.4安裝依賴uvpipinstall-e.1.2.5運行代碼#執行工程代碼uvrunexample#若成功則打印結果:Hellofrommcp-math-demo!1.3快速編碼一下兩種方式任選一種,其中Sse方式需要提前啟動1.3.1Stdio方式啟動命令測試:uvrunsrc/example/server-math-stdio.py#server-math-stdio.pyfrommcp.server.fastmcpimportFastMCPimportlogging#配置日志記錄器logging.basicConfig(level=logging.INFO,#設置日志級別為INFOformat="%(asctime)s-%(levelname)s-%(message)s"#日志格式)logger=logging.getLogger(__name__)#創建FastMCP實例mcp=FastMCP("Math")@mcp.tool()defadd(a:int,b:int)->int:"""Addtwonumbers"""("Theaddmethodiscalled:a=%d,b=%d",a,b)#記錄加法調用日志returna+b@mcp.tool()defmultiply(a:int,b:int)->int:"""Multiplytwonumbers"""("Themultiplymethodiscalled:a=%d,b=%d",a,b)#記錄乘法調用日志returna*bif__name__=="__main__":("StartmathserverthroughMCP-STDIO")#記錄服務啟動日志mcp.run(transport="stdio")#啟動服務并使用標準輸入輸出通信1.3.2Sse方式??該方式需要先啟動服務,然后在使用HOST取連接啟動命令測試:uvrunsrc/example/server-math-stdio.py#server-math-sse.pyfrommcp.server.fastmcpimportFastMCPimportlogging#配置日志記錄器logging.basicConfig(level=logging.INFO,#設置日志級別為INFOformat="%(asctime)s-%(levelname)s-%(message)s"#日志格式)logger=logging.getLogger(__name__)#創建FastMCP實例mcp=FastMCP("Math")@mcp.tool()defadd(a:int,b:int)->int:"""Addtwonumbers"""("Theaddmethodiscalled:a=%d,b=%d",a,b)#記錄加法調用日志returna+b@mcp.tool()defmultiply(a:int,b:int)->int:"""Multiplytwonumbers"""("Themultiplymethodiscalled:a=%d,b=%d",a,b)#記錄乘法調用日志returna*bif__name__=="__main__":("StartmathserverthroughMCP-SSE")#記錄服務啟動日志mcp.run(transport="sse")#啟動服務并使用標準輸入輸出通信#mcp.run(transport="streamable-http")#啟動服務并使用標準輸入輸出通信1.4調試MCP方式一:單獨運行調試工具按照插件(需要按照node18+,建議使用nvm)#打開命令行執行腳本npx@modelcontextprotocol/inspector@0.6.0方式二:通過mcp進行調試(實則方式一)##這種本質上就是方式一uvrunmcpdevserver-math-stdio.py2.使用MCP以非開發、開發人員視角演示使用,下面是常用標準的MCP配置{##數學計算方式一:stdio-->server-math-stdio.py"math-stdio":{#這個也可以是.venv/bin/python3"command":"uv",#Replacewithabsolutepathtoyourserver-math-stdio.pyfile"args":["run","xxxx/src/example/server-math-stdio.py"],"transport":"stdio",},##數學計算方式二:sse-->server-math-sse.py"math-sse":{"url":":8000/sse","transport":"sse"},}2.1Cherrystudio2.1.1配置模型這里可以點擊硅基流動進行注冊獲取(新用戶有免費額度),或者根據自己實際情況配置2.1.2配置MCP服務方式一:stdio--directoryxxx/mcp-math-demo/src/example/runserver-math-stdio.py方式二:sse先啟動服務:在配置查看MCP具體工具2.1.3選擇MCP服務和大模型2.1.4對話使用MCP2.2Vscode2.2.1下載插件我用的RooCode,大家可以下載其他插件:Cline...2.2.2配置模型我這邊注冊的DeepSeek2.2.3配置mcp注意:comand:指定可以運行腳本的命令,環境不要混了args:參數指定絕對路徑transport:依據實際,stdio|sse2.2.4對話(過程中自動批準MCP)輸入3*32.3Code代碼調用2.3.1需要安裝依賴uvaddlangchain_mcp_adapterslanggraphlangchain_deepseek客戶端代碼client-langchain.pyimportasynciofromlangchain_mcp_adapters.clientimportMultiServerMCPClientfromlanggraph.prebuiltimportcreate_react_agentfromexample.utilsimportinit_model##模型llm=init_model()asyncdefmain():client=MultiServerMCPClient({##數學計算sse-->server-math-sse.py"math-sse":{"url":":8000/sse","transport":"sse"},#數學計算stdio-->server-math-stdio.py#"math-stdio":{#"command":"python",#"args":["src/example/server-math-stdio.py"],#"transport":"stdio",#}})tools=awaitclient.get_tools()agent=create_react_agent(llm,tools,debug=True)#循環接收用戶輸入whileTrue:try:#提示用戶輸入問題user_input=input("\n請輸入您的問題(或輸入'exit'退出):")ifuser_input.lower()=="exit":print("感謝使用!再見!")break#調用代理處理問題agent_response=awaitagent.ainvoke({"messages":[{"role":"user","content":user_input}]})print("\n>>>>>>>>>>>>>>>>>>>>>>>開始輸出結果>>>>>>>>>>>>>>>>>>>>>>>\n")#調用抽取的方法處理輸出結果print_optimized_result(agent_response)print("\n<<<<<<<<<<<<<<<<<<<<<<<結果輸出完成<<<<<<<<<<<<<<<<<<<<<<<\n")exceptExceptionase:print(f"發生錯誤:{e}")continue#解析并輸出結果defprint_optimized_result(agent_response):"""解析代理響應并輸出優化后的結果。:paramagent_response:代理返回的完整響應"""messages=agent_response.get("messages",[])steps=[]#用于記錄計算步驟final_answer=None#最終答案formessageinmessages:ifhasattr(message,"additional_kwargs")and"tool_calls"inmessage.additional_kwargs:#提取工具調用信息tool_calls=message.additional_kwargs["tool_calls"]fortool_callintool_calls:tool_name=tool_call["function"]["name"]tool_args=tool_call["function"]["arguments"]steps.append(f"調用工具:{tool_name}({tool_args})")elifmessage.type=="tool":#提取工具執行結果tool_name=tool_result=message.contentsteps.append(f"{tool_name}的結果是:{tool_result}")elifmessage.type=="ai":#提取最終答案final_answer=message.content#打印優化后的結果print("\n***執行過程***:")forstepinsteps:print(f"-{step}")iffinal_answer:print(f"\n***最終結果***\n>{final_answer}\n")if__name__=="__main__":asyncio.run(main())2.3.3模型工具類utils.pyfromlangchain_deepseekimportChatDeepSeek#fromlangchain.chat_modelsimportinit_chat_model#fromlangchain_core.language_modelsimportBaseChatModeldefinit_model():##公網-通義模型#fromlangchain_community.chat_models.tongyiimportChatTongyi#dashscope#llm=ChatTongyi(#temperature=0,#api_key="sk-XXXX",#)#公網-Deepseek模型llm=ChatDeepSeek(model="deepseek-chat",#嘗試不同的模型名稱api_key="sk-xxxx")##不行坑比較多,可能是版本功能問題,初始化后的llm總是報各種錯誤#llm=load_chat_model(f"{model_provider}/{model_name}",{#"api_key":api_key,#"base_url":base_url,##enable_auto_tool_choice:True,##tool_call_parser:True#})returnllm;2.3.4調試過程啟動MCP服務端啟動MCP客戶端并輸入問題:3*4調用流程分析:3.常見問題p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- LY/T 2514-2024中國森林認證非木質林產品經營認證操作指南
- 風景園林基礎考研資料試題及答案詳解【歷年真題】
- 《風景園林招投標與概預算》試題A附答案詳解(a卷)
- 2025-2026年高校教師資格證之《高等教育法規》通關題庫附參考答案詳解(奪分金卷)
- 2025年黑龍江省五常市輔警招聘考試試題題庫及答案詳解(名師系列)
- Rhino+KeyShot產品設計 課件 第5章 建模綜合案例
- 語文(廣東卷)2025年中考考前押題最后一卷
- 臨床輸液泵、微量注射泵使用技術要點
- Brand KPIs for online betting:Bet3000 in Germany-英文培訓課件2025.5
- AI大模型賦能數據治理解決方案
- 2024年民航安全檢查員(五級)資格理論考試題庫(重點500題)
- 冀教版五年級數學下冊教學課件 第五單元 長方體和正方體的體積整理與復習
- 公車拍賣拍賣工作方案
- 2023年山東高考政治試卷附答案
- C語言課程設計-家庭財務管理系統
- 二升三應用題100道
- 典當管理手冊
- 患者安全和護理風險管理
- 宮腔鏡相關知識考核試題及答案
- 七年級語文下冊知識梳理與能力訓練 06 古代詩歌五首理解性默寫與練習
- 山東省濟寧市任城區2024屆八年級語文第二學期期末監測試題含解析
評論
0/150
提交評論