上周五下午,我盯着屏幕上一个跑了快两年的老项目,后端代码已经堆了3万多行,各种monkey patch和临时逻辑像蜘蛛网一样缠在一起。我决定——用AI Agent来一次彻底的代码重构。之前试过Cursor和Copilot,但这次我选了Claude Code,配合MCP协议OpenCode做辅助。3天下来,代码从3.2万行压缩到1.8万行,bug率降了40%,但中间踩的坑差点让我想砸键盘。

一、为什么选Claude Code而不是Cursor?

很多人问我这个问题。坦白说,Cursor在IDE集成上确实强,但它的Agent模式在处理超长上下文(比如重构一个5000行的service文件)时,经常忘记前面的指令。而Claude Code的上下文窗口是100K tokens起步,配合MCP的上下文压缩,能扛住大型重构。

我的具体配置:Claude Code + MCP Server(本地部署)+ OpenCode作为补充Agent。项目是一个Python后端,用FastAPI写的,数据库是PostgreSQL。

二、实操步骤:我是怎么做的

第一天:用MCP给Claude Code“喂”项目结构

直接让Claude Code读整个项目?它会卡死在token限制里。我的做法是:先写一个MCP Server,把项目文件树、依赖关系、数据库schema都压缩成结构化数据,然后通过MCP协议喂给Claude。

# 一个简单的MCP Server示例(Python)
from mcp import MCPServer, Tool, Resource

server = MCPServer("my-project")

@server.resource("project://structure")
def get_structure():
    return {
        "services": ["auth", "payment", "user", "notification"],
        "deps": {"auth": ["user"], "payment": ["user", "notification"]},
        "db_tables": ["users", "orders", "transactions"],
        "code_lines": 32000
    }

server.run()

然后我让Claude Code通过MCP读取这个结构,再一步步拆解任务。它先识别出耦合最严重的模块——支付模块和用户模块互相依赖,导致每次改支付都要改用户。

第一次坑:MCP Server的返回格式太复杂,Claude Code解析了5分钟还没开始干活。后来我把JSON结构拍平,用简单的key-value对,速度立刻快了3倍。

第二天:用OpenCode做“脏活”——批量重构

Claude Code擅长决策,但真正改代码时,它一次只能改一个文件。对于300多个文件的重构,我引入了OpenCode。这是一个开源的Agent框架,可以批量执行任务。

我的流程是:Claude Code制定重构策略(比如“把支付模块的数据库查询全部移到repository层”),然后OpenCode自动遍历所有相关文件,生成diff patch,我review后合并。

# OpenCode批量重构指令示例
agent run --task "move all db queries from payment_service.py to payment_repository.py" \
          --include "payment/*.py" \
          --exclude "test_*" \
          --model claude-3-opus

结果它一口气改了47个文件,但……

第二次坑:OpenCode在改文件时,把一些import语句删错了。因为payment_service.py里有一个函数直接用了db.session.query,但OpenCode没注意到这个函数也被其他模块调用了。我花了2小时修复这些“误伤”。教训:批量操作前,一定要让Agent先生成依赖图,标记哪些函数是公共接口。

三、第三天:用Hermes Agent做测试和验证

重构完代码,最大的恐惧是“改坏了但没发现”。我用了Hermes Agent来自动生成测试用例并运行。这个Agent能根据代码变化自动补全单元测试,覆盖率从62%提升到89%。

具体做法是:把重构前后的代码diff喂给Hermes,它会分析哪些逻辑变了,然后生成对应的pytest用例。我还让它跑了一遍集成测试,发现了一个隐藏bug——订单状态机的状态迁移少了一个分支。

第三次坑:Hermes Agent生成的测试用例太“乐观”了。它只测试了正常路径,没覆盖异常场景。比如支付超时、数据库连接断开等。我后来手动加了20个异常测试,才敢上线。

四、我遇到的坑(完整版)

除了上面提到的,还有几个值得说的:

  • MCP的上下文压缩太激进:Headroom Labs的Headroom项目(GitHub上5.5万星的那个)我试过,它把RAG chunks和日志压缩后再喂给LLM,但压缩率设到60%时,一些关键错误信息被丢了。建议压缩率控制在30%以内。
  • Claude Code的“幻觉”问题:它有一次建议我把一个API路由改成WebSocket,理由是“性能更好”。但实际场景下,那个接口一天只调用200次,完全没必要。一定要结合业务数据判断,别盲信Agent的建议。
  • 多Agent协作的冲突:Claude Code和OpenCode同时修改同一个文件时,产生了冲突。我后来给它们分配了不同的工作目录:Claude Code只生成计划,OpenCode只执行计划,Hermes只做验证。

五、数据对比:重构前后

指标重构前重构后变化
代码行数32,00018,000-43%
模块耦合度(扇出数)8.23.1-62%
单元测试覆盖率62%89%+27%
单次API响应时间(p95)320ms210ms-34%
上线后3天bug数72-71%

六、工具选择建议

如果你也想尝试类似的工作流,我的建议是:

  • 小项目(<5000行):直接用Cursor的Agent模式就够了,别折腾MCP。
  • 中型项目(5000-20000行):用Claude Code + MCP,但一定要手动控制上下文,别让它自己“放飞”。
  • 大型项目(>20000行):强烈建议用OpenCodebytedance/deer-flow(GitHub上7.5万星的那个)做任务分解。Deer Flow的长时序任务规划能力很强,能自动把重构拆成100多个小步骤。

另外,不要把所有Agent都放在同一个目录下工作。给每个Agent独立的workspace,最后用git merge。我因为没注意这个,吃了大亏。

七、结论:AI Agent重构靠谱吗?

靠谱,但有条件。我的经验是:AI Agent适合做“机械性重构”——比如统一代码风格、提取公共函数、迁移数据库查询方式。但不适合做“架构级决策”——比如要不要从微服务切回单体,或者要不要换数据库。

最后分享一个数字:我用Claude Code + MCP + OpenCode这套组合,3天完成了原来估计要2周的工作。但代价是,我花了整整1天来修复Agent留下的坑。所以实际效率提升大约是3倍,不是10倍。

一句话总结:AI Agent是很好的“高级实习生”,能干活,但需要你盯着。别让它一个人待着,否则它会把你的项目变成“屎山2.0”。

如果你也在用类似的工具,欢迎留言分享你的踩坑经历。下次我准备试试Deer Flow + Hermes Agent的组合,看看能不能把多Agent协作的冲突降到零。

(完)