實戰解析MCP-使用本地的Qwen-2.5模型-AI協議的未來?

文章目錄

目錄

文章目錄

前言

一、MCP是什么?

1.1MCP定義

1.2工作原理

二、為什么要MCP?

2.1 打破碎片化的困局

2.2 實時雙向通信,提升交互效率

2.3 提高安全性與數據隱私保護

三、MCP 與 LangChain 的區別

3.1 目標定位不同

3.2 實現方式的差異

3.3 使用場景的側重點

四、MCP 的未來發展前景

4.1 行業內外的熱烈討論

4.2 開放生態與標準共識

4.3 跨平臺與多模式部署

五、實戰

5.1 服務端

5.2 客戶端

總結


前言

近年來,隨著大語言模型(LLM)在各類應用中的廣泛使用,我們逐漸意識到:僅靠單一模型的能力,很難滿足實際應用中對數據、工具、環境等多樣化需求的不斷增長。就在這種背景下,Anthropic 推出的模型上下文協議(Model Context Protocol,簡稱 MCP)悄然登場,它被譽為“為 AI 裝上 USB-C 接口”的革命性標準,為 AI 工具整合帶來了全新的思路。本文將深入探討 MCP 是什么、為什么要使用 MCP,以及 MCP 與 LangChain 等其他技術的核心區別和應用前景。最后,我會用本地的qwen模型實戰完成MCP的應用。


一、MCP是什么?

1.1MCP定義

模型上下文協議(MCP)是一種開放標準協議,旨在為大語言模型與外部工具、數據源之間建立統一、標準化的通信接口。簡單來說,MCP 就像一個“萬能適配器”,只需一次整合,就能讓 AI 模型(例如 Anthropic 的 Claude)連接上各式各樣的數據接口與工具,而不必為每個數據源單獨開發對接代碼。這種設計理念不僅大大降低了開發難度,還為不同平臺間的互操作性奠定了基礎。

“MCP 通過統一的通信協議,讓模型能夠與外部數據源和工具實現無縫對接,就像 USB-C 接口讓各種設備共享充電和數據傳輸功能一樣”。

1.2工作原理

MCP 的核心架構基于客戶端—服務器模式,主要由三個部分組成:

  • MCP 主機(Host):一般為 AI 應用程序或桌面端工具,例如 Claude 桌面版、IDE 插件等,它負責發起請求。
  • MCP 客戶端(Client):集成在主機內部,通過標準化協議與服務端建立穩定連接,發送請求并接收響應。
  • MCP 服務器(Server):負責對外提供具體的數據、工具或提示信息。它可以連接到本地資源(如文件、數據庫)或遠程服務(如第三方 API)。

這種設計保證了數據的動態傳輸和實時交互,支持雙向通信,使得 AI 不再是單向的信息接收者,而可以主動觸發操作和獲取實時反饋。

二、為什么要MCP?

2.1 打破碎片化的困局

在傳統的開發過程中,AI 應用與每個外部工具或數據源的對接往往都是孤立的。每個 API 都有不同的認證方式、數據格式和錯誤處理機制,這不僅增加了開發者的負擔,也導致系統整體的集成性和擴展性大打折扣。MCP 則通過一次標準化的整合,解決了這一“每扇門都有一把不同鑰匙”的問題。通過 MCP,開發者可以將各種工具和數據源統一接入,大幅提升開發效率。

2.2 實時雙向通信,提升交互效率

傳統 API 往往采用單向的請求—響應模式,模型僅能被動等待數據返回。而 MCP 支持雙向實時通信,這種機制不僅使得數據查詢更加迅速,還允許模型主動觸發操作。例如,在需要實時獲取天氣信息或查詢本地文件內容的場景中,MCP 可以讓 AI 模型通過與外部工具的雙向對話,獲得更準確的上下文數據,從而生成更貼切的回答

2.3 提高安全性與數據隱私保護

在許多企業級應用場景中,數據隱私和安全性是首要考量。傳統做法中,數據往往需要上傳到云端進行處理,這在安全性和隱私保護上存在隱患。而 MCP 的設計允許數據在本地或企業內部網絡中流轉,避免將敏感信息暴露到公共云端。同時,通過統一的協議標準,MCP 可以在不同工具間實施統一的安全策略,確保各方訪問權限受控。

三、MCP 與 LangChain 的區別

近年來,LangChain 作為一款開源框架,也在大語言模型整合工具方面受到廣泛關注。那么,MCP 與 LangChain 到底有何區別?

3.1 目標定位不同
  • MCP:作為一個開放的標準協議,MCP 側重于提供一種統一的通信接口,使 AI 模型能夠通過一次整合接入成千上萬的外部數據源和工具。其核心在于標準化、動態發現和雙向通信,讓開發者可以構建靈活、安全且高效的 AI Agent。
  • LangChain:則更像是一個上層應用框架,它為開發者提供了大量現成的工具和模塊,幫助他們快速構建 AI Agent。LangChain 的優勢在于成熟的生態和豐富的示例,但在面對不同平臺和服務時,其接入方式可能仍然存在一定的碎片化問題。
3.2 實現方式的差異
  • MCP:要求服務端和客戶端按照統一的 JSON-RPC 或 SSE 等標準協議進行通信,實現上相對底層和標準化。它更注重與底層系統的整合,強調的是“寫一次,接入萬次”的理念。
  • LangChain:則更偏向于為開發者提供高層次的抽象和即插即用的組件,其實現方式可能因平臺不同而略有差異,需要開發者在具體場景中進行適配和擴展。
3.3 使用場景的側重點
  • MCP:適用于那些對數據安全、實時交互和統一接口要求較高的場景,如企業內部系統集成、敏感數據處理以及需要跨平臺動態調用工具的應用。
  • LangChain:則更適合快速開發原型和構建簡單 AI Agent,在開發者社區中已積累了豐富的案例和資源,但在面對大規模、復雜系統時,可能需要額外整合措施來彌補標準化不足的問題。

四、MCP 的未來發展前景

4.1 行業內外的熱烈討論

自 MCP 問世以來,各大廠商和開發者社區對其前景展開了激烈討論。LangChain 的大佬們甚至就此展開了辯論——一部分人認為 MCP 是未來 AI 工具整合的必由之路,能夠大幅降低開發者成本并實現真正的“AI原生”體驗;另一部分則持懷疑態度,認為目前的標準還不夠成熟,仍有許多細節需要打磨。

4.2 開放生態與標準共識

MCP 的最大亮點在于其開放性和標準化。通過建立統一的協議,不僅能讓單個廠商如 Anthropic 推動自己的生態,還能吸引更多公司和開源社區參與進來。正如一些業內專家所說,“MCP 可能成為未來 AI 工具整合的通用標準”,這種共識如果達成,將極大地促進 AI 生態系統的健康發展。

4.3 跨平臺與多模式部署

未來,MCP 不僅可以在本地和企業內部網絡中運行,還能通過 WebSocket、HTTP 等網絡協議實現遠程部署。這意味著,AI 模型無論是在云端還是邊緣設備,都能通過 MCP 統一對接外部工具和數據,實現無縫協作和實時交互。這種跨平臺的靈活性,將是 MCP 在實際應用中大放異彩的重要因素。

五、實戰

5.1 服務端
from mcp.server.fastmcp import FastMCPmcp = FastMCP("FileWriter")@mcp.tool()
def write_to_txt(filename: str, content: str) -> str:"""將指定內容寫入文本文件并且保存到本地。參數:filename: 文件名(例如 "output.txt")content: 要寫入的文本內容返回:寫入成功或失敗的提示信息"""try:with open(filename, "w", encoding="utf-8") as f:f.write(content)return f"成功寫入文件 {filename}。"except Exception as e:return f"寫入文件失敗:{e}"if __name__ == "__main__":mcp.run(transport='stdio')  # 默認使用 stdio 傳輸
5.2 客戶端
import os
import asyncio
from typing import Optional
from contextlib import AsyncExitStack
import json
import tracebackfrom mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_clientfrom openai import OpenAI
from dotenv import load_dotenvload_dotenv()  # 加載環境變量從 .envclass MCPClient:def __init__(self):# 初始化會話和客戶端對象self.session: Optional[ClientSession] = None # 會話對象self.exit_stack = AsyncExitStack() # 退出堆棧self.openai = OpenAI(api_key="EMPTY", base_url="") self.model="qwen-2.5-14b"def get_response(self, messages: list,tools: list):response = self.openai.chat.completions.create(model=self.model,max_tokens=1000,messages=messages,tools=tools,)return responseasync def get_tools(self):# 列出可用工具response = await self.session.list_tools()available_tools = [{ "type":"function","function":{"name": tool.name,"description": tool.description, # 工具描述"parameters": tool.inputSchema  # 工具輸入模式}} for tool in response.tools]return available_toolsasync def connect_to_server(self, server_script_path: str):"""連接到 MCP 服務器參數:server_script_path: 服務器腳本路徑 (.py 或 .js)"""is_python = server_script_path.endswith('.py')is_js = server_script_path.endswith('.js')if not (is_python or is_js):raise ValueError("服務器腳本必須是 .py 或 .js 文件")command = "python" if is_python else "node"# 創建 StdioServerParameters 對象server_params = StdioServerParameters(command=command,args=[server_script_path],env=None)# 使用 stdio_client 創建與服務器的 stdio 傳輸stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))# 解包 stdio_transport,獲取讀取和寫入句柄self.stdio, self.write = stdio_transport# 創建 ClientSession 對象,用于與服務器通信self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))# 初始化會話await self.session.initialize()# 列出可用工具response = await self.session.list_tools()tools = response.toolsprint("
連接到服務器,工具列表:", [tool.name for tool in tools])async def process_query(self, query: str) -> str:"""使用 OpenAI 和可用工具處理查詢"""# 創建消息列表messages = [{"role": "user","content": query}]# 列出可用工具available_tools = await self.get_tools()print(f"
可用工具: {json.dumps([t['function']['name'] for t in available_tools], ensure_ascii=False)}")# 處理消息response = self.get_response(messages, available_tools)# 處理LLM響應和工具調用tool_results = []final_text = []for choice in response.choices:message = choice.messageis_function_call = message.tool_calls# 如果不調用工具,則添加到 final_text 中if not is_function_call:final_text.append(message.content)# 如果是工具調用,則獲取工具名稱和輸入else:#解包tool_callstool_name = message.tool_calls[0].function.nametool_args = json.loads(message.tool_calls[0].function.arguments)print(f"準備調用工具: {tool_name}")print(f"參數: {json.dumps(tool_args, ensure_ascii=False, indent=2)}")try:# 執行工具調用,獲取結果result = await self.session.call_tool(tool_name, tool_args)print(f"
工具調用返回結果類型: {type(result)}")print(f"工具調用返回結果屬性: {dir(result)}")print(f"工具調用content類型: {type(result.content) if hasattr(result, 'content') else '無content屬性'}")# 安全處理contentcontent = Noneif hasattr(result, 'content'):if isinstance(result.content, list):content = "
".join(str(item) for item in result.content)print(f"將列表轉換為字符串: {content}")else:content = str(result.content)print(f"工具調用content值: {content}")else:content = str(result)print(f"使用完整result作為字符串: {content}")tool_results.append({"call": tool_name, "result": content})final_text.append(f"[調用工具 {tool_name} 參數: {json.dumps(tool_args, ensure_ascii=False)}]")# 繼續與工具結果進行對話if message.content and hasattr(message.content, 'text'):messages.append({"role": "assistant","content": message.content})# 將工具調用結果添加到消息messages.append({"role": "user", "content": content})# 獲取下一個LLM響應print("獲取下一個LLM響應...")response = self.get_response(messages, available_tools)# 將結果添加到 final_textcontent = response.choices[0].message.content or ""final_text.append(content)except Exception as e:print(f"
工具調用異常: {str(e)}")print(f"異常詳情: {traceback.format_exc()}")final_text.append(f"工具調用失敗: {str(e)}")return "
".join(final_text)async def chat_loop(self):"""運行交互式聊天循環(沒有記憶)"""print("
MCP Client 啟動!")print("輸入您的查詢或 'quit' 退出.")while True:try:query = input("
Query: ").strip()if query.lower() == 'quit':breakprint("
處理查詢中...")response = await self.process_query(query)print("
" + response)except Exception as e:print(f"
錯誤: {str(e)}")print(f"錯誤詳情: {traceback.format_exc()}")async def cleanup(self):"""清理資源"""await self.exit_stack.aclose() async def main():"""主函數:初始化并運行 MCP 客戶端此函數執行以下步驟:1. 檢查命令行參數是否包含服務器腳本路徑2. 創建 MCPClient 實例3. 連接到指定的服務器4. 運行交互式聊天循環5. 在結束時清理資源用法:python client.py <path_to_server_script>"""# 檢查命令行參數if len(sys.argv) < 2:print("Usage: python client.py <path_to_server_script>")sys.exit(1)# 創建 MCPClient 實例client = MCPClient()try:# 連接到服務器await client.connect_to_server(sys.argv[1])# 運行聊天循環await client.chat_loop()finally:# 確保在任何情況下都清理資源await client.cleanup()if __name__ == "__main__":import sysasyncio.run(main())

輸出指令:寫一首詩并且保存到本地。成功完成任務。


總結

隨著 AI 技術的不斷進步和應用場景的日益復雜,單一大語言模型的能力已無法滿足實際需求。MCP 作為一種全新的開放標準協議,通過提供統一、標準化、雙向實時的接口,為 AI 模型整合外部工具和數據源提供了革命性的解決方案。從打破碎片化困局、提升數據安全、到實現跨平臺部署,MCP 的出現無疑將推動 AI 應用向更高層次發展。

雖然目前行業內對 MCP 的看法仍存在分歧——有支持者認為它將引領未來,有質疑者將其視為短暫的熱潮——但不可否認的是,MCP 已經為開發者提供了一種全新的工具接入思路,其標準化和開放性特質,必將在未來的 AI 生態中發揮越來越重要的作用。

無論你是偏向于使用 MCP 構建企業級解決方案,還是更喜歡依賴 LangChain 快速開發原型,都可以看到這一領域正在經歷一場深刻的變革。正如業內專家所言,“未來的 AI 應用生態,很可能就是在這兩種思路的碰撞與融合中誕生的。”

希望這篇文章能夠為你提供對 MCP 及其在 AI 領域中作用的全面認識。如果你有更多想法或疑問,歡迎在評論區交流探討!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905778.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據中心末端配電監控產品

精密配電介紹 數據中心配電系統圖 交流220V和直流-48V、240V、336V(400V)對比 產品簡介 AMC精密配電監控解決方案是針對精密配電柜&#xff08;列頭柜&#xff09;的監控要求&#xff0c;設計開發一套完整的解決方案&#xff0c;包括交流&#xff08;AC 220V&#xff09;、直…

工業4G路由器IR5000公交站臺物聯網應用解決方案

隨著城市化進程的加速&#xff0c;公共交通是智慧城市的重要樞紐。城市公共交通由無數的公交站臺作作為節點組合而成&#xff0c;其智能化升級成為提升城市出行效率與服務質量的關鍵。傳統公交站臺信息發布滯后、缺乏實時性&#xff0c;難以滿足乘客對公交信息快速獲取的需求&a…

Qt圖表繪制(QtCharts)- 性能優化(13)

文章目錄 1 批量替換代替追加1.1 測試11.2 測試21.3 測試3 2 開啟OpenGL2.1 測試12.2 測試22.3 測試32.4 測試4 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發 &#x1f448;&#x1f449;QtCharts繪圖 &#x1f448;&#x1f449;python開發 &#x1f…

嵌入式故障碼管理系統設計實現

文章目錄 前言一、故障碼管理系統概述二、核心數據結構設計2.1 故障嚴重等級定義2.2 模塊 ID 定義2.3 故障代碼結構2.4 故障記錄結構 三、故障管理核心功能實現3.1 初始化功能3.2 故障記錄功能3.3 記錄查詢與清除功能3.4 系統自檢功能 四、故障存儲實現4.1 Flash 存儲實現4.2 R…

動態規劃-63.不同路徑II-力扣(LeetCode)

一、題目解析 與62.不同路徑不同的一點是現在網格中有了障礙物&#xff0c;其他的并沒有什么不同 二、算法解析 1.狀態表示 dp[i][j]表示&#xff1a;到[i,j]位置時&#xff0c;不同的路徑數 2.狀態轉移方程 由于多了障礙物&#xff0c;所以我們要判斷是否遇到障礙物 3.初…

使用CherryStudio +SiliconFlow 部署獨立的deepseek+知識庫

deepseek知識庫&#xff0c;獨立的deepseek 首先我們先了解 CherryStudio&#xff1f;SiliconFlow&#xff1f; CherryStudio是一個支持多平臺的AI客戶端&#xff0c;我們致力于讓更多人能夠享受到AI帶來的便利。 簡單來說&#xff0c;它是一個能讓普通人輕松用上AI 的「萬能工…

Openshift節點Disk pressure

OpenShift 監控以下指標&#xff0c;并定義以下垃圾回收的驅逐閾值。請參閱產品文檔以更改任何驅逐值。 nodefs.available 從 cadvisor 來看&#xff0c;該node.stats.fs.available指標表示節點文件系統&#xff08;所在位置&#xff09;上有多少可用&#xff08;剩余&#xf…

MySQL的 JOIN 優化終極指南

目錄 前言序章&#xff1a;為何要有JOIN&#xff1f;——“一個好漢三個幫”的數據庫哲學 &#x1f91d;第一章&#xff1a;JOIN的“七十二變”——常見JOIN類型速覽 &#x1f3ad;第二章&#xff1a;MySQL的“紅娘秘籍”——JOIN執行原理大揭秘 &#x1f575;??♀?&#x1…

TLS 1.3黑魔法:從協議破解到極致性能調優

一、TLS協議逆向工程實驗 1.1 密碼學套件破解劇場 實驗準備&#xff1a; 靶機&#xff1a;啟用TLS 1.2的Nginx服務器 工具集&#xff1a;Wireshark OpenSSL s_client 定制Python腳本 實戰攻擊復現&#xff1a; # 強制使用弱加密套件連接 openssl s_client -connect exa…

國標GB/T 12536-90滑行試驗全解析:純電動輕卡行駛阻力模型參數精準標定

摘要 本文以國標GB/T 12536-90為核心框架&#xff0c;深度解析純電動輕卡滑行試驗的完整流程與數據建模方法&#xff0c;提供&#xff1a; 法規級試驗規范&#xff1a;從環境要求到數據采集全流程詳解行駛阻力模型精準標定&#xff1a;最小二乘法求解 ( FAv^2BvC ) 的MATLAB實…

【GaussDB遷移攻略】DRS支持CDC,解決大規模數據遷移挑戰

目錄 1 背景介紹 2 CDC的實現原理 3 DRS的CDC實現方式 4 DRS的CDC使用介紹 5 總結 1 背景介紹 隨著國內各大行業數字化轉型的加速&#xff0c;客戶的數據同步需求越來越復雜。特別是當需要將一個源數據庫的數據同時遷移到不同的目標庫場景時&#xff0c;華為云通常會創建…

PSA Certified

Arm 推出的 PSA Certified 已成為安全芯片設計領域的黃金標準。通過對安全啟動、加密服務以及更新協議等方面制定全面的要求&#xff0c;PSA Certified為芯片制造商提供了清晰的路線圖&#xff0c;使其能將安全機制深植于定制芯片解決方案的基礎架構中。作為對PSA Certified的補…

游戲引擎學習第286天:開始解耦實體行為

回顧并為今天的內容定下基調 我們目前正在進入實體系統的一個新階段&#xff0c;之前我們已經讓實體的移動系統變得更加靈活&#xff0c;現在我們想把這個思路繼續延伸到實體系統的更深層次。今天的重點&#xff0c;是重新審視我們處理實體類型&#xff08;entity type&#x…

遙感圖像非法采礦礦區識別分割數據集labelme格式1818張3類別

數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件) 圖片數量(jpg文件個數)&#xff1a;1818 標注數量(json文件個數)&#xff1a;1818 標注類別數&#xff1a;3 標注類別名稱:["river","illegal-mining"…

python爬蟲實戰訓練

前言&#xff1a;哇&#xff0c;今天終于能訪問豆瓣了&#xff0c;前幾天爬太多次了&#xff0c;網頁都不讓我訪問了&#xff08;要登錄&#xff09;。 先來個小練習試試手吧&#xff01; 爬取豆瓣第一頁&#xff08;多頁同上篇文章&#xff09;所有電影的排名、電影名稱、星…

Go語言實現生產者-消費者問題的多種方法

Go語言實現生產者-消費者問題的多種方法 生產者-消費者問題是并發編程中的經典問題&#xff0c;涉及多個生產者生成數據&#xff0c;多個消費者消費數據&#xff0c;二者通過緩沖區&#xff08;隊列&#xff09;進行協調&#xff0c;保證數據的正確傳遞和同步。本文將從簡單到…

【Opencv】canny邊緣檢測提取中心坐標

采用opencv 對圖像中的小球通過canny邊緣檢測的方式進行提取坐標 本文介紹了如何使用OpenCV對圖像中的小球進行Canny邊緣檢測&#xff0c;并通過Zernike矩進行亞像素邊緣檢測&#xff0c;最終擬合橢圓以獲取小球的精確坐標。首先&#xff0c;圖像被轉換為灰度圖并進行高斯平滑…

藍橋杯12屆國B 123

題目描述 小藍發現了一個有趣的數列&#xff0c;這個數列的前幾項如下&#xff1a; 1,1,2,1,2,3,1,2,3,4,? 小藍發現&#xff0c;這個數列前 1 項是整數 1&#xff0c;接下來 2 項是整數 1 至 2&#xff0c;接下來 3 項是整數 1 至 3&#xff0c;接下來 4 項是整數 1 至 4&…

鴻蒙OSUniApp 制作動態加載的瀑布流布局#三方框架 #Uniapp

使用 UniApp 制作動態加載的瀑布流布局 前言 最近在開發一個小程序項目時&#xff0c;遇到了需要實現瀑布流布局的需求。眾所周知&#xff0c;瀑布流布局在展示不規則尺寸內容&#xff08;如圖片、商品卡片等&#xff09;時非常美觀和實用。但在實際開發過程中&#xff0c;我…

ThinkStation圖形工作站進入BIOS方法

首先視頻線需要接在獨立顯卡上&#xff0c;重新開機&#xff0c;持續按F1&#xff0c;或者顯示器出來lenovo的logo的時候按F1&#xff0c;這樣就進到bios里了。聯*想*坑&#xff0c;戴爾貴。靠。