P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

前言

上个月,我们干了一件特别"勇"的事——把一套180K行的Spring Boot单体代码库,整个儿塞给了Claude Code,让它做一次全量架构分析。

180K行啊,什么概念?相当于把《红楼梦》前八十回翻译成Java,还加了不少注释,连贾宝玉的getter和setter都写得规规矩矩。

Claude倒也没客气,哐哐哐输出了一份依赖关系图,比我们技术Lead画得还细,连三处我们自己都没发现的循环依赖都揪出来了。

当时办公室里一片"卧槽",有人甚至开始担心自己的年终奖是不是要分给AI一半,还有人默默把简历上的"精通架构"改成了"略懂"。

但高兴不到三秒。接下来六周,我们在这个坑里摔得鼻青脸肿,其中最阴险的一个坑,我到现在想起来还想掀桌——就是那种你明明看着路,结果一脚踩进井盖里的感觉。

喂代码就像喂大象吃花生,看着多,塞牙缝都不够

先说我们为啥不搞"喂文件"那一套了。大多数工程师用Claude Code的方式是:遇到问题,让它读几个文件,回答完事。这在小项目里够用,就像你在路边摊吃碗面,老板问你要不要加蛋,你说加,完事。

但我们的代码库是47个开发维护了4年的Spring Boot单体,180K行,模块间依赖错综复杂,一个业务改动往往牵扯5到8个service。这已经不是路边摊了,这是满汉全席,你问"这道菜咸不咸",厨师得把厨房所有调料柜翻一遍。

Claude的上下文窗口标称200K tokens,听着挺唬人的,对吧?就像有人说"我存款有两百万"——听着多,但在一线城市买套房,首付都不够,还得倒贴。

你问它一个OrderService,它是递归着读的。OrderService要读PaymentService,PaymentService要读InventoryService,InventoryService又回头看UserService……这感觉就像你去火锅店点了一份毛肚,结果服务员把整头牛都牵过来了,还问你:“牛蹄筋要不要也涮上?牛百叶呢?牛黄喉来一盘?”

一轮递归下来,上下文满了一半。更惨的是,60个文件里真正有用的可能就5个,剩下55个全是噪音——相当于让Claude把整个代码库背下来再回答你,跟让程序员入职第一天背完公司全部Wiki有什么区别?区别就是Claude不会辞职,但会胡说八道。

所以我们一拍大腿:得给Claude装个搜索引擎,不能让它当复读机,更不能让它当背书机器。

MCP Server:给Claude配了把狙击枪,结果它说"我没看见瞄准镜"

MCP Server的思路特别朴素:不是给Claude代码,是给Claude查代码的能力。就像你带新同事,不给他印一本代码大全塞怀里,而是告诉他:“IDE里按Ctrl+F能搜,按Ctrl+B能跳转,别傻乎乎地背。”

我们兴冲冲搭了第一版,一口气暴露了60个工具。按模块分的依赖查询、按服务维度的接口列表、历史PR摘要、配置项检索……应有尽有,感觉自己就是Claude的基建狂魔,恨不得给它建个机场。

结果跑了两周,Claude的表现跟抽风似的。有时候问OrderService的依赖,它能答得比架构师还准,连三年前的技术债都能翻出来;有时候问同样的问题,它回你一句:“我没有查询依赖关系的工具。”

我当场就懵了。这感觉就像你给家里装了60个智能开关,某天晚上想开灯,小爱同学说:"抱歉,我不认识这个灯。"你问它客厅灯呢?它说:“客厅是什么?”

翻遍了Claude Code的GitHub issue,真相让我想骂人——MCP Server工具数量过多时,服务器可能在启动时静默失败。没有报错,没有警告,就是工具消失了。像员工请假不报备,像对象删了微信不通知,像代码commit了没push——你根本不知道它已经"瞎了",还在那儿一本正经地胡说八道。

冷知识: 社区反馈里,10个工具的Server几乎从不翻车,50个工具的Server偶尔抽风,169个工具的Server是高频故障户。工具越多,Claude越像期末考试前背了十本书的学生——直接宕机,脑子里只剩"我是谁我在哪"。

工具描述比丈母娘查户口还啰嗦,吃掉41%的上下文

更离谱的是,我测了一下,开启所有MCP Server的情况下,工具描述 alone 就消耗了整个上下文窗口的41%,约82000 tokens。对话还没开始,四成弹药已经没了。

这就像你约女神吃饭,还没点菜,服务员先上来收了四成服务费,还说"这是座位费"。你看着菜单,心里盘算着剩下的钱够不够点个拍黄瓜。

而且研究数据显示,LLM在工具数量超过10-20个时会出现"认知过载",开始混淆工具或者选错工具。想象一下你桌面开了60个Chrome标签页,找那个要用的,得翻半天,翻着翻着就忘了自己本来要干嘛——这不就是我自己吗?

我们用了两招止血,效果堪比给洪水猛兽打镇定剂。

第一招:60个工具合并成12个,从"工具箱"变成"瑞士军刀"

以前4个独立工具,长得跟四胞胎似的:

search_order_service_deps()
search_payment_service_deps()
search_inventory_service_deps()
search_user_service_deps()

现在1个工具,service_name参数区分,干净利落:

search_service_dependencies(service_name: string)

5种Firecrawl模式也合并成1个工具+mode参数。工具数量从60降到12,context消耗从40000+ tokens压到约8000 tokens,少了80%。Claude终于从"选择困难症"变成了"果断哥"。

第二招:工具描述从简历缩成电报,从"小作文"变成"一句话"

以前平均87 tokens,写得跟求职简历似的,恨不得把祖宗八代都写上:

"This tool allows you to search for dependencies between microservices
in our Spring Boot monolithic architecture. Provide a service name to get a
complete list of all services that depend on it..."

现在平均15 tokens,精简得跟电报一样:

"Query service dependency graph. service_name: target service."

原则就一条:描述只告诉Claude"这个工具做什么",不要教它"怎么用这个工具"——那是参数schema的工作。就像简历写"会Java"就行,不用写"Java是1995年由Sun公司发布的面向对象编程语言,由James Gosling发明,最初叫Oak……"HR看到第三行就把你简历扔了。

效果: context消耗从40000+降到8000,降幅80%。Claude终于不再"间歇性失明"了,也不会再出现"我没有这个工具"的迷惑发言。

三层检索:从"大海捞针"到"精准制导"

工具数量搞定了,但还有个更大的坑——我们第一版MCP Server直接把整个service的代码文本塞进返回值。一个service返回5000+ tokens,这跟全量喂文件有什么区别?相当于你说"我要查个电话",对方把整个通讯录复印了一份给你,还附带了全家桶套餐。

正确的做法是:工具只返回结构化元信息,原始代码按需提供。我们重新设计了三层检索,像极了相亲的三步走:先看看照片,再聊聊三观,最后才约见面。层层筛选,绝不浪费感情。

第一层:意图识别——看照片,判断值不值得深挖

返回高度摘要,帮Claude判断"这坑值不值得跳"。就像相亲先看照片,长得顺眼再聊,不顺眼直接"下一个"。

query_service_graph({ service: "OrderService", depth: 1 })

// 返回约200 tokens:
{
  direct_dependencies: ["PaymentService", "InventoryService"],
  depended_by: ["ApiGateway", "BatchProcessor"],
  last_modified: "2026-04-12",
  complexity_score: 7.2
}

Claude一看:"复杂度7.2,有点东西,值得深挖。"要是返回个2.0,它可能直接说:“这代码简单得像个Hello World,你自己看吧,别耽误我算数学题。”

第二层:符号查询——聊三观,精确到函数级别

精确到函数/接口级别,告诉Claude"源码在第几行第几列"。这感觉就像导航软件,不告诉你"大概在朝阳区",而是直接报经纬度,精确到小数点后六位。

find_implementations({ interface: "PaymentGateway" })

// 返回约150 tokens:
{
  implementations: [
    { class: "AlipayGateway", file: "src/payment/AlipayGateway.java", line: 23 },
    { class: "WechatPayGateway", file: "src/payment/WechatPayGateway.java", line: 18 }
  ]
}

Claude知道了精确坐标,就不会像无头苍蝇一样乱撞。以前它用grep,相当于让一个人蒙着眼在迷宫里找出口,现在直接给了GPS导航。

第三层:原文获取——约见面,按需精确读取

只在前两层锁定目标后才调用,精确读取需要的片段。不见兔子不撒鹰,不锁定目标不读代码。

read_source_fragment({
  file: "src/payment/AlipayGateway.java",
  start_line: 23,
  end_line: 80
})

// 57行,约600 tokens

三层合计约950 tokens,对比直接读文件的15000 tokens,降幅94%。Claude终于从"背整本字典"变成了"查字典",从"啃整头牛"变成了"吃一片肉"。

意外收获: 这个结构化index本身成了团队新人最好的onboarding文档——比任何手写的架构图都准,因为它是从代码自动生成的。相当于你花三个月写的Wiki,代码自己三天就生成了,还不用你请它喝奶茶。

LSP集成:给Claude装上IDE的眼睛,它终于不瞎了

到这儿,Claude能查依赖、能找接口实现了。但有一类问题它还是答不好:跨文件的符号引用。你问它:"这个processPayment方法在哪些地方被调用?"用文本搜索,会把注释里的、变量名里的、字符串里的processPayment全搜出来,真正的调用点混在一堆假货里。

这感觉就像你在微信里搜"吃饭",结果搜出了三年前朋友圈的"好好吃饭"、群聊里的"请吃饭"、文件传输助手的"吃饭.jpg"、以及某个表情包里的"吃饭不积极,思想有问题"。真正的约饭信息,淹没在信息的海洋里。

真正的代码调用,得用AST级别的语义分析才能准确。这就是LSP(Language Server Protocol)的价值。IDE里"Go to Definition"和"Find All References"背后就是LSP,它建立了代码的语义索引,能准确区分"这个processPayment是调用"和"这个processPayment是字符串"。

我们用的是cclsp(640 stars),封装了6个MCP工具,给Claude装上了IDE的眼睛:

find_definition(symbol: "PaymentGateway")
find_references(symbol: "processPayment")
rename_symbol(symbol: "processPayment", new_name: "executePayment")
get_diagnostics(file: "src/payment/AlipayGateway.java")

实测数据:用find_references定位一个函数的所有调用点,cclsp约50ms;用纯文本grep搜相同结果,加上人工过滤误报,约45秒。900倍的速度差距。这已经不是"快一点"了,这是"骑自行车"和"坐火箭"的区别,中间还隔了辆高铁。

而且cclsp是AST级别的,能区分"这个processPayment是调用"和"这个processPayment是字符串"。以前Claude用grep,相当于让色盲去分辨红绿灯——不是不能干,是容易出事,一出事就是生产事故。

注意: cclsp需要本地安装对应语言的Language Server。Java要eclipse.jdt.ls,Go要gopls,TypeScript要typescript-language-server。装插件的时候务必把前置依赖说清楚,否则新工程师装完一脸懵:"我工具呢?"就像你买了辆豪车,发现没钥匙,干瞪眼。

六周踩坑总结:Claude不是神仙,是需要配装备的英雄

回头来看,这六周最大的教训不是技术细节,而是心态:别把Claude当神仙,把它当一个超级聪明但有点健忘的新同事。你不可能让新同事入职第一天背完180K行代码,但你可以给他配好IDE、装好搜索引擎、建好代码索引。工具链到位了,他比你想象中能干得多,甚至能帮你发现你自己都没意识到的bug。

MCP Server不是锦上添花,是大代码库场景下的刚需。但设计的时候记住三条铁律,背不下来就抄下来贴显示器上:

1. 工具别贪多,10-20个是sweet spot,超过50个Claude就开始"选择性失忆",跟得了阿尔茨海默似的。

2. 工具描述能短则短,别写小作文。Claude不需要你教它怎么做人,只需要告诉它这个工具是干嘛的。写长了它也不看,白浪费token。

3. 返回值给元信息,别给原始代码。让Claude当侦探,别当复印机。侦探值钱,复印机五毛钱一张。

最后说一句:如果你也在折腾大代码库+AI辅助,欢迎评论区交流。毕竟,一个人踩坑是悲剧,一群人踩坑是喜剧——而我已经把悲剧演完了,该你们笑了。当然,笑完记得点赞,不然我下次写更惨的。

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐