前面我們已經搭建了屬于自己的AI大模型:詳情見 https://blog.csdn.net/hl_java/article/details/150591424?spm=1001.2014.3001.5501
近期MCP概念這么火,那么它到底是什么呢,借一個例子為你講解
第一步:理解MCP的核心價值
MCP (Model Context Protocol) 是一個由Anthropic提出的開放協議,它就像是給大模型提供了一個標準化的“插線板”,允許模型安全、方便地連接到外部資源,如數據庫、文件系統、API等。這樣一來,模型就不再是“紙上談兵”,而是能真正操作你的數據,為你完成更具體的任務。
第二步:安裝MCP必要組件
首先,你需要在你的Mac本地(而不是Ollama的Docker容器內)安裝所需的Python包。打開終端,執行:
pip install mcp pandas
● mcp 庫是構建MCP服務器的基礎。
● 安裝 pandas 是為了后續示例中可能的數據分析操作。
第三步:創建MCP服務器腳本
在你的Mac上選擇一個合適的目錄,創建一個名為 file_server.py 的Python文件,然后將以下代碼復制進去。這個腳本創建了一個簡單的MCP服務器,提供了列出桌面文件和讀取文件基本信息的工具。
import os
import pandas as pd
from datetime import datetime
from mcp.server.fastmcp import FastMCP# 初始化FastMCP實例,命名為"FileTools"
mcp = FastMCP("FileTools")@mcp.tool()
def list_desktop_files() -> list:"""獲取當前用戶桌面上的文件列表及其基本信息(文件名、大小、修改時間)。Returns:list: 包含桌面文件信息的字典列表。"""desktop_path = os.path.expanduser("~/Desktop")file_list = []try:for filename in os.listdir(desktop_path):file_path = os.path.join(desktop_path, filename)if os.path.isfile(file_path): # 只處理文件,忽略文件夾file_stat = os.stat(file_path)file_list.append({"name": filename,"size_bytes": file_stat.st_size,"size_mb": round(file_stat.st_size / (1024 * 1024), 2),"last_modified": datetime.fromtimestamp(file_stat.st_mtime).strftime('%Y-%m-%d %H:%M:%S')})# 使用pandas只是為了更好地格式化輸出,你也可以直接返回file_listdf = pd.DataFrame(file_list)return df.to_string(index=False) if not df.empty else "您的桌面上沒有文件。"except Exception as e:return f"讀取桌面時發生錯誤: {str(e)}"@mcp.tool()
def get_file_info(filepath: str) -> str:"""獲取指定文件的詳細信息。Args:filepath (str): 文件的絕對路徑。Returns:str: 文件的詳細信息字符串。"""try:if not os.path.isabs(filepath):return "錯誤:請提供文件的絕對路徑。"if not os.path.isfile(filepath):return f"錯誤:路徑 '{filepath}' 不是一個文件或不存在。"file_stat = os.stat(filepath)file_info = {"文件名": os.path.basename(filepath),"絕對路徑": filepath,"文件大小 (字節)": file_stat.st_size,"文件大小 (MB)": round(file_stat.st_size / (1024 * 1024), 2),"最后修改時間": datetime.fromtimestamp(file_stat.st_mtime).strftime('%Y-%m-%d %H:%M:%S'),"是否為文件": os.path.isfile(filepath)}info_string = "\n".join([f"{key}: {value}" for key, value in file_info.items()])return info_stringexcept Exception as e:return f"獲取文件信息時發生錯誤: {str(e)}"if __name__ == "__main__":# 使用stdio傳輸模式運行MCP服務器mcp.run(transport='stdio')
第四步:配置Open-WebUI以連接MCP服務器
由于你已通過Docker安裝了Open-WebUI,現在需要配置它來識別并使用我們剛創建的MCP服務器。
- 查找Open-WebUI的配置目錄:Docker卷 open-webui-data 包含了Open-WebUI的配置和數據。你需要找到此卷在Mac主機上的實際掛載路徑。
docker volume inspect open-webui-data
在輸出中找到 Mountpoint 字段的值,這就是掛載點路徑。
- 創建MCP配置文件:進入上一步找到的掛載點路徑,導航到 data 子目錄。在此創建或編輯一個名為 mcp.json 的文件(如果不存在的話),并添加以下配置,注意替換 /path/to/your/ 為你存放 file_server.py 的實際路徑:
{"mcpServers": {"file-tools": {"command": "python","args": ["/path/to/your/file_server.py"]}}
}
- 重啟Open-WebUI容器:修改配置后,重啟容器以使更改生效。
docker restart open-webui
第五步:測試與使用
- 訪問Open-WebUI:在瀏覽器中打開 http://localhost:3000。
- 選擇模型和MCP工具:
○ 在聊天界面,確保選擇你之前拉取的 phi3:mini 模型。
○ 當你輸入消息時,界面應該會提示或顯示可用的MCP工具(例如 list_desktop_files)。 - 與模型和工具交互:你可以嘗試讓模型使用這些工具:
○ 直接提問:“你能用工具看看我桌面上有什么文件嗎?”
○ 手動選擇工具:在輸入框下方,Open-WebUI可能會顯示檢測到的工具,你可以點擊選擇并執行。
○ 查看結果:模型會調用MCP服務器并獲得結果,然后將結果整合到它的回復中。
第六步:驗證與調試
● 查看日志:如果工具沒有按預期工作,查看Open-WebUI和MCP服務器的日志非常重要。
○Open-WebUI日志:docker logs open-webui
○ 你的 file_server.py 腳本如果直接運行(python /path/to/your/file_server.py)也會在終端輸出信息,有助于判斷它是否被正確調用和是否有語法錯誤。
● 確保路徑正確:這是最常見的問題。再次確認 mcp.json 配置文件中的Python解釋器路徑和腳本路徑是否正確。