Python代码重构服务器

一个基于Rope库的Python代码重构服务器,为AI代理提供项目范围内的安全代码重构操作。

  • by krystofbe
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 krystofbe/rope-mcp-server

使用说明

rope mcp服务器

一个模型上下文协议(MCP)服务器,提供Python重构功能,由 绳索 图书馆。使像Claude这样的AI代理能够执行安全的、项目范围内的重构操作。

特性

  • 移动符号 -通过自动导入更新在文件之间移动类和函数
  • 移动模块 -将整个模块或包移动到不同的文件夹
  • 移动和重命名模块 -将模块移动到文件夹并重命名(例如。, foo_extra.py → foo/extra.py)
  • 将模块转换为Init -转换 foo.py 进入 foo/__init__.py (没有导入更改!)
  • 将模块转换为包 -转换 foo.py 进入 foo/foo.py 带有导入更新
  • 重命名符号 -重命名整个项目中的变量、函数、类
  • 提取方法 -将代码块提取到新方法中
  • 内联变量 -所有使用站点的内联变量
  • 列出符号 -发现Python文件中的顶级符号

所有操作都是项目感知的,并自动更新整个代码库中的导入和引用。

安装

Claude Code快速入门(推荐)

# Global installation (all projects)
claude mcp add rope-refactor uvx rope-mcp-server -s user

# Or for current project only
claude mcp add rope-refactor uvx rope-mcp-server -s local

来自PyPI

pip install rope-mcp-server

使用Claude代码

claude mcp add rope-refactor uvx rope-mcp-server -s user
claude mcp list  # verify

就这样

可用工具

list_symbols

列出Python文件中的所有顶级符号(类、函数、变量)。

project_path: /path/to/your/project
file_path: src/models.py

move_symbol

将类或函数移动到另一个文件。自动更新所有导入。

project_path: /path/to/your/project
source_file: src/models.py
symbol_name: UserModel
dest_file: src/users/models.py

move_module

将模块或包移动到另一个文件夹。自动更新所有导入。

project_path: /path/to/your/project
module_path: src/utils.py
dest_folder: src/lib

convert_module_to_init (推荐)

通过将模块文件移动到以下位置将其转换为包 __init__.py。无需导入更改!

这就是 推荐 将模块转换为包的方法。转换后,您可以使用 move_module 移动相关文件(如 foo_mixins.py)进入新的包装。

project_path: /path/to/your/project
module_path: app/views/customer_order.py

之前:

app/views/customer_order.py
app/views/customer_order_mixins.py

运行后 convert_module_to_init:

app/views/customer_order/__init__.py  (was customer_order.py)
app/views/customer_order_mixins.py    (move this next with move_module)

导入 from app.views.customer_order import X 停留 未改变的!

move_and_rename_module

将模块移动到文件夹并可选择重命名。非常适合移动相关文件(如 _mixins.py, _extra.py)放入用创建的包中 convert_module_to_init.

自动检测: 如果模块名称以目标文件夹名称+下划线开头,则会自动删除该前缀。

绳索虫解决方法: 此工具包括一个解决Rope错误的方法,当文件同时从目标包和正在移动的模块导入时,该错误会崩溃。此类文件在移动过程中会暂时隐藏,然后手动修复其导入。

project_path: /path/to/your/project
module_path: app/views/customer_order_mixins.py
dest_folder: app/views/customer_order
new_name: mixins  # Optional - auto-detected from prefix

之前:

app/views/customer_order/__init__.py
app/views/customer_order_mixins.py

导入: from app.views.customer_order_mixins import MyMixin

之后:

app/views/customer_order/__init__.py
app/views/customer_order/mixins.py

导入: from app.views.customer_order.mixins import MyMixin

convert_module_to_package

将模块文件转换为同名包。变换 foo.py 进入 foo/foo.py 同时更新项目范围内的所有导入。

当您希望将原始模块内容放在子模块中,而不是放在 __init__.py.

project_path: /path/to/your/project
module_path: app/views/service_contractor.py

之前:

app/views/service_contractor.py

导入: from app.views.service_contractor import MyClass

之后:

app/views/service_contractor/
├── __init__.py
└── service_contractor.py

导入: from app.views.service_contractor.service_contractor import MyClass

rename_symbol

在整个项目中重命名符号。

project_path: /path/to/your/project
file_path: src/utils.py
symbol_name: old_function_name
new_name: new_function_name

extract_method

将代码区域提取到新方法中。

project_path: /path/to/your/project
file_path: src/service.py
start_line: 15
start_col: 4
end_line: 20
end_col: 30
new_name: extracted_helper

inline_variable

在所有使用站点内联一个变量。

project_path: /path/to/your/project
file_path: src/handler.py
variable_name: temp_result
line: 42

close_rope_project

关闭Rope项目以释放内存。重构完成后致电。

project_path: /path/to/your/project

发展

# Install dependencies
uv sync

# Run tests
uv run pytest tests/ -v

# Run server locally
uv run python -m rope_mcp_server.server

运作原理

此服务器包装 绳索 重构库并通过 模型上下文协议当Claude(或任何与MCP兼容的代理)需要重构Python代码时,它可以使用这些工具执行安全、AST感知的转换,以保持代码的正确性。

关键实施细节:

  • 项目缓存 -Rope项目被缓存以避免在每次操作时重新解析
  • 基于AST的偏移计算 -符号位置是通过Python的AST模块计算的,以确保准确性
  • 自动进口处理 -移动/重命名符号时,绳索会处理所有导入更新

局限性

  • 仅支持Python代码(绳索限制)
  • 在类之间移动方法需要目标类存在
  • 大型项目的初始索引可能较慢
  • 绳索虫解决方法:从目标包和要移动的模块导入的文件会被特殊处理(在移动过程中隐藏,然后手动导入修复)-请参阅 move_and_rename_module

许可证

麻省理工学院

贡献

欢迎投稿!请先打开一个问题,讨论您想更改什么。