返回市场
编辑器-mcp

编辑器-mcp

作者:danielpodrazka12 星标更新:2025-08-21

项目介绍

Editor MCP

基于Python的文本编辑器服务器,使用FastMCP构建,提供强大的文件操作工具。该服务器通过标准化API以独特的多步骤方法实现读取、编辑和管理文本文件,显著提高了LLMs和AI助手的代码编辑准确性和可靠性。

在MSeeP上验证

功能

  • 文件选择:使用绝对路径设置要处理的文件
  • 读取操作
    • 使用skim读取整个文件并带有行号
    • 使用read读取特定行范围并带有行号前缀
    • 使用find_line在文件中查找特定文本
    • 使用find_function在Python和JavaScript/JSX文件中查找并提取函数定义
  • 编辑操作
    • 两步编辑过程,带有差异预览
    • 使用ID验证选择并覆盖文本
    • 清晰的编辑工作流程,包括选择→覆盖→确认/取消模式
    • 对Python(.py)和JavaScript/React(.js, .jsx)文件进行语法检查
    • 创建带有内容的新文件
  • 文件管理
    • 创建带有适当初始化的新文件
    • 从文件系统删除文件
    • 使用listdir列出目录内容
  • 测试支持
    • 使用run_tests运行Python测试
    • 设置Python路径以正确解析模块
  • 安全特性
    • 内容ID验证以防止冲突
    • 行数限制以防止资源耗尽
    • 语法检查以维护代码完整性
    • 受保护路径以限制对敏感文件的访问

安全风险

编辑器-MCP包含一些强大的功能,这些功能伴随着一定的安全考虑:

  • 越狱风险:当读取嵌入了有害指令的文件时,编辑器-MCP可能会被越狱。正在编辑的文件中的恶意内容可能包含操纵AI助手的指令。
  • 任意代码执行:如果启用了运行测试的功能,通过操纵测试文件或恶意Python代码可能存在任意代码执行的风险。
  • 数据暴露:如果不正确地配置路径保护,访问文件系统操作可能会暴露敏感信息。

为了缓解这些风险:

  1. 使用PROTECTED_PATHS环境变量来限制对敏感文件和目录的访问。
  2. 在生产环境中禁用测试运行功能,除非绝对必要。
  3. 在打开文件之前仔细审查文件,特别是来自不可信来源的文件。
  4. 考虑在一个权限受限的沙箱环境中运行编辑器。

LLM的关键优势

此文本编辑器的独特设计解决了通常影响LLM代码编辑的关键问题:

  • 防止上下文丢失 - 传统方法经常导致LLM在几次编辑后失去对代码库的概览。这种实现通过多步骤过程维持上下文。
  • 避免资源密集型重写 - 当LLM感到困惑时,通常会默认替换整个文件,这既昂贵又缓慢且低效。此编辑器强制执行选择性编辑。
  • 提供视觉反馈 - 差异预览系统允许LLM实际看到并验证更改,从而大大减少错误。
  • 强制语法检查 - 自动验证Python和JavaScript/React确保不会提交损坏的代码。
  • 改进编辑推理 - 多步骤方法给予LLM时间在步骤之间进行推理,减少随意生成标记。

资源管理

编辑器实现了多项保障措施,以确保系统稳定并防止资源耗尽:

  • 最大编辑行数:默认情况下,编辑器对任何单个编辑操作实施50行限制

安装

此MCP是在Claude Desktop上开发和测试的。您可以在任何平台上下载Claude Desktop。 对于Linux上的Claude Desktop,您可以使用一个非官方安装脚本(使用官方文件),推荐仓库: https://github.com/emsi/claude-desktop/tree/main

一旦安装了Claude Desktop,请按照以下说明安装此特定MCP:

使用UVX的简易安装(推荐)

安装编辑器MCP最简单的方法是使用提供的安装脚本:

# 克隆仓库
git clone https://github.com/danielpodrazka/editor-mcp.git
cd editor-mcp

# 运行安装脚本
chmod +x install.sh
./install.sh

此脚本将:

  1. 检查是否已安装UVX,并在必要时安装它
  2. 将编辑器MCP安装到开发模式
  3. 使editor-mcp命令在您的PATH中可用

手动安装

使用UVX

# 直接从GitHub安装
uvx install git+https://github.com/danielpodrazka/mcp-text-editor.git

# 或从本地克隆安装
git clone https://github.com/danielpodrazka/mcp-text-editor.git
cd mcp-text-editor
uvx install -e .

使用传统的pip

pip install git+https://github.com/danielpodrazka/mcp-text-editor.git

# 或从本地克隆安装
git clone https://github.com/danielpodrazka/mcp-text-editor.git
cd mcp-text-editor
pip install -e .

使用Requirements(遗留)

从锁文件安装:

uv pip install -r uv.lock

生成锁定的需求文件:

uv pip compile requirements.in -o uv.lock

使用

启动服务器

安装完成后,可以使用以下任一方法启动编辑器MCP服务器:

# 使用安装的脚本
editor-mcp

# 或使用Python模块
python -m text_editor.server

MCP配置

您可以将编辑器MCP添加到您的MCP配置文件中:

{
  "mcpServers": {
     "text-editor": {
       "command": "editor-mcp",
       "env": {
         "MAX_SELECT_LINES": "100",
         "ENABLE_JS_SYNTAX_CHECK": "0",
         "FAIL_ON_PYTHON_SYNTAX_ERROR": "1",
         "FAIL_ON_JS_SYNTAX_ERROR": "0",
         "PROTECTED_PATHS": "*.env,.env*,config*.json,*secret*,/etc/passwd,/home/user/.ssh/id_rsa"
       }
     }
  }
}

环境变量配置

编辑器MCP支持多个环境变量以自定义其行为:

  • MAX_SELECT_LINES:"100" - 单次操作可编辑的最大行数(默认为50)
  • ENABLE_JS_SYNTAX_CHECK:"0" - 启用/禁用JavaScript和JSX语法检查(默认为"1" - 启用)
  • FAIL_ON_PYTHON_SYNTAX_ERROR:"1" - 启用时,Python语法错误将自动取消覆盖操作(默认启用)
  • FAIL_ON_JS_SYNTAX_ERROR:"0" - 启用时,JavaScript/JSX语法错误将自动取消覆盖操作(默认禁用)
  • PROTECTED_PATHS:无法访问的文件模式或路径的逗号分隔列表,支持通配符(例如,".env,.env,/etc/passwd")

从源码构建时的样本MCP配置

{
  "mcpServers": {
     "text-editor": {
       "command": "/home/daniel/pp/venvs/editor-mcp/bin/python",
       "args": ["/home/daniel/pp/editor-mcp/src/text_editor/server.py"],
        "env": {
          "MAX_SELECT_LINES": "1_00",
          "ENABLE_JS_SYNTAX_CHECK": "0",
          "FAIL_ON_PYTHON_SYNTAX_ERROR": "1",
          "FAIL_ON_JS_SYNTAX_ERROR": "0",
          "PROTECTED_PATHS": "*.env,.env*,config*.json,*secret*,/etc/passwd,/home/user/.ssh/id_rsa"
        }
     }
  }
}

可用工具

编辑器MCP提供了13种强大的工具,用于文件操作、编辑和测试:

1. set_file

设置当前要编辑的文件。

参数

  • filepath (str):文件的绝对路径

返回值

  • 包含文件路径的确认消息

2. skim

读取当前文件的全文。每行都带有行号前缀。

返回值

  • 包含行及其行号、总行数和最大编辑行数设置的字典

示例输出

{
  "lines": [
    [1, "def hello():"],
    [2, "    print(\"Hello, world!\")"],
    [3, ""],
    [4, "hello()"]
  ],
  "total_lines": 4,
  "max_select_lines": 50
}

3. read

从当前文件读取从起始行到结束行的文本。

参数

  • start (int):起始行号(基于1的索引)
  • end (int):结束行号(基于1的索引)

返回值

  • 包含行及其行号作为键以及起始和结束行信息的字典

示例输出

{
  "lines": [
    [1, "def hello():"],
    [2, "    print(\"Hello, world!\")"],
    [3, ""],
    [4, "hello()"]
  ],
  "start_line": 1,
  "end_line": 4
}

4. select

从当前文件中选择一段行,以便后续覆盖操作。

参数

  • start (int):起始行号(基于1的索引)
  • end (int):结束行号(基于1的索引)

返回值

  • 包含所选行、行范围和用于验证的ID的字典

注意

  • 此工具会根据max_select_lines验证选择
  • 选择详情会被存储,供覆盖工具使用
  • 必须在调用覆盖工具之前使用此工具

5. overwrite

准备用新文本覆盖当前文件中的选定范围。

参数

  • new_lines (list):要覆盖选定范围的新行列表

返回值

  • 显示提议更改的差异预览

注意

  • 这是两步过程的第一步:
    1. 首先调用overwrite()以生成差异预览
    2. 然后调用confirm()以应用或cancel()以丢弃待处理更改
  • 此工具允许用新内容替换先前选定的行
  • 新行的数量可以与原始选择不同
  • 对于Python文件(.py扩展名),在写入之前会进行语法检查
  • 对于JavaScript/React文件(.js, .jsx扩展名),语法检查是可选的,可以通过ENABLE_JS_SYNTAX_CHECK环境变量禁用

6. confirm

应用覆盖操作的待处理更改。

返回值

  • 包含状态和消息的操作结果

注意

  • 这是编辑过程第二步中的两个可能动作之一
  • 成功应用更改后,选择会被移除

7. cancel

丢弃覆盖操作的待处理更改。

返回值

  • 包含状态和消息的操作结果

注意

  • 这是编辑过程第二步中的两个可能动作之一
  • 当更改被取消时,选择保持不变

8. delete_file

删除当前设置的文件。

返回值

  • 包含状态和消息的操作结果

9. new_file

创建新文件,并自动将其设置为后续操作的当前文件。

参数

  • filepath (str):新文件的路径

返回值

  • 包含状态、消息和选择信息的操作结果
  • 第一行会自动被选中,以便立即编辑

行为

  • 如果不存在,会自动创建父目录
  • 将新创建的文件设置为当前工作文件
  • 第一行会预先选中,准备好立即编辑

受保护文件注意事项

  • 匹配某些模式(如*.env)的文件可以正常创建
  • 但是,一旦移动到另一个文件,这些受保护的文件就不能重新打开
  • 这允许对敏感配置文件采用“一次写入,之后保护”的工作流
  • 示例:您可以创建config.env,填充示例配置,但以后不能重新打开它

注意

  • 如果当前文件存在且不为空,此工具将失败

10. find_line

在当前文件中查找匹配提供的文本的行。

参数

  • search_text (str):要在文件中搜索的文本

返回值

  • 包含匹配行及其行号和总匹配数的字典

示例输出

{
  "status": "success",
  "matches": [
    [2, "    print(\"Hello, world!\")"]
  ],
  "total_matches": 1
}

注意

  • 如果未设置文件路径,将返回错误
  • 在每一行内搜索精确文本匹配
  • ID可用于后续编辑操作

11. find_function

在当前Python或JavaScript/JSX文件中查找函数或方法定义。

参数

  • function_name (str):要查找的函数或方法名称

返回值

  • 包含函数行及其行号、起始行和结束行的字典

示例输出

{
  "status": "success",
  "lines": [
    [10, "def hello():"],
    [11, "    print(\"Hello, world!\")"],
    [12, "    return True"]
  ],
  "start_line": 10,
  "end_line": 12
}

注意

  • 对于Python文件,此工具使用Python的AST和tokenize模块来准确识别包括装饰器和文档字符串在内的函数边界
  • 对于JavaScript/JSX文件,此工具结合使用以下方法:
    • 主要方法:当可用时使用Babel AST解析(需要Node.js和Babel包)
    • 备用方法:当Babel不可用时使用正则表达式模式匹配函数声明
  • 支持各种JavaScript函数类型,包括标准函数、异步函数、箭头函数和React钩子
  • 如果未设置文件路径或未找到函数,将返回错误

12. listdir

列出目录的内容。

参数

  • dirpath (str):要列出的目录路径

返回值

  • 包含文件名列表和查询路径的字典

13. run_testsset_python_path

用于使用pytest运行Python测试和配置Python环境的工具。

  • 设置为"0"、"false"或"no"以禁用JavaScript语法检查
  • 如果没有安装Babel及相关依赖项,这很有用
  • FAIL_ON_PYTHON_SYNTAX_ERROR:控制Python语法错误是否自动取消覆盖操作(默认:1)
    • 启用时,Python文件中的语法错误会导致覆盖操作自动取消
    • 行将保持选中状态,以便您可以修复错误并再次尝试
  • FAIL_ON_JS_SYNTAX_ERROR:控制JavaScript/JSX语法错误是否自动取消覆盖操作(默认:0)
    • 启用时,JavaScript/JSX文件中的语法错误会导致覆盖操作自动取消
    • 行将保持选中状态,以便您可以修复错误并再次尝试
  • DUCKDB_USAGE_STATS:控制是否在DuckDB数据库中收集使用统计信息(默认:0)
    • 设置为"1"、"true"或"yes"以启用收集工具使用统计信息
    • 启用时,记录每个工具调用的信息,包括时间戳和参数
  • STATS_DB_PATH:存储统计DuckDB数据库的路径(默认:"text_editor_stats.duckdb")
    • 仅在启用DUCKDB_USAGE_STATS时使用
  • PROTECTED_PATHS:无法访问的文件模式或绝对路径的逗号分隔列表
    • 示例:*.env,.env*,config*.json,*secret*,/etc/passwd,/home/user/credentials.txt
    • 支持精确文件路径和带有通配符的灵活glob模式:
      • *.env - 匹配以.env结尾的文件,如.envdev.envprod.env
      • .env* - 匹配以.env开头的文件,如.env.env.local.env.production
      • *secret* - 匹配名称中包含'secret'的任何文件
    • 提供保护,防止意外暴露敏感配置文件和凭证
    • 行将保持选中状态,以便您可以修复错误并再次尝试

开发

前提条件

编辑器-MCP需要:

  • Python 3.7+
  • FastMCP包
  • black(用于Python代码格式检查)
  • Babel(如果处理这些文件,则用于JavaScript/JSX语法检查)

安装开发依赖项:

# 使用pip
pip install pytest pytest-asyncio pytest-cov

# 使用uv
uv pip install pytest pytest-asyncio pytest-cov

对于JavaScript/JSX语法验证,您需要Node.js和Babel。文本编辑器使用npx babel来检查JS/JSX语法:

# JavaScript/JSX语法检查所需
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react
# 您也可以全局安装这些包,如果您愿意
# npm install -g @babel/core @babel/cli @babel/preset-env @babel/preset-react

编辑器需要:

  • @babel/core@babel/cli - 核心Babel包用于语法检查
  • @babel/preset-env - 用于标准JavaScript(.js)文件
  • @babel/preset-react - 用于React JSX(.jsx)文件

运行测试

# 运行测试
pytest -v

# 运行带覆盖率的测试
pytest -v --cov=text_editor

测试结构

测试套件涵盖: