前面我们已经搭建了属于自己的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解释器路径和脚本路径是否正确。