MCP 实战系列(Day 2)- 动手搓个文件系统 MCP 服务器

【AI入门】CherryStudio入门3:结合FastMCP创建自己的MCP服务,实现哔哩视频查询 建立自己的MCP服务逻辑,按关键字搜索哔哩哔哩的相关视频,在CherryStudio上,运行服务,供使用 阅读详情

上期回顾:MCP 实战系列(Day 1)- 什么是 MCP?

在上期文章中,我们详细介绍了 Model Context Protocol(MCP)的基本概念和应用场景。本节将带领大家开发一个简易的 Filesystem MCP Server,通过代码示例逐步讲解实现细节。

本期目标:掌握 MCP Server 开发的基础框架,实现一个支持基本文件系统操作的服务器。

开源地址:https://github.com/jinzcdev/mcp-demos

请添加图片描述

开发环境准备

官方提供了 Python、Node、Java、Kotlin、C# 五种语言的 MCP 服务器 SDK。本文以 Python 为例进行开发,其他语言的实现方式类似。读者可根据实际项目需求选择熟悉的开发语言。

MacOS/Linux 系统

  1. 安装 uv 工具
curl -LsSf https://astral.sh/uv/install.sh | sh
  1. 创建项目目录并安装依赖
# 创建项目目录并进入
uv init simple-filesystem-server-python
cd simple-filesystem-server-python

# 创建虚拟环境并激活
uv venv
source .venv/bin/activate

# 安装 MCP 相关依赖
uv add "mcp[cli]"

# 创建 MCP Server 文件
touch simple_filesystem.py

说明:uv 是一个高效的 Python 包管理工具,功能类似 pip。如果更熟悉 pip,也可以使用 pip install "mcp[cli]" 安装依赖或创建虚拟环境。mcp[cli] 中的 cli 表示额外安装 typer 和 python-dotenv 两个库,前者用于创建命令行界面,后者用于加载环境变量(可通过查看 mcp 依赖库源代码中的 project.optional-dependencies 配置项找到这两个额外依赖)。最后创建的 simple_filesystem.py 文件是定义 MCP 服务的核心源文件,我们将在其中创建相关工具。

编写 MCP Server 代码

我们将实现一个简易的 Filesystem MCP Server,支持在指定目录中进行文件查找、读写等操作。

值得一提的是,Claude 官方已经提供了一个功能完备的 Node.js 版本 Filesystem MCP Server,包含了丰富的文件系统操作工具。本文选择使用 Python 重新实现,目的是帮助读者更清晰地理解 MCP Server 的 开发流程 和 工具设计思路,而非重复造轮子。

接下来,让我们逐步实现这个服务器。

1. 导入必要模块并初始化服务器

完成前面的准备步骤后,我们首先在 simple_filesystem.py 中导入所需模块,并通过命令行参数指定允许访问的目录:

from mcp.server.fastmcp import FastMCP
import os
import os.path as osp
import argparse

parser = argparse.ArgumentParser(description="Simple Filesystem MCP Server")
parser.add_argument("allowed_dirs", nargs="+", help="List of allowed directories for file operations")
args = parser.parse_args()

allowed_directories = [osp.abspath(dir_path) for dir_path in args.allowed_dirs]

mcp = FastMCP("SimpleFileSystemMCPServer", log_level="ERROR")

说明:使用 argparse 解析命令行参数,在 MCP 服务启动时指定可访问的目录(防止 LLM 访问系统中的任意目录)。这里 FastMCP 初始化了一个名为 Simple Filesystem MCP Server 的服务器实例,日志级别设为 ERROR(测试时发现 Cline 客户端因为服务运行时输出的 INFO 日志导致无法列举服务工具,但不影响工具调用)。

2. 实现工具逻辑

使用 @mcp.tool 装饰器定义以下功能工具,这里的 @mcp.tool 可以理解为在 MCP Server 中注册一个工具,不定义 name 的情况下,工具名默认为函数名称:

(1) list_directory - 查找文件和目录
@mcp.tool(
    description="获取指定路径下的所有文件和目录的详细列表。返回结果会通过 [FILE] 和 [DIR] 前缀明确区分文件类型。该工具对于了解目录结构及查找特定文件非常实用。仅限在允许访问的目录中操作。"
)
async def list_directory(dir_path) -> str:
    if not osp.exists(dir_path) or not osp.isdir(dir_path):
        raise ValueError(f"{dir_path} is not a valid directory")

    entries = os.listdir(dir_path)
    formatted = []
    for entry in entries:
        entry_path = osp.join(dir_path, entry)
        if osp.isdir(entry_path):
            formatted.append(f"[DIR] {entry}")
        else:
            formatted.append(f"[FILE] {entry}")

    return "\n".join(formatted)

该工具返回指定目录下的文件和子目录列表,使用 [DIR] 和 [FILE] 前缀区分。当目录不存在时抛出异常,帮助模型理解当前文件系统状态。

最初定义工具时,我采用了 os.walk 递归调用的方式来实现目录遍历,但目录中可能包含大量依赖文件(如 node_modules),浪费 Token 数,所以我们只需要返回第一层的文件和目录列表即可,必要时让模型继续向下搜索即可。

(2) read_file - 读取文件内容
@mcp.tool(
    description="读取文件系统中的完整文件内容。支持处理多种文本编码格式,若读取失败将返回详细错误信息。适用于需要检查单个文件内容的场景。仅可在允许访问的目录中操作。"
)
async def read_file(file_path) -> str:
    if not osp.exists(file_path) or not osp.isfile(file_path):
        raise ValueError(f"{file_path} is not a valid file")

    with open(file_path, "r") as file:
        content = file.read()
    return content

该工具读取单个文件内容,当文件不存在或无效时抛出异常。

注意:如果文件内容过大也可能导致 Token 数溢出,实际开发中可设置字符数限制,超过则截断或做其他处理。

(3) write_file - 写入文件
@mcp.tool(
    description="创建新文件或完全覆盖现有文件内容。使用时需谨慎,此操作将直接覆盖目标文件且无警告提示。支持正确处理文本编码,仅限在允许的目录内执行。"
)
async def write_file(file_path, content) -> str:
    if not osp.exists(osp.dirname(file_path)):
        raise ValueError(f"Directory for {file_path} does not exist")

    with open(file_path, "w") as file:
        file.write(content)
    return f"Successfully wrote to {file_path}"

该工具实现文件写入功能,在目标目录不存在时抛出异常,成功则返回确认信息。

注意:写文件是危险操作,建议在 MCP 工具调用时确认是否执行该操作,避免误操作导致数据丢失。

(4) read_multiple_files - 批量读取文件
@mcp.tool(
    description="同时读取多个文件的内容。当需要分析或比较多个文件时,这种方式比逐个读取更高效。每个文件的内容将与其路径一并返回,便于追溯。即使个别文件读取失败,也不会中断整体操作。仅限在允许的目录内执行。"
)
async def read_multiple_files(file_paths) -> str:
    results = []
    for file_path in file_paths:
        try:
            if not osp.exists(file_path) or not osp.isfile(file_path):
                results.append(f"{file_path}: Error - Not a valid file")
                continue
            with open(file_path, "r") as file:
                content = file.read()
            results.append(f"{file_path}:\n{content}")
        except Exception as e:
            results.append(f"{file_path}: Error - {str(e)}")

    return "\n---\n".join(results)

该工具支持批量文件读取操作,使用分隔符区分不同文件内容(保持数据结构化便于模型理解)。为保证健壮性,单文件读取失败不会中断整个操作,并将错误信息返回给模型处理。

说明:为了便于读者理解,我在上述 4 个工具的 description 部分使用了中文描述,在实际测试中,发现中英文描述均不影响模型理解工具含义。

3. 启动服务器

在文件末尾添加启动代码:

if __name__ == "__main__":
    mcp.run(transport="stdio")

最后,在项目根目录下,运行命令启动 MCP 服务器:

uv run simple_filesystem.py /path/to/dir1 /path/to/dir2

服务启动后不会有输出,这属于正常现象。下面我们将使用 MCP 客户端测试服务器。

测试 Filesystem MCP Server

常用的 MCP 客户端包括 Claude for Desktop、Cursor、Cline、GitHub Copilot(现已支持 MCP)、Cheery Studio 等。由于 Claude 客户端可能存在国内网络访问问题,而 Cline 与 GitHub Copilot 都内置了文件读取工具,不便测试,因此我们选择 Cherry Studio 进行测试。

安装并配置客户端

从官网 https://cherry-ai.com/ 下载最新版 Cherry Studio。

配置服务器

1、打开 Cherry Studio 的 设置,点击 MCP 服务器
2、手动 添加服务器 或点击 编辑 MCP 配置,将以下配置添加到配置文件中:

请添加图片描述
请添加图片描述

{
    "mcpServers": {
        "simplefilesystem": {
            "isActive": true,
            "name": "Filesystem MCP Server",
            "type": "stdio",
            "description": "用于获取本地目录列表、读写本地文件的 MCP Server",
            "registryUrl": "https://pypi.tuna.tsinghua.edu.cn/simple",
            "command": "uv",
            "args": [
                "--directory",
                "/ABSOLUTE/PATH/TO/simple-filesystem-server-python",
                "run",
                "simple_filesystem.py",
                "/path/to/dir1",
                "/path/to/dir2"
            ]
        }
    }
}

注意:上述配置中的命令行参数 args,需修改为真实的项目地址与允许服务访问的目录。

3、在 设置-模型服务 中选择模型并输入 API Key(需开启函数调用功能),这里选择了 DeepSeek V3:

在这里插入图片描述

4、返回聊天页面,在输入框下启用 MCP 服务

功能验证

请添加图片描述

通过多次工具调用,模型成功读取了本地文件并执行了内容总结。


完整代码已经上传到我的 GitHub 仓库,并封装了更多文件操作的工具,可通过以下命令获取源代码:

git clone https://github.com/jinzcdev/mcp-demos.git

总结

本文详细介绍了如何使用 Python 开发一个简易的 Filesystem MCP Server,实现了四个核心功能工具:

  1. list_directory - 目录内容列表
  2. read_file - 单文件读取
  3. write_file - 文件写入
  4. read_multiple_files - 批量文件读取

通过 Cherry Studio 客户端的测试验证了 Filesystem MCP Server 的功能。开发过程中我总结了以下创建 MCP Server Tools 的核心经验:

  1. 详尽的工具描述:清晰说明工具功能和使用场景,提升模型调用准确率
  2. 明确的错误反馈:工具调用失败时返回具体错误信息,辅助模型调整策略
  3. 保证工具健壮性:局部错误不要中断整体操作,返回部分成功结果

本文是 《从原理到实战:掌握 MCP》 系列的第二篇文章,间隔时间较长了。如果文章对你有帮助欢迎收藏、转发,您的关注是我更新的最大动力。如有疑问欢迎在评论区留言。

往期推荐:

  1. MCP 实战系列(Day 1):什么是 MCP?
  2. VS Code 预览版 Copilot 终于支持 MCP 了:试试使用 MCP 快速查询 GitHub Issues 吧
FastMCP 装饰器实战:从 tool()、resource() 到 prompt() 的进阶用法与避坑指南 本文深入解析FastMCP装饰器的实战应用,涵盖@mcp.tool()、@mcp.resource()和@mcp.prompt()的进阶用法与常见陷阱。通过源码分析和实战案例,详细介绍了如何利用装饰器构建复杂的MCP服务器,包括参数类型注解、结构化输出、动态资源URI匹配、提示词模板构建以及性能优化策略,并提供了关键的避坑指南。 阅读详情

相关推荐

from fastmcp import FastMCP和from mcp.server.fastmcp import FastMCP的区别是什么?

一直比较困惑的是,好像用python实现mcp server有两种实现方式。但是,这个info不好的点在于,它会干扰cline,让它误认为我们有什么错。而且,我们刚才改的那个代码,如果不改,两边都报info,改了之后就都不报了。按照大模型的说法,应该是前者比较权威,设计网上的资料比较多。作为程序员我们都知道,info这个东西不是报错,不影响使用。就很离谱,暂时没搞清楚,这样重复造轮子的意义是什么。因此,觉得以实际尝试,来看看二者的区别。但我现在,直接最终它的代码,看看有啥发现。启动了一个服务,咱访问一下。

xiezhipu的博客 895

从MCP基础到FastMCP实战应用

FastMCP是专为 Claude 设计的轻量级工具,避免了复杂的网络设置。它通过标准输入输出 () 与 Claude 桌面版通信。使用 FastMCP 可以更高效地完成实际的 MCP 开发和集成。

2404_84768005的博客 3095

从圆形到椭圆:CenterNet中高斯热图半径的自适应优化策略

本文深入探讨了CenterNet目标检测模型中高斯热图生成策略的优化,针对传统圆形高斯核在处理长宽比差异大目标时的局限性,提出了自适应椭圆高斯核的解决方案。通过数学推导和代码实战,详细阐述了如何根据目标边界框尺寸动态计算椭圆长短轴半径,生成更贴合目标几何形状的热图监督信号,从而有效提升模型,尤其是对无人机、车辆等不规则目标的定位精度。

alice7model的博客 982

【动手学MCP从0到1】2.2 MCP中的Tool(获取天气信息实战操作步骤详解)

本文介绍了如何使用MCP服务中的Tool功能实现天气预报查询。文章包含完整的代码示例,包括API调用、参数传递和数据处理等关键步骤,为开发者提供了完整的工具开发流程参考。

lys_828的博客 2230

不带DDR的ZYNQ使用OCM加载程序运行的方法

软件版本:Vivado Vitis2019.2 第一步: 在Vivado的ZYNQ Block Design时候不配置DDR 第二步: 在Vitis中: 1、 在Vitis中新建Platform,选择xsa文件: 2、 在xparameters.h中添加DDR的地址空间定义,如下: 3、 修改链接文件,修改每个段都到ram_0,因为ram_1空间全部给到应用程序 4、 修改fsbl工程的main.c,增加XPAR_PS7_DDR_0条件编译 5、 修改fsbl.h,重定义DDR_EN

hpf247的博客 5524

EDSR图像超分辨程序复现(踩坑及解决记录)

EDSR图像超分辨程序复现(踩坑及解决记录)

Sunny_Coder的博客 3636

MCP 实战系列(Day 1):什么是 MCP?

MCP是一个开放协议,它标准化了应用程序如何为 AI 模型提供上下文。你可以把 MCP 想象成 AI 应用程序的 USB-C 端口,就像 USB-C 提供了一个标准方式连接设备和各种外设一样,MCP 提供了一个标准方式让 AI 模型连接不同的数据源和工具。实际上,对小白来说,官方的例子还不够直观。以下,我会用更直白的例子解释 MCP 的核心概念。本文介绍了 MCP 协议的概念以及如何在 Cline 中配置一个 MCP Server,下一篇文章将介绍如何搭建一个自己的 MCP Server。

只想用最简短的代码刷题 1530

ARM架构下Horizon Client安装全攻略:从依赖检查到环境变量配置

本文详细介绍了在ARM架构设备上安装VMware Horizon Client的全过程,包括依赖检查、软件包获取、系统部署和环境变量配置。特别针对华为鲲鹏等ARM平台,提供了从基础准备到性能优化的完整指南,帮助用户高效完成虚拟桌面客户端的部署与调优。

github5actions的博客 541

每天10分钟轻松掌握MCP(适合小白):Day 5 - MCP环境初体验与工具链熟悉(一)

每天10分钟轻松掌握MCP(适合小白):Day 5 - MCP环境初体验与工具链熟悉(一)!如果文章对你有帮助,还请给个三连好评,感谢感谢!

weixin_40780178的博客 1789

Qt入门教程【数据类型篇】数值类型

Qt中的数值类型

小鱼酱的博客 1万+

工业质检封神!YOLOv8实战金属表面缺陷检测,自建数据集mAP突破95%

本文详细介绍了基于YOLOv8的金属表面缺陷检测实战方案。针对工业质检中的光照不均、纹理复杂、小样本等挑战,作者构建了12000张图像的数据集,提出针对性数据增强策略和两阶段训练方法。通过优化损失函数、调整超参数等技术手段,最终在测试集上达到95.1%的mAP@0.5,检测速度32FPS。相比传统方法,该方案在精度和鲁棒性上均有显著提升,为工业视觉质检提供了可复现的落地解决方案。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 422

【AI大模型应用开发】【项目实战】35.基于A2A协议的智能助手(多智能体)(三)项目实现之天气MCP服务器&票务员MCP服务器&订票MCP服务器

三个基于MCP协议的服务器:天气查询、票务查询和票务预订服务。天气MCP服务器=提供weather_data表的JSON格式查询接口,包含日期时间格式化处理;票务查询服务器=支持火车票、机票和演唱会票的数据查询;票务预订服务器=实现了火车票、机票和演唱会票的预订功能。每个服务都通过FastAPI提供HTTP接口,包含自定义JSON编码器处理特殊数据类型,并配有完整的客户端测试脚本。系统采用模块化设计,包含配置管理、日志记录和异常处理机制,通过MCP协议实现AI模型与服务的交互。

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 590

【软考之软件设计师】学习笔记

interface 接口implements 实现接口(与接口配套使用)接口里要是有方法定义,子类就会实现。

云轩阁 2519

每天10分钟轻松掌握MCP(适合小白):Day 1 - MCP概念入门与核心价值(第二部分)

每天10分钟轻松掌握MCP(适合小白):Day 1 - MCP概念入门与核心价值(第二部分):知识蒸馏压缩ViT模型!如果文章对你有帮助,还请给个三连好评,感谢感谢!

weixin_40780178的博客 1083

华为Ascend_toolkit在x86ubuntu安装失败报错。[WARNING] driver package is not installed. If you install in docker

这个报错发生在交叉编译配置Ascend_toolkit环境时,安装Ascend_toolkit安装包的时候发生。[Y/N]Y。

anananajiushiwo的博客 1013

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【MCP 分享】LeetCode(力扣) MCP Server 让 AI 替你修复 Bug + 记笔记,高效刷题

LeetCode MCP Server 是一个基于 模型上下文协议 (MCP) 的服务,提供与 LeetCode API 的无缝集成,实现与 LeetCode 编程题目、竞赛、题解和用户数据的高级自动化和智能交互。

只想用最简短的代码刷题 1558

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

每天10分钟轻松掌握MCP(适合小白):Day 3 - MCP客户端-服务器架构深度解析(一)

每天10分钟轻松掌握MCP(适合小白):Day 3 - MCP客户端-服务器架构深度解析(一):知识蒸馏压缩ViT模型!如果文章对你有帮助,还请给个三连好评,感谢感谢!

weixin_40780178的博客 1006

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【MCP 分享】用 Markmap 与 MCP 打造 AI 驱动的思维导图生成工具

本文介绍了使用开源工具 Markmap​(将 Markdown 转为交互式思维导图)与 MCP 协议开发的 markmap-mcp-server 工具。该工具允许大语言模型直接调用 Markmap 功能,将 Markdown 文本自动转换为多种格式的思维导图(如 PNG/SVG),适用于整理思路、生成文档或结合其他工具(如 LeetCode 解题)扩展应用。

只想用最简短的代码刷题 1478

每天10分钟轻松掌握MCP(适合小白):Day 1 - MCP概念入门与核心价值(第一部分)

每天10分钟轻松掌握MCP(适合小白):Day1-MCP概念入门与核心价值(第一部分):知识蒸馏压缩ViT模型!如果文章对你有帮助,还请给个三连好评,感谢感谢!

weixin_40780178的博客 1092

15分钟搭建智能虚拟环境:MCP服务器多维度仿真集成指南

你还在为复杂系统的仿真环境搭建耗费数天时间?还在为多模块协同调试焦头烂额?本文将带你用MCP(Model Context Protocol)服务器套件,在15分钟内构建一个包含时间流、版本控制、文件系统的完整虚拟仿真环境。读完本文你将掌握: - 3大核心MCP服务的快速部署 - 跨模块数据交互的标准化流程 - 仿真场景的时间轴控制技术 - 虚拟环境状态的版本化管理 ## MCP服务器架构概览 ...

gitblog_00508的博客 1008

零误报神话终结:MCP服务器智能监控告警系统实战指南

你是否还在为服务器异常检测的高误报率烦恼?运维人员平均每天要处理20+无效告警,真正的故障却可能被淹没。本文将带你构建基于MCP(Model Context Protocol)服务器的智能监控体系,通过多维度数据融合与时序分析,实现异常检测准确率提升40%,告警响应速度提升60%。读完本文你将掌握: - MCP服务器监控数据采集的3大核心模块 - 异常模式识别的4种工程化实现方案 - 误报过滤的...

gitblog_01197的博客 1016

VS Code 预览版 Copilot 终于支持 MCP 了:试试使用 MCP 快速查询 GitHub Issues 吧

VS Code Insiders 支持 MCP Servers 了,试试使用 GitHub MCP Server 快速获取仓库的所有 Issues 吧

只想用最简短的代码刷题 3541

每天10分钟轻松掌握MCP(适合小白):Day 3 - MCP客户端-服务器架构深度解析(第二部分)

每天10分钟轻松掌握MCP(适合小白):Day 3 - MCP客户端-服务器架构深度解析(第二部分):知识蒸馏压缩ViT模型!如果文章对你有帮助,还请给个三连好评,感谢感谢!

weixin_40780178的博客 980

MCP安全认证终极指南:7天从零到部署的完整实战攻略

Model Context Protocol (MCP) 作为连接AI模型与工具的开放协议,其安全认证机制是保护AI工作流的核心屏障。本指南将通过7天实战路径,帮助你从零掌握MCP安全认证的实施要点,包括Entra ID集成、OAuth 2.1配置、AI特定威胁防护等关键技能,最终实现企业级MCP服务器的安全部署。 ## 🌟 为什么MCP安全认证至关重要 在AI驱动的自动化工作流中,MCP服

gitblog_00379的博客 663

每天10分钟轻松掌握MCP(适合小白):Day 5 - MCP环境初体验与工具链熟悉(二)

每天10分钟轻松掌握MCP(适合小白):Day 5 - MCP环境初体验与工具链熟悉(二)!知识蒸馏压缩ViT模型!如果文章对你有帮助,还请给个三连好评,感谢感谢!

weixin_40780178的博客 939

passage-of-time-mcp与FastMCP:构建AI工具服务器的完美组合

passage-of-time-mcp是一个为语言模型提供时间感知和时间计算能力的MCP服务器,它通过协作工具开发,让AI理解时间流逝的意义。结合FastMCP框架,它们共同构成了构建AI工具服务器的强大组合,为AI提供了精准的时间处理能力。 ## 为什么AI需要时间感知能力? 在与AI交互的过程中,我们经常会遇到这样的问题:AI无法准确理解时间概念,不能进行时间计算,也无法感知时间的流逝。这

gitblog_01095的博客 1053
上一篇: VS Code 预览版 Copilot 终于支持 MCP 了:试试使用 MCP 快速查询 GitHub Issues 吧
下一篇: 【MCP 分享】LeetCode(力扣) MCP Server 让 AI 替你修复 Bug + 记笔记,高效刷题
AI云师兄
博客等级 码龄7年 223粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值