关于 Fsext Mcp Server Python
Fsext Mcp Server Python 是面向 Agent 和 MCP 客户端的本地文件系统 MCP 服务,集成文件操作、图像处理、OCR 与搜索,并可限制操作在指定工作区内。
主要功能
- 01文件与目录管理
- 02文本和二进制流式读写
- 03递归搜索与替换
- 04图像缩放、裁剪和旋转
- 05基于 Tesseract 的 OCR
- 06工作区根目录隔离
适用场景
- 01管理工作区内的文件
- 02跨文件搜索和替换文本
- 03为后续任务处理图像
- 04从图像中提取文字
MCP 相关
通过 MCP 工具提供文件系统、图像、OCR 和搜索操作。支持 stdio、SSE 与 Streamable HTTP 传输,并可限制操作在指定根目录内。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
22收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| recursive | boolean | 是 | |
| only_files | boolean | 是 | |
| source_dir | string | 是 | |
| file_extension | any | 否 |
详细介绍
FsExt-MCP-Server (Python)
概述
功能全面且安全的 MCP 服务,用于执行本地文件系统操作,并内置图像处理、OCR 和媒体工具。完全符合官方 Model Context Protocol 规范,提供标准化的请求/响应架构、大文件流式 I/O、多传输方式远程部署,以及完善的文本搜索与替换功能,便于集成 LLM Agent。
核心功能
- 完整的文件与目录管理:支持创建、删除、复制和移动文件,查询元数据以及检查文件是否存在;支持递归复制和移动完整目录树,并提供覆盖安全控制。
- 流式文件读写:支持全文读取、按行分段读取文本、分块读取二进制数据、覆盖和追加写入文本/二进制数据,并经过优化,无需将整个大文件加载到内存中。
- 强大的搜索与替换功能:支持递归搜索整个目录中的文件内容,支持单文件/多文件上下文匹配,可配置匹配前后的行数,并支持正则表达式匹配、不区分大小写的搜索,以及统计匹配次数的原位文本替换。
- 图像处理工具:内置由 Pillow 驱动的高性能图像工具包,包括调整大小(支持锁定宽高比和画布填充)、裁剪,以及任意角度顺时针旋转。
- 原生 Tesseract OCR 识别:可靠地从图像中提取文本,但依赖本地安装 Tesseract 二进制文件。不提供 WASM 回退;空的二进制文件路径参数不会触发基于 JS 的备用 OCR 引擎。支持多语言 tessdata 资源,并可配置二进制文件和数据路径。
- 严格的输入验证与统一响应格式:所有工具均启用严格的
additionalProperties: false架构验证,以阻止意外的输入字段。所有操作共用通用的成功/错误封装结构,便于客户端统一解析。 - 多传输方式支持:兼容官方标准 MCP 传输方式:
stdio(本地桌面客户端集成)、sse(旧版轻量级远程流)和 Streamable HTTP(现代双向远程流传输)。 - 工作区安全隔离:提供
--lock-root目录限制功能。所有文件/目录操作均严格限定在指定的根工作区内,防止未经授权的跨目录路径逃逸攻击。
快速开始:使用 uvx 直接运行(无需预先安装)
uvx 会自动拉取已发布的 PyPI 软件包并启动隔离的运行时环境,无需手动安装依赖或设置虚拟环境。
1. uvx 基本启动命令
短命令(推荐)
# Default stdio mode, unrestricted full filesystem access
uvx fsext-mcp-server
# Lock all operations to a dedicated workspace (production security recommended)
uvx fsext-mcp-server --lock-root /your/workspace
完整命令
# Stdio mode with workspace isolation
uvx fsext-mcp-server --transport stdio --lock-root /your/workspace
# Remote SSE streaming service
uvx fsext-mcp-server --transport sse --host 0.0.0.0 --port 8000 --lock-root /your/workspace
# Modern Streamable HTTP remote service
uvx fsext-mcp-server --transport http --host 0.0.0.0 --port 8000 --lock-root /your/workspace
2. 将 FsExt 工具集成到 LLM 框架中
主机上无需预先部署;MCP 客户端建立连接时,uvx 会动态启动该服务。
客户端配置示例(Claude Desktop / Cursor MCP json)
{
"mcpServers": {
"fsext": {
"command": "uvx",
"args": [
"fsext-mcp-server",
"--lock-root",
"/your/workspace"
],
"env": {"PYTHONUTF8": "1"}
}
}
}
LangChain / LangGraph 核心集成代码片段
官方 langchain-mcp-adapters 存在会话生命周期限制;要实现完整稳定的长连接逻辑,需要额外定制适配器。以下是标准的最简连接模板:
# Core config: Connect to FsExt MCP via uvx stdio transport
server_config = {
"fsext": {
"transport": "stdio",
"command": "uvx",
"args": ["fsext-mcp-server", "--lock-root", r"/your/workspace"],
"env": {"PYTHONUTF8": "1"}
}
}
# Load all exposed filesystem MCP tools
client = MultiServerMCPClient(server_config)
async with client.session("fsext") as session:
mcp_tools = await load_mcp_tools(session)
# Bind loaded MCP tools to LLM instance for agent workflows
llm = ChatOpenAI(base_url="your-local-llm-api").bind_tools(mcp_tools)
通过 pip 进行传统安装和启动
安装已发布的 PyPI 软件包
pip install fsext-mcp-server
通过 pip 安装后的启动命令
# Default stdio local mode
fsext-mcp-server-py
fsext-mcp-server
# Short alias
fsext-py
fsext
# Secure workspace locked mode
fsext --lock-root /your/workspace
# Remote SSE streaming server
fsext --transport sse --port 8000
本地源代码仓库开发环境设置
建议使用 uv 快速部署确定性的环境:
# Clone official source repository
git clone https://github.com/kurtzhi/fsext-mcp-server-python
cd fsext-mcp-server-python
# Install full runtime + dev dependencies
uv sync
核心运行时依赖说明
- chardet:自动检测文本文件编码
- Pillow:用于缩放、裁剪和旋转流程的核心图像处理后端
- python-magic:准确识别跨平台文件 MIME 类型
- fastmcp:官方 Python MCP 服务框架
- uvicorn / starlette:HTTP/SSE 传输服务运行时
- pydantic:对所有工具输入参数进行严格的架构验证
- tesseract:用于本地 Tesseract OCR 二进制文件的原生绑定
启动用法
服务支持三种官方 MCP 传输模式,并可通过 CLI 标志灵活配置工作区根目录隔离。
启动参数参考表
| 参数 | 默认值 | 说明 |
|---|---|---|
--transport | stdio | MCP 传输类型:stdio / sse / http |
--host | 127.0.0.1 | 网络绑定地址(stdio 传输模式下忽略) |
--port | 8000 | 服务绑定端口(stdio 传输模式下忽略) |
--lock-root | None | 将所有文件系统操作限制在此根目录内;若省略,则完全不受限制 |
常见生产环境启动命令
1. 默认本地 Stdio 模式(适用于 Claude Desktop / Cursor AI 客户端)
uv run -m fsext
2. 启用强制工作区锁定的 Stdio 模式(用于安全的本地 Agent)
uv run -m fsext --lock-root /your/workspace/path
3. 远程 SSE 传输模式
uv run -m fsext --transport sse --host 0.0.0.0 --port 8000
访问端点
- SSE 长连接流订阅通道(服务端事件推送):
http://<host>:<port>/sse - 客户端 JSON-RPC 请求提交通道:
http://<host>:<port>/messages
MCP Inspector 连接配置
- 传输类型:SSE
- 连接地址输入:
http://127.0.0.1:8000/sse
4. 标准 Streamable HTTP 远程传输(现代双向模式)
uv run -m fsext --transport http --host 0.0.0.0 --port 8000
统一双向访问端点
客户端请求和服务端流式传输共用的单一入口:
http://<host>:<port>/mcp
MCP Inspector 连接配置
- 传输类型:Streamable HTTP
- 连接地址输入:
http://127.0.0.1:8000/mcp
5. SSE 与 Streamable HTTP 传输功能对比
| 功能 | SSE 双端点传输 | Streamable HTTP 单端点传输 |
|---|---|---|
| 端点架构 | 两个独立端点:GET 流订阅 + POST 消息发送 | 单个统一 URL 处理所有双向流量 |
| 通信模式 | 仅支持从服务端到客户端的单向事件推送 | 支持完整的双向请求/流混合能力 |
| 连接可靠性 | 会话频繁丢失,跨端点状态管理复杂 | 自动恢复会话,针对高并发远程连接优化 |
| 官方规范状态 | 兼容旧版的实现,不建议用于新部署 | 当前官方 MCP 网络远程集成标准 |
统一全局响应规范
所有 MCP 工具在执行成功和运行时失败时,均使用相同的顶层 JSON 封装结构。每个工具的业务负载都嵌套在根字段 res 下的 info 子对象中。
核心结构定义
{
"res": {
"success": boolean,
"info": object
}
}
success:全局操作状态标志true:工具逻辑已执行且未发生异常;info包含工具专属的返回数据false:操作失败(工作区逃逸拦截、文件缺失、IO 错误、输入架构无效、权限被拒等)
info字段的双重行为:- 成功模式(
success: true):各工具独有的自定义结构化业务负载 - 失败模式(
success: false):固定的标准化错误对象,包含机器可读的错误代码和人类可读的说明"info": { "code": "ERROR_CODE_IDENTIFIER", "message": "Detailed human-readable failure description" }
- 成功模式(
完整响应示例
1. 成功响应示例(fs_list_directory)
{
"res": {
"success": true,
"info": {
"paths": [
"/tmp/tests/test_util.py",
"/tmp/tests/__init__.py",
"/tmp/tests/img/cochem_castle.jpg"
]
}
}
}
2. 失败响应示例(工作区路径逃逸限制)
{
"res": {
"success": false,
"info": {
"code": "WORKSPACE_ESCAPE_FORBIDDEN",
"message": "Access restricted: Path `/tmp/test2` is outside allowed workspace `/tmp/tests`"
}
}
}
所有工具都会强制隔离工作区根目录,并完全遵循下方列出的标准化输入/输出架构定义。
完整 MCP 工具参考
所有工具输入架构均启用 additionalProperties: false 严格验证,以拒绝无法识别的参数并防止恶意路径注入。
1. 目录操作工具
fs_list_directory
描述:递归或浅层扫描目标目录,返回经过筛选的绝对文件系统路径列表,并提供文件类型和扩展名筛选选项。 参数:
source_dir(string,必填):要扫描的根目录路径recursive(boolean,必填):启用对所有子目录的完整递归遍历only_files(boolean,必填):将输出筛选为仅返回常规文件,不包含目录file_extension(string,可选,默认值=""):将结果筛选为与指定后缀扩展名匹配的文件 成功响应负载:
{
"res": {
"success": true,
"info": {
"paths": ["/absolute/path/file1.txt", "/absolute/path/file2.py"]
}
}
}
fs_copy_directory
描述:递归复制整个目录树,并可配置对已存在目标目录的覆盖行为。 参数:
source_dir(string,必填):源目录树路径copy_dest_dir(string,必填):目标输出目录路径overwrite(boolean,可选,默认值=false):清除并覆盖现有目标目录内容 成功响应负载:
{
"res": {
"success": true,
"info": {}
}
}
fs_move_directory
描述:将整个目录树原子地移动到新的目标路径。如果目标已存在,则立即失败;只有明确启用覆盖时才会覆盖,以避免意外数据丢失。 参数:
source_dir(string,必填):源目录路径dest_dir(string,必填):目标目录路径overwrite(boolean,可选,默认值=false):允许覆盖冲突的目标目录 成功响应负载:带有成功标志的空info对象封装。
2. 单文件基本操作工具
fs_create_file
描述:创建新的文本文件,自动生成缺失的父目录,并支持配置文本编码和初始文件内容。 参数:
file_path(string,必填):目标绝对文件路径content(string,可选,默认值=""):写入新文件的初始文本内容charset(string,可选,默认值="utf-8"):文本编码枚举值(完整字符集列表如下) 支持的字符集枚举值:utf-8、utf-16、latin-1、iso-8859-1、cp1252、Windows-1252、gbk、gb2312、shift_jis、euc_jp、euc_kr成功响应负载:带有成功标志的空info对象封装。
fs_delete_file
描述:仅永久删除单个常规文件;拒绝目录路径输入,以阻止大规模递归删除风险。 参数:
file_path(string,必填):目标常规文件的绝对路径 成功响应负载:带有成功标志的空info对象封装。
fs_copy_file
描述:复制单个文件并保留原始文件系统元数据,并可配置对冲突目标文件的覆盖行为。 参数:
source_file_path(string,必填):源文件绝对路径dest_file_path(string,必填):目标输出文件绝对路径overwrite(boolean,可选,默认值=false):覆盖已存在的目标文件 成功响应负载:带有成功标志的空info对象封装。
fs_move_file
描述:将单个文件原子性地移动到新的绝对路径,并可配置目标文件冲突时的覆盖行为。 参数:
source_file_path(string,必填):源文件绝对路径dest_file_path(string,必填):目标文件绝对路径overwrite(boolean,可选,默认=false):允许覆盖冲突的目标文件 成功响应负载:带有成功标志的空info对象包装器。
fs_get_file_info
描述:获取文件或目录的完整元数据,可选计算 SHA-256 加密摘要以验证完整性。 参数:
file_path(string,必填):目标文件系统条目的绝对路径calc_digest(boolean,可选,默认=false):计算文件内容的 SHA-256 哈希值 成功响应负载:
{
"res": {
"success": true,
"info": {
"absolute_path": "C:\\Users\\zhigu\\Documents\\My Games\\fsext-mcp-server\\pyproject.toml",
"is_readable": true,
"is_writable": true,
"size": 1672,
"is_regular_file": true,
"is_directory": false,
"is_symbolic_link": false,
"creation_millis": 1782288135574.7114,
"last_modified_millis": 1782279393020.1187,
"last_access_millis": 1782644004556.3462,
"sha256_digest": "59614cf5f8ecff38de37637f1d5b6f607d885bd277815786f5ce4bb2ee5b73a6"
}
}
}
fs_is_file_exists
描述:轻量检查任意文件系统条目(文件或目录)是否存在,无需加载完整元数据。 参数:
file_path(string,必填):要验证的目标绝对路径 成功响应负载:
{
"res": {
"success": true,
"info": {
"exists": true
}
}
}
3. 文件读写工具
fs_read_full_text
描述:使用用户指定的文本编码读取目标文件的完整文本内容。 参数:
file_path(string,必填):目标文本文件的绝对路径charset(string,可选,默认="utf-8"):文本编码枚举值 成功响应负载:
{
"res": {
"success": true,
"info": {
"content": "complete-text-file-content-here"
}
}
}
fs_read_text_range
描述:采用分段流式读取方式读取文本,针对大文件进行了优化;跳过开头的指定行数并限制读取的总行数,以避免内存过载。 参数:
file_path(string,必填):目标文本文件的绝对路径lines_to_skip(integer,必填,最小值=0):读取时要跳过的初始行数max_lines_to_read(integer,必填,最小值=0):从文件中提取的最大总行数line_separator(string,可选,默认="\n"):换行分隔符charset(string,可选,默认="utf-8"):文本编码枚举值 成功响应负载:
{
"res": {
"success": true,
"info": {
"lines_count": 5,
"content": "segmented-text-content-block"
}
}
}
fs_read_binary_chunk
描述:分块流式读取二进制文件;返回 Base64 编码的字节负载,以便通过网络 JSON-RPC 安全传输,并检测流结束标记。 参数:
file_path(string,必填):目标二进制文件的绝对路径bytes_to_skip(integer,必填,最小值=0):读取分块前要跳过的前导字节数max_bytes_to_read(integer,必填,最小值=0):单个分块要读取的最大字节数 成功响应负载:
{
"res": {
"success": true,
"info": {
"data_base64": "base64-encoded-binary-byte-data",
"raw_bytes_length": 5,
"end_of_stream": true
}
}
}
fs_write_text
描述:将 UTF 或多编码文本内容写入目标文件,支持完整覆盖或仅追加写入模式。 参数:
file_path(string,必填):目标输出文件的绝对路径text(string,必填,最小长度=1):要持久化的原始文本内容append(boolean,可选,默认=false):追加模式标志(false = 覆盖整个文件)charset(string,可选,默认="utf-8"):文本编码枚举值 成功响应负载:带有成功标志的空info对象包装器。
fs_write_binary
描述:解码 Base64 编码的二进制负载,并将原始字节写入目标文件,支持追加模式以分多块上传二进制数据。 参数:
file_path(string,必填):目标输出文件的绝对路径base64_data(string,必填,最小长度=1):Base64 编码的原始二进制字节负载append(boolean,可选,默认=false):将二进制数据追加到文件末尾(false = 覆盖) 成功响应负载:带有成功标志的空info对象包装器。
4. 内容搜索与原地替换工具
fs_search_files_by_content
描述:递归扫描目录树,并返回所有包含匹配目标文本模式的文件的绝对路径;支持正则表达式匹配、忽略大小写和按文件扩展名筛选。 参数:
dir_path(string,必需):递归内容扫描的根目录recursive(boolean,必需):启用完整的子目录递归扫描search_term(string,必需):纯文本关键字或正则表达式模式is_regex(boolean,可选,默认=false):为 true 时,将 search_term 视为正则表达式模式ignore_case(boolean,可选,默认=true):忽略大小写进行模式匹配file_extension(string,可选,默认=""):按扩展名后缀筛选扫描的文件charset(string,可选,默认="utf-8"):解析文件时使用的文本编码枚举值
fs_search_in_files_by_content
描述:批量匹配多个目录中的内容,返回结构化的匹配结果,并可配置匹配内容前后的上下文行数以及全局结果数量上限。 参数:
dir_path(string,必需):扫描根目录的绝对路径recursive(boolean,必需):启用对所有子目录的递归遍历search_term(string,必需):搜索关键字或正则表达式模式limit(integer,必需):返回的匹配条目总数上限is_regex(boolean,可选,默认=false):启用正则表达式匹配ignore_case(boolean,可选,默认=true):禁用区分大小写的匹配lines_before(integer,可选,默认=0):每个匹配行之前包含的上下文行数lines_after(integer,可选,默认=0):每个匹配行之后包含的上下文行数file_extension(string,可选,默认=""):按扩展名后缀筛选扫描的文件charset(string,可选,默认="utf-8"):解析文件时使用的文本编码枚举值 成功响应负载:
{
"res": {
"success": true,
"info": {
"results": [
{
"file_path": "/absolute/path/source.py",
"start_line": 1,
"end_line": 1,
"text": "full-matched-line-content-with-context"
}
]
}
}
}
fs_search_in_file_by_content
描述:精准搜索单个文件的内容,返回结构化的匹配片段,并可配置前后上下文行数,适用于代码和文档检查工作流。 参数:
file_path(string,必需):目标单个文件的绝对路径search_term(string,必需):搜索关键字或正则表达式模式is_regex(boolean,可选,默认=false):启用正则表达式匹配逻辑ignore_case(boolean,可选,默认=true):启用或禁用忽略大小写匹配lines_before(integer,可选,默认=0):每个匹配项之前包含的上下文行数lines_after(integer,可选,默认=0):每个匹配项之后包含的上下文行数charset(string,可选,默认="utf-8"):解析文件时使用的文本编码枚举值 成功响应负载:结构化的行匹配对象数组,格式与多文件搜索输出相同。
fs_file_replace
描述:在单个目标文件中执行全局原位文本替换;写入后返回匹配并替换的文本片段总数。 参数:
file_path(string,必需):目标可编辑文件的绝对路径search_term(string,必需):要查找并替换的文本子串replacement(string,必需):替换用的新文本内容line_separator(string,可选,默认="\n"):解析文件时使用的换行符分隔符 成功响应负载:
{
"res": {
"success": true,
"info": {
"count": 1
}
}
}
5. 图像处理工具
fs_image_resize
描述:将源图像调整为指定的宽度和高度,原生支持保持宽高比,以及通过画布填充达到精确的目标分辨率。 参数:
source_path(字符串,必填):源输入图像的绝对路径dest_path(字符串,必填):调整大小后的输出图像绝对路径width(整数,必填,exclusiveMinimum=0):目标像素宽度height(整数,必填,exclusiveMinimum=0):目标像素高度keep_aspect_ratio(布尔值,可选,默认=true):缩放时锁定原始图像宽高比pad_to_target(布尔值,可选,默认=true):锁定宽高比时,添加透明填充以达到精确的目标宽度和高度 成功响应载荷:带有成功标志的空info对象包装器。
fs_image_crop
描述:从源图像中提取矩形像素区域,并导出为独立的输出图像文件。 参数:
source_path(字符串,必填):源输入图像的绝对路径dest_path(字符串,必填):裁剪后输出图像的绝对路径x(整数,必填,minimum=0):裁剪区域原点的左侧像素坐标y(整数,必填,minimum=0):裁剪区域原点的顶部像素坐标width(整数,必填,exclusiveMinimum=0):裁剪矩形区域的像素宽度height(整数,必填,exclusiveMinimum=0):裁剪矩形区域的像素高度 成功响应载荷:带有成功标志的空info对象包装器。
fs_image_rotate
描述:按任意浮点角度值顺时针旋转源图像;自动扩展输出画布尺寸,完整保留图像内容,避免边缘被裁切。 参数:
source_path(字符串,必填):源输入图像的绝对路径dest_path(字符串,必填):旋转后输出图像的绝对路径degrees(数字,必填):顺时针旋转角度 成功响应载荷:带有成功标志的空info对象包装器。
6. OCR 文本提取工具
fs_ocr_extract_text
描述:通过本地 Tesseract OCR 二进制程序,从光栅图像文件中提取可读文本。不存在 WASM JavaScript 回退实现;空的 tesseract_bin_path 参数不会初始化其他基于 Web 的 OCR 引擎。
参数:
image_path(字符串,必填):用于文本识别的输入图像绝对路径tesseract_bin_path(字符串,可选,默认=""):本地 Tesseract 可执行二进制文件的绝对路径;值为空时仅通过系统 PATH 查找tessdata_path(字符串,可选,默认=""):包含 Tesseract 语言训练数据文件的目录绝对路径lang(字符串,可选,默认="eng"):与可用 tessdata 训练文件匹配的语言代码前缀 成功响应载荷:
{
"res": {
"success": true,
"info": {
"content": "full-ocr-extracted-text-from-input-image"
}
}
}
项目构建与开发脚本
面向源代码仓库贡献者的标准化 npm 等效 uv 开发脚本:
# Clean compiled build artifacts and temporary output directories
uv run -m scripts.clean
# Compile source code and type validation
uv run -m scripts.build
# Watch source files for incremental development rebuilds
uv run -m scripts.dev
# Full rebuild pipeline: clean artifacts + full source compilation
uv run -m scripts.rebuild
# Launch remote SSE transport server instance
uv run -m scripts.server
# FastMCP interactive development mode
uv run -m scripts.fastmcp
# MCP Inspector debug connection launcher
uv run -m scripts.inspect
# Execute full test suite with compiled test artifacts
uv run -m scripts.test
核心运行时依赖
- fastmcp:官方 Python MCP 服务运行时框架
- Pillow:用于调整大小、裁剪和旋转流程的跨平台图像处理后端
- tesseract:本地 Tesseract OCR 二进制程序的原生 Python 绑定
- chardet:多编码文本文件检测
- iconv-lite equivalent backends:跨平台文本编码转换工具
- cors:用于 HTTP/SSE 远程传输服务的 CORS 中间件
- minimist equivalent CLI parser:用于启动标志的命令行参数解析
- pydantic:用于所有 MCP 工具输入架构的严格类型验证
- uvicorn / starlette:用于远程传输部署的 ASGI HTTP 服务运行时
许可证
本项目基于 Apache License 2.0 开源。有关完整的法律许可条款和条件,请参阅项目根目录中的 LICENSE 文件。
第三方组件许可证
本项目集成了多个开源依赖库,包括 chardet、Pillow、python-magic 和 Tesseract 绑定。这些第三方库均保留各自原有的开源许可协议和版权声明。
重要说明:此发行版中不包含任何 FFmpeg 二进制文件。如果在外部启用了媒体处理扩展,最终用户必须另行遵守 FFmpeg 的官方许可条款。
代码仓库与问题跟踪
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。