简介

最近在进行实习,完成了一些嵌入式的代码开发后需要对客户的代码进行管理与迁移,主管和我说可以尝试使用AI搭建工作流,所以就了解了一下,感觉还是很有意义的。
本文将实现一个最简单的基于MCP协议的AI工具,具体功能是通过cursor的大模型调用MCP工具输入文件路径,然后工具返回文件内容,cursor中的大模型获取返回值并打印。该项目内容较官方展示的范例体量更小,更好展示cursor是怎么通过MCP调用这些工具的。


效果

cursor中的LLM调取MCP工具并返回工具返回内容。(Ciallo~ (∠・ω< )⌒★)
效果示例


环境搭建

环境搭建跟着官网来也是可以的,新建一个文件然后打开文件的powershell,在powershell里面输入

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

安装成功后会有以下反馈

C:\Users\senmiao.zhang>powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Downloading uv 0.8.16 (x86_64-pc-windows-msvc)
Installing to C:\Users\senmiao.zhang\.local\bin
  uv.exe
  uvx.exe
  uvw.exe
everything's installed!

To add C:\Users\senmiao.zhang\.local\bin to your PATH, either restart your shell or run:

    set Path=C:\Users\senmiao.zhang\.local\bin;%Path%   (cmd)
    $env:Path = "C:\Users\senmiao.zhang\.local\bin;$env:Path"   (powershell)

接下来根据官方的示例进行生成项目

# 为我们的项目创建一个新 directory
uv init read_file
cd read_file

# 创建 virtual environment 并激活它
uv venv
.venv\Scripts\activate

# 安装 dependencies
uv add mcp[cli] httpx

# 创建我们的 server file
new-item read_file.py

这样我们的项目初始化就完成了,然后我在项目文件夹里面加了一个code_store文件夹,里面放着了一个txt文件。以下是文件架构。
文件架构


编写代码

打开read_file.py文件,把以下代码复制进去

# read_file.py
import asyncio
from mcp.server.fastmcp import FastMCP

# 初始化 FastMCP Server
mcp = FastMCP("file-reader")

# 定义工具
@mcp.tool()
async def read_file(path: str) -> str:
    """
    读取指定文件内容并返回
    Args:
        path: 文件路径
    """
    try:
        with open(path, "r", encoding="utf-8") as f:
            content = f.read()
            print(f"[MCP] 成功读取文件: {path}, 内容长度={len(content)}")
            return content   # 直接返回字符串
    except Exception as e:
        print(f"[MCP] 读取文件失败: {path}, 错误: {e}")
        return f"Error reading file: {e}"

# 运行 MCP Server
if __name__ == "__main__":
    print("[MCP] File Reader Server 启动中...")
    mcp.run(transport="stdio")

然后打开cursor打开设置并添加mcp
文件架构
点击添加后会打开一个mcp.json的文件,初始应该是

{
    "mcpServers": {
    }
  }

替换为以下代码

{
    "mcpServers": {
      "file-reader": {
        "type": "stdio",
        "command": "python",
        "args": ["C:/Users/senmiao.zhang/Desktop/ai-workflow-demo/read_file/read_file.py"],
        "cwd": "C:/Users/senmiao.zhang/Desktop/ai-workflow-demo/read_file"
      }
    }
  }

这样我们就搭建好了mcp服务器和cursor端的调用(颇有一种ROS的感觉)
如果mcp工具栏中有正常显示绿灯的化就可以正常调用了,把AI调成自动模式他就会自己调用MCP。
文件架构


最小实现架构

我让AI生成了一个MCP工具的最小实现模板,这样我们就可以知道cursor中的AI是怎么调用的

"""
MCP 工具最小实现模板
说明:
1. 使用 FastMCP 可以自动注册工具,无需手动管理 list_tools 或 call_tool。
2. 工具函数直接返回结果即可,不需要 ToolResult 类型。
3. 通过 STDIO 方式启动,方便被 Cursor 等 MCP 客户端调用。
"""

import asyncio
from mcp.server.fastmcp import FastMCP

# -------------------------------
# 1. 初始化 FastMCP Server
# -------------------------------
# 参数 "tool-server" 是 MCP Server 名称,可随意命名
mcp = FastMCP("tool-server")

# -------------------------------
# 2. 定义工具
# -------------------------------
# 使用 @mcp.tool() 装饰器注册工具
# 工具函数可以是同步或异步函数
@mcp.tool()
async def read_file(path: str) -> str:
    """
    读取指定文件的内容并返回字符串
    
    Args:
        path: 文件路径(字符串)
    
    Returns:
        文件内容,如果出错返回错误信息字符串
    """
    try:
        # 打开文件并读取内容
        with open(path, "r", encoding="utf-8") as f:
            content = f.read()
            print(f"[MCP] 成功读取文件: {path}, 内容长度={len(content)}")
            return content  # 直接返回字符串
    except Exception as e:
        # 出错时打印日志并返回错误信息
        print(f"[MCP] 读取文件失败: {path}, 错误: {e}")
        return f"Error reading file: {e}"

# 可以在这里继续定义更多工具
# 例如:
# @mcp.tool()
# async def write_file(path: str, content: str) -> str:
#     ...

# -------------------------------
# 3. 启动 MCP Server
# -------------------------------
# transport="stdio" 表示通过标准输入输出与客户端通信
if __name__ == "__main__":
    print("[MCP] Tool Server 启动中...")
    mcp.run(transport="stdio")

cursor端mcp.json的代码

{
    "mcpServers": {
      "file-reader": {
        "type": "stdio",
        "command": "python",
        "args": ["C:/Users/senmiao.zhang/Desktop/ai-workflow-demo/read_file/read_file.py"],
        "cwd": "C:/Users/senmiao.zhang/Desktop/ai-workflow-demo/read_file"
      }
    }
  }
  
字段 作用
file-reader MCP Server 名称,Cursor 内部用这个名字调用工具
type 启动方式,这里用 "stdio",表示通过标准输入输出与 Server 通信
command 启动命令,这里是 "python",表示使用 Python 运行 MCP Server 脚本
args 命令参数,这里是 MCP Server 的 Python 文件路径
cwd 工作目录,Cursor 启动 Python 脚本时的当前目录,保证相对路径正确

可能的坑

  • 一个是我使用powershell的时候出现了一下报错,可能是因为我的电脑是办公电脑
.venv\Scripts\activate : 无法加载文件 C:\Users\senmiao.zhang\Desktop\ai-workflow-demo\test1\.venv\Scripts\activate.ps1
,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_P
olicies。
所在位置 行:1 字符: 1
+ .venv\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

输入一下指令解决

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
  • 还有一个是MCP版本的问题,这个我还不是很清楚,我使用官方最新的库编译一直不过,后面直接选择FastMCP了,这个还是可以使用的。

小结:我觉得MCP是一个非常有意思的协议,感觉就像是AI领域的ROS。这个博客只是大概调用了一下让我体会到了AI工具运作起来的效果,感觉还是不错的。对于MCP的细节这些我还没有怎么看,接下来几篇应该会仔细的剖析MCP的细节。希望这篇博客对正在尝试搭建工作流的朋友有所启发。

Logo

更多推荐