文章目錄
目錄
文章目錄
前言
一、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 領域中作用的全面認識。如果你有更多想法或疑問,歡迎在評論區交流探討!