MCP文件操作服务器:让AI帮你管理文件

什么是MCP?为什么要用它?

想象一下,你有一个非常聪明的AI助手(比如Claude),但它就像被关在一个透明的玻璃房子里------能看到外面的世界,却无法直接操作你电脑上的文件。这就是传统AI的限制。

Model Context Protocol (MCP) 就像是给AI助手开了一扇门,让它能够安全地帮你处理各种文件操作。简单来说:

  • 没有MCP时:你只能跟AI聊天,需要文件操作时还得自己动手
  • 有了MCP后:AI可以直接帮你压缩图片、整理文件、处理PDF等等

MCP的核心优势:

  • 安全可控:AI只能做你允许的操作
  • 标准统一:不同的工具都遵循同一套规则
  • 功能强大:可以扩展AI的能力边界
  • 高效便捷:一句话搞定复杂的文件操作

这个MCP服务器能做什么?file-operation-mcp源码

这个文件操作MCP服务器就像是给AI配备了一个万能的文件管理工具箱,包含10大核心功能:

基础文件管理

  1. 文件统计 - 快速统计文件夹里有多少个文件
  2. 文件列表 - 查看文件夹里的所有文件详情

图片处理

  1. 图片压缩 - 减小图片文件大小,支持JPEG、PNG等格式

文件压缩解压

  1. 文件压缩 - 打包文件为ZIP、TAR等格式
  2. 文件解压 - 解压各种压缩包

文件操作

  1. 文件复制 - 复制文件到指定位置
  2. 文件移动 - 移动文件到新位置

PDF处理

  1. PDF合并 - 把多个PDF合成一个
  2. PDF拆分 - 把一个PDF分成多个
  3. PDF转图片 - 把PDF页面转换成图片

技术实现原理

核心技术栈解析

1. Sharp - 图片处理的瑞士军刀

typescript 复制代码
// Sharp是如何工作的?
const image = sharp(imagePath);  // 读取图片
const compressed = image
  .resize(1920, 1080)           // 调整尺寸
  .jpeg({ quality: 80 })        // 设置压缩质量
  .toFile(outputPath);          // 保存文件

2. PDF-lib - PDF操作专家

typescript 复制代码
// 合并PDF的原理
const mergedPdf = await PDFDocument.create();  // 创建新PDF
const pdf1 = await PDFDocument.load(file1);    // 加载第一个PDF
const pdf2 = await PDFDocument.load(file2);    // 加载第二个PDF

// 复制页面到新PDF
const pages1 = await mergedPdf.copyPages(pdf1, pdf1.getPageIndices());
const pages2 = await mergedPdf.copyPages(pdf2, pdf2.getPageIndices());

// 添加所有页面
pages1.forEach(page => mergedPdf.addPage(page));
pages2.forEach(page => mergedPdf.addPage(page));

两种连接方式

Stdio方式 - 直接对话模式

typescript 复制代码
// 就像面对面交流
const transport = new StdioServerTransport();
await server.connect(transport);

特点

  • ✅ 速度极快(1-5毫秒响应)
  • ✅ 资源占用少
  • ❌ 只能本地使用
  • ❌ 不支持多用户

适用场景:个人电脑上的日常文件操作

SSE方式 - 网络服务模式

typescript 复制代码
// 就像通过网络视频通话
const app = express();
app.get('/sse', async (req, res) => {
  const transport = new SSEServerTransport('/messages', res);
  await server.connect(transport);
});

特点

  • ✅ 支持远程访问
  • ✅ 支持多用户
  • ✅ 便于调试和监控
  • ❌ 延迟稍高(10-50毫秒)
  • ❌ 需要额外配置

适用场景:团队协作或需要远程访问的情况

核心功能实现原理

1. 图片压缩功能

图片压缩就像是给照片"减肥",保持美观的同时减小文件大小:

typescript 复制代码
// 完整的压缩流程
async function compressImage(imagePath: string, options: CompressOptions) {
  // 第1步:检查文件是否存在
  if (!await fs.pathExists(imagePath)) {
    throw new Error('文件不存在');
  }

  // 第2步:验证是否为支持的图片格式
  const validFormats = ['.jpg', '.jpeg', '.png', '.webp'];
  const extension = path.extname(imagePath).toLowerCase();
  if (!validFormats.includes(extension)) {
    throw new Error('不支持的图片格式');
  }

  // 第3步:使用Sharp处理图片
  let processor = sharp(imagePath);

  // 第4步:调整尺寸(如果指定了最大宽高)
  if (options.maxWidth || options.maxHeight) {
    processor = processor.resize(options.maxWidth, options.maxHeight, {
      fit: 'inside',           // 保持比例
      withoutEnlargement: true // 不放大图片
    });
  }

  // 第5步:根据格式应用压缩
  switch (extension) {
    case '.jpg':
    case '.jpeg':
      processor = processor.jpeg({ quality: options.quality });
      break;
    case '.png':
      // PNG使用压缩级别而不是质量
      const level = Math.round((100 - options.quality) / 10);
      processor = processor.png({ compressionLevel: level });
      break;
  }

  // 第6步:保存压缩后的文件
  await processor.toFile(outputPath);
  
  // 第7步:返回压缩统计信息
  const originalSize = (await fs.stat(imagePath)).size;
  const compressedSize = (await fs.stat(outputPath)).size;
  const savedPercentage = ((originalSize - compressedSize) / originalSize * 100).toFixed(1);
  
  return `压缩完成!原大小: ${Math.round(originalSize/1024)}KB,压缩后: ${Math.round(compressedSize/1024)}KB,节省了${savedPercentage}%`;
}

2. PDF处理功能实现

PDF合并原理

typescript 复制代码
// PDF合并就像把多本书装订成一本
async function mergePDFs(inputPaths: string[], outputPath: string) {
  // 创建一个新的空白PDF文档
  const mergedPdf = await PDFDocument.create();
  
  // 逐个处理每个输入PDF
  for (const inputPath of inputPaths) {
    // 读取PDF文件内容
    const pdfBytes = await fs.readFile(inputPath);
    
    // 解析PDF文档
    const pdf = await PDFDocument.load(pdfBytes);
    
    // 获取所有页面
    const pageIndices = pdf.getPageIndices(); // [0, 1, 2, ...]
    
    // 复制页面到新PDF
    const copiedPages = await mergedPdf.copyPages(pdf, pageIndices);
    
    // 将复制的页面添加到合并PDF中
    copiedPages.forEach((page) => mergedPdf.addPage(page));
  }
  
  // 保存合并后的PDF
  const finalPdfBytes = await mergedPdf.save();
  await fs.writeFile(outputPath, finalPdfBytes);
}

PDF拆分原理

typescript 复制代码
// PDF拆分就像把一本书撕成单页
async function splitPDF(inputPath: string, outputDir: string) {
  // 读取原始PDF
  const pdfBytes = await fs.readFile(inputPath);
  const pdf = await PDFDocument.load(pdfBytes);
  
  const totalPages = pdf.getPageCount();
  
  // 为每一页创建一个新PDF
  for (let i = 0; i < totalPages; i++) {
    // 创建新的PDF文档
    const newPdf = await PDFDocument.create();
    
    // 复制指定页面
    const [copiedPage] = await newPdf.copyPages(pdf, [i]);
    
    // 添加页面到新PDF
    newPdf.addPage(copiedPage);
    
    // 保存单页PDF
    const newPdfBytes = await newPdf.save();
    const outputPath = path.join(outputDir, `page_${i + 1}.pdf`);
    await fs.writeFile(outputPath, newPdfBytes);
  }
}

3. 文件压缩解压实现

ZIP压缩原理

typescript 复制代码
// 压缩就像把东西装进行李箱
async function createZip(files: string[], outputPath: string) {
  // 创建压缩器
  const archive = archiver('zip', { zlib: { level: 9 } });
  
  // 创建输出流
  const output = fs.createWriteStream(outputPath);
  
  // 连接压缩器和输出流
  archive.pipe(output);
  
  // 添加文件到压缩包
  for (const filePath of files) {
    const stats = await fs.stat(filePath);
    
    if (stats.isDirectory()) {
      // 如果是文件夹,递归添加所有内容
      archive.directory(filePath, path.basename(filePath));
    } else {
      // 如果是文件,直接添加
      archive.file(filePath, { name: path.basename(filePath) });
    }
  }
  
  // 完成压缩
  await archive.finalize();
}

4. 参数验证机制

使用Zod进行参数验证,就像是在门口检查身份证:

typescript 复制代码
// 定义参数规则
const compressImageSchema = {
  imagePath: z.string().describe('图片文件路径'),
  quality: z.number()
    .min(1, '质量不能小于1')
    .max(100, '质量不能大于100')
    .optional()
    .describe('压缩质量 (1-100)'),
  maxWidth: z.number()
    .positive('宽度必须为正数')
    .optional()
    .describe('最大宽度'),
  maxHeight: z.number()
    .positive('高度必须为正数')
    .optional()
    .describe('最大高度')
};

// 在工具执行前自动验证
server.registerTool('compress-image', {
  inputSchema: compressImageSchema
}, async (params) => {
  // 这里的params已经通过验证,类型安全
  // 可以放心使用
});

5. 错误处理策略

采用多层防护,就像给程序穿上多层防护服:

typescript 复制代码
async function safeOperation(operation: () => Promise<any>) {
  try {
    // 第1层:参数验证(Zod自动处理)
    // 第2层:前置条件检查
    if (!await fs.pathExists(inputPath)) {
      throw new Error('文件不存在');
    }
    
    // 第3层:权限检查
    await fs.access(inputPath, fs.constants.R_OK);
    
    // 第4层:业务逻辑执行
    const result = await operation();
    
    // 第5层:结果验证
    if (!result) {
      throw new Error('操作未产生预期结果');
    }
    
    return {
      content: [{ type: 'text', text: `操作成功:${result}` }]
    };
    
  } catch (error) {
    // 统一错误处理
    return {
      content: [{ 
        type: 'text', 
        text: `操作失败:${error instanceof Error ? error.message : '未知错误'}` 
      }],
      isError: true
    };
  }
}

安装和配置指南

环境准备

bash 复制代码
# 1. 确保Node.js版本 >= 18
node --version

# 2. 克隆项目
git clone https://github.com/lxKylin/file-operation-mcp.git
cd file-operation-mcp

# 3. 安装依赖
pnpm install

# 4. 构建项目
pnpm build

Claude Desktop配置

找到配置文件:

  • macOS : ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows : %APPDATA%/Claude/claude_desktop_config.json

添加配置:

json 复制代码
{
  "mcpServers": {
    "file-operation-mcp": {
      "command": "node",
      "args": ["/完整路径/file-operation-mcp/dist/index.js"],
      "cwd": "/完整路径/file-operation-mcp"
    }
  }
}

重要提醒 :一定要把 /完整路径/ 替换成你实际的项目路径!

Cursor 配置SSE

json 复制代码
{
  "mcpServers": {
    "file-operation-mcp": {
      "type": "sse",
      "url": "http://localhost:3000/sse"
    }
  }
}

实际使用示例

日常文件管理

erlang 复制代码
用户:帮我看看桌面上有什么文件
AI:好的,我来帮你查看桌面文件...
[调用 list-files 工具]
结果:桌面上有15个文件,包括3个PDF、5张图片、2个文档...

用户:把那些图片都压缩一下
AI:我来帮你压缩图片...
[调用 compress-image 工具处理每张图片]
结果:已成功压缩5张图片,总共节省了2.3MB空间

文档整理场景

erlang 复制代码
用户:把项目文档文件夹里的所有PDF合并成一个
AI:我来帮你合并PDF文档...
[调用 merge-pdf 工具]
结果:已将12个PDF文件合并为"项目完整文档.pdf",共186页

用户:再把这个大PDF按章节拆分
AI:我来按页面范围拆分PDF...
[调用 split-pdf 工具,按ranges模式]
结果:已拆分为6个章节文件,每个章节包含20-40页

拆分前:

拆分后:

批量文件处理

css 复制代码
用户:把下载文件夹里的所有图片压缩到50%质量,然后打包
AI:我来执行批量处理...
[先调用 list-files 找到所有图片]
[然后调用 compress-image 压缩每张图片]
[最后调用 create-archive 打包所有压缩图片]
结果:已处理23张图片,压缩后总大小减少65%,打包为compressed_images.zip

使用场景和最佳实践

个人用户场景

  • 桌面整理:快速统计和分类桌面文件
  • 照片管理:批量压缩旅游照片节省空间
  • 文档处理:合并扫描的PDF文档
  • 备份压缩:定期打包重要文件

扩展和定制

添加新功能

typescript 复制代码
// 1. 创建新工具文件
// src/tools/my-new-tool.ts

import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';

const registerTool = (server: McpServer) => {
  server.registerTool(
    'my-new-tool',
    {
      title: '我的新工具',
      description: '工具描述',
      inputSchema: {
        // 参数定义
      }
    },
    async (params) => {
      // 工具逻辑
    }
  );
};

export default registerTool;

// 2. 在index.ts中注册
import myNewTool from './my-new-tool';
// 添加到工具列表中

自定义配置

typescript 复制代码
// 环境变量配置
const config = {
  maxFileSize: process.env.MAX_FILE_SIZE || '100MB',
  defaultQuality: parseInt(process.env.DEFAULT_QUALITY || '80'),
  tempDir: process.env.TEMP_DIR || os.tmpdir()
};

总结

这个MCP文件操作服务器就像是给AI助手装上了一双巧手,让它能够帮你处理各种文件操作任务。从简单的文件统计到复杂的PDF处理,从图片压缩到文档合并,一句话就能搞定。

核心价值

  • 效率提升:复杂的文件操作变成简单对话
  • 安全可靠:完善的错误处理和权限控制
  • 功能全面:覆盖日常文件操作的方方面面
  • 易于扩展:模块化设计,可以轻松添加新功能

通过这个MCP服务器,你的AI助手不再只是一个聊天机器人,而是一个真正能帮你干活的数字助理。文件管理从此变得简单而高效!

file-operation-mcp源码

相关推荐
GIS数据转换器10 分钟前
AI 技术在智慧城市建设中的融合应用
大数据·人工智能·机器学习·计算机视觉·系统架构·智慧城市
竹子_2316 分钟前
《零基础入门AI:传统机器学习进阶(从拟合概念到K-Means算法)》
人工智能·算法·机器学习
上海云盾-高防顾问16 分钟前
DDoS 防护的未来趋势:AI 如何重塑安全行业?
人工智能·安全·ddos
Godspeed Zhao26 分钟前
自动驾驶中的传感器技术17——Camera(8)
人工智能·机器学习·自动驾驶·camera·cis
摆烂工程师1 小时前
GPT-5 即将凌晨1点进行发布,免费用户可以使用 GPT-5
前端·人工智能·程序员
今天也不想动1 小时前
文献解读-生境分析亚区域选择+2D_DL+3D_DL-局部晚期食管鳞状细胞癌新辅助化疗免疫治疗反应预测
人工智能·影像组学·生境分析
shao9185162 小时前
Gradio全解10——Streaming:流式传输的多模态应用(3)——HF Inference:在服务器运行推理
人工智能·推理·hf inference·inferenceclient·text_to_image·chat_completion
FIT2CLOUD飞致云2 小时前
高级编排应用新增会话变量,支持对话用户扫码登录,支持工作空间资源统一管理,MaxKB v2.0.2版本发布
人工智能·开源
FIT2CLOUD飞致云2 小时前
DataEase官方出品丨SQLBot:基于大模型和RAG的智能问数系统
数据分析·开源·数据可视化
NewCarRen3 小时前
自动驾驶系统的网络安全风险分析
人工智能·web安全·自动驾驶