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