机器学习入门,第一个MCP示例

发布于:2025-09-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

前面我们已经搭建了属于自己的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服务器。

  1. 查找Open-WebUI的配置目录:Docker卷 open-webui-data 包含了Open-WebUI的配置和数据。你需要找到此卷在Mac主机上的实际挂载路径。
docker volume inspect open-webui-data

在输出中找到 Mountpoint 字段的值,这就是挂载点路径。

  1. 创建MCP配置文件:进入上一步找到的挂载点路径,导航到 data 子目录。在此创建或编辑一个名为 mcp.json 的文件(如果不存在的话),并添加以下配置,注意替换 /path/to/your/ 为你存放 file_server.py 的实际路径:
{
  "mcpServers": {
    "file-tools": {
      "command": "python",
      "args": ["/path/to/your/file_server.py"]
    }
  }
}
  1. 重启Open-WebUI容器:修改配置后,重启容器以使更改生效。
docker restart open-webui

第五步:测试与使用

  1. 访问Open-WebUI:在浏览器中打开 http://localhost:3000。
  2. 选择模型和MCP工具:
    ○ 在聊天界面,确保选择你之前拉取的 phi3:mini 模型。
    ○ 当你输入消息时,界面应该会提示或显示可用的MCP工具(例如 list_desktop_files)。
  3. 与模型和工具交互:你可以尝试让模型使用这些工具:
    ○ 直接提问:“你能用工具看看我桌面上有什么文件吗?”
    ○ 手动选择工具:在输入框下方,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解释器路径和脚本路径是否正确。


网站公告

今日签到

点亮在社区的每一天
去签到