本篇文章主要介紹 MCP Server Easy Code Reader,它可以幫助你在使用 Joycode 編寫(xiě)代碼時(shí),根據(jù)調(diào)用鏈路將多個(gè)項(xiàng)目或 Jar 包中相關(guān)的代碼讀取到上下文中,供 Code Agent 幫我們分析邏輯和編寫(xiě)代碼,而無(wú)需再手動(dòng)將源碼復(fù)制到對(duì)話框中發(fā)送給 AI,提高 Code Agent 準(zhǔn)確度和編碼效率。MCP 已發(fā)布 Github: easy-code-reader 和 Joycode MCP 市場(chǎng),歡迎大家使用。在介紹如何接入 Easy Code Reader 之前,我們先來(lái)看看它到底能做什么:
Easy Code Reader 最佳實(shí)踐
Easy Code Reader 特別適合與 Claude、ChatGPT 等大模型配合使用,接下來(lái)以 Joycode 結(jié)合 Claude4 為例,介紹最佳實(shí)踐:
1. 跨項(xiàng)目調(diào)用,根據(jù)調(diào)用鏈路分析源碼
在比較復(fù)雜的項(xiàng)目中一般會(huì)拆分多個(gè)微服務(wù),某些功能的實(shí)現(xiàn)可能會(huì)跨多個(gè)項(xiàng)目調(diào)用,如果靠人梳理相關(guān)邏輯會(huì)比較耗時(shí),所以可以將涉及的代碼 clone 到本地后使用 Code Agent 結(jié)合 Easy Code Reader MCP 進(jìn)行分析。接下來(lái)我們以實(shí)際業(yè)務(wù)項(xiàng)目為例,來(lái)通過(guò)兩個(gè)例子來(lái)演示最佳實(shí)踐:
解析跨項(xiàng)目的 JSF RPC 調(diào)用
我們先來(lái)看一個(gè)比較簡(jiǎn)單的例子,比如在本地應(yīng)用 application-a 中存在以下調(diào)用邏輯,其中 YbServiceSubmitOrderPaasResource#submitOrderPaaS 是跨項(xiàng)目的 JSF RPC 調(diào)用:
@Slf4j
@Service
public class YbServiceSubmitOrderRpcImpl implements YbServiceSubmitOrderRpc {
@Resource
private YbServiceSubmitOrderPaasResource ybServiceSubmitOrderPaasResource;
@Override
public String newSubmitOrder(YbSubmitOrderReq submitOrderReq) {
if (log.isInfoEnabled()) {
log.info("[提交訂單]請(qǐng)求開(kāi)始,參數(shù)-submitOrderReq:" +JSON.toJSONString(submitOrderReq));
}
String result;
try {
Result rpcResult = ybServiceSubmitOrderPaasResource.submitOrderPaaS(submitOrderReq);
if (log.isInfoEnabled()) {
log.info("[提交訂單]rpc請(qǐng)求結(jié)束,結(jié)果-rpcResult:{}" , JSON.toJSONString(rpcResult));
}
if (rpcResult == null) {
throw new RuntimeException("調(diào)用接口結(jié)果為空");
}
if (!rpcResult.getSuccess()) {
throw new RuntimeException(rpcResult.getCode());
}
result = rpcResult.getData();
} catch (Throwable t) {
String logStr = "[提交訂單]請(qǐng)求出錯(cuò),參數(shù)-submitOrderReq:" +JSON.toJSONString(submitOrderReq);
log.error(logStr, t);
throw t;
}
if (log.isInfoEnabled()) {
log.info("[提交訂單]請(qǐng)求結(jié)束,結(jié)果-result:{}" , result);
}
return result;
}
}
如果我想要了解 submitOrderPaaS的邏輯,那么我可能要打開(kāi)相關(guān)的項(xiàng)目代碼再去一步步找到對(duì)應(yīng)的邏輯。但是如果借助 Easy Code Reader MCP Server 的話,那么便可以通過(guò)它來(lái)快速了解這個(gè) RPC 接口的實(shí)現(xiàn)細(xì)節(jié),下面是一個(gè)示例 Prompt:
你是一位 Java 技術(shù)專(zhuān)家,我想知道 @/xxx/YbServiceSubmitOrderRpcImpl.java 中調(diào)用的 Result rpcResult = ybServiceSubmitOrderPaasResource.submitOrderPaaS(submitOrderReq); 方法實(shí)現(xiàn)邏輯是什么,這個(gè)方法真正的實(shí)現(xiàn)邏輯可能在本地項(xiàng)目的 rpc-pxxxorm 或 rpc-pxxxorm-export 中,請(qǐng)你使用 easy-code-reader MCP 檢查相應(yīng)地目錄和文件,幫我找到核心實(shí)現(xiàn)邏輯并解釋它的實(shí)現(xiàn)原理


如圖所示,它會(huì)不斷地根據(jù)源碼調(diào)用鏈路,讀取相關(guān)源碼并進(jìn)行分析,最終我們就能了解這個(gè) RPC 接口的實(shí)現(xiàn)細(xì)節(jié),在這個(gè)過(guò)程會(huì)使用到 MCP Easy Code Reader 提供的多個(gè)工具,使用 list_all_project 來(lái)找到對(duì)應(yīng)的本地項(xiàng)目;使用list_project_files 查找可能相關(guān)的文件;使用 read_project_code來(lái)閱讀源碼,根據(jù)結(jié)果來(lái)總結(jié)實(shí)現(xiàn)原理。
解析消息驅(qū)動(dòng)的分布式事務(wù)(協(xié)同式 Saga)
在這里我們讓 Joycode 幫我們處理一個(gè)相對(duì)復(fù)雜的任務(wù),在我們的業(yè)務(wù)中“某類(lèi)型訂單下單流程”使用了協(xié)同式 Saga 保證數(shù)據(jù)的一致性,在這個(gè)流程中跨越多個(gè)應(yīng)用且流程復(fù)雜,我們可以借助 Joycode 幫我們從下單消息的接收開(kāi)始分析,直到最終數(shù)據(jù)庫(kù)收單完成。
開(kāi)始任務(wù)時(shí)采用的是以下 Prompt,并且使用的是 “智能體團(tuán)隊(duì)” 智能體,這個(gè)智能體能開(kāi)啟多個(gè)任務(wù),避免單一任務(wù)上下文太長(zhǎng):
你是一位 Java 技術(shù)專(zhuān)家,熟悉分布式事務(wù)的原理,我現(xiàn)在想了解“某類(lèi)型訂單下單流程”(不關(guān)注換貨或退單),但是它的鏈路非常長(zhǎng),涉及的應(yīng)用比較多,包括 yb-xxxde, yb-xxxrs, yb-xxxrm 和 lvxxxde 等本地應(yīng)用,入口在 yb-xxxde 以 JMQ 消息的形式,它的主題是 pxx_xxx_xxxer 定義了 Order3csServiceHandler.java 消費(fèi)者,請(qǐng)你根據(jù)源碼分析,從這個(gè)消息消費(fèi),到調(diào)用 yb-xxxrs 再到 lvxxxde 落數(shù)據(jù)庫(kù)訂單的流程,你需要檢查相關(guān)鏈路上的源碼和配置文件(包括但不限于 jmq 或 jsf 配置),讀取多個(gè)本地項(xiàng)目或依賴(lài)的 jar 包內(nèi)容,在這個(gè)過(guò)程中你需要依賴(lài) easy-code-reader 的 MCP 的能力,輸出結(jié)果中請(qǐng)幫我畫(huà)出接口調(diào)用的時(shí)序圖,并告訴我在處理的過(guò)程中涉及那些具體的 JMQ 主題,JSF 接口和落數(shù)據(jù)庫(kù)的表名 注意以下幾點(diǎn): 0. 每次創(chuàng)建子任務(wù)時(shí)需要使用編碼智能體,這樣才能使用 MCP 工具 1. 在讀取項(xiàng)目文件時(shí),請(qǐng)嚴(yán)格遵守使用 easy-code-reader MCP 的原則,不能自主掃描和讀取應(yīng)用代碼,避免出現(xiàn)讀錯(cuò)應(yīng)用代碼的情況 2. 如果遇到 jar 包需要讀取,也需要使用 easy-code-reader MCP 的工具 3. “某類(lèi)型訂單下單流程”鏈路是自上向下的過(guò)程,由 yb-xxxde 到 yb-xxxrs 到 yb-xxxrm 到 lvxxxde,所以你在每分析完一個(gè)應(yīng)用的邏輯后,會(huì)獲取到銜接下一個(gè)應(yīng)用的邏輯,請(qǐng)你記住這些銜接的邏輯,這些需要作為檢查加一個(gè)項(xiàng)目的起點(diǎn)
它會(huì)執(zhí)行一個(gè)時(shí)間非常長(zhǎng)的任務(wù),根據(jù) 消息 和 JSF RPC 接口的調(diào)用鏈路不斷讀取多個(gè)相關(guān)應(yīng)用的相關(guān)代碼,如下所示:

最終匯總出結(jié)果并繪制出 drawio 的流程圖:

結(jié)果與業(yè)務(wù)流程基本一致,這會(huì) 極大的降低復(fù)雜系統(tǒng)的上手難度,加快開(kāi)發(fā)者對(duì)現(xiàn)有微服務(wù)項(xiàng)目的理解。說(shuō)實(shí)話我也對(duì) AI 本次任務(wù)輸出的結(jié)果感到吃驚,隨著 AI 能力進(jìn)一步的發(fā)展,處理任務(wù)的結(jié)果只會(huì)更好。
2. 閱讀 jar 包源碼,根據(jù)源碼完成代碼編寫(xiě)
在使用第三方或其他外部依賴(lài)時(shí),Joycode Agent 并不能直接讀取 jar 包中的源碼,往往需要我們將源碼內(nèi)容手動(dòng)復(fù)制到提示詞中才能完成,費(fèi)時(shí)費(fèi)力。在 Easy Code Reader 中提供了 read_jar_source 工具來(lái)讀取 jar 包中的源碼,幫我們完成開(kāi)發(fā)實(shí)現(xiàn)。我們?cè)谀稠?xiàng)目中以如下提示詞為例:
你是一位 Java 技術(shù)專(zhuān)家,請(qǐng)你使用 MCP 幫我讀取 jar 包中 com.jd.xxx.OfflineInsureOrderResource 的源碼信息
在提示詞中我們并沒(méi)有聲明是哪個(gè) Maven 依賴(lài)及其版本,但是它也能處理:

可以發(fā)現(xiàn),它第一次讀取時(shí)根據(jù)推測(cè)并沒(méi)有找到實(shí)際的 Maven 依賴(lài),而是通過(guò)讀取 pom.xml 補(bǔ)償了一次后讀取到了。
3. 跨項(xiàng)目閱讀源碼,根據(jù)源碼完成本項(xiàng)目實(shí)現(xiàn)
在大型項(xiàng)目中,某些功能的實(shí)現(xiàn)可能會(huì)跨多個(gè)模塊或微服務(wù),如果部分邏輯已經(jīng)實(shí)現(xiàn)并且后續(xù)其他應(yīng)用的邏輯需要依賴(lài)這部分邏輯時(shí),可以借助 Easy Code Reader 讀取相關(guān)模塊的源碼,幫助我們更好地理解和實(shí)現(xiàn)當(dāng)前項(xiàng)目的功能,示例 Prompt 如下:
你是一位 Java 技術(shù)專(zhuān)家,現(xiàn)在我要實(shí)現(xiàn) XXX 的業(yè)務(wù)邏輯,這部分邏輯的實(shí)現(xiàn)需要調(diào)用本地項(xiàng)目 A 中 XXX 的接口及其實(shí)現(xiàn),請(qǐng)你借助 MCP easy-code-reader 來(lái)幫我讀取 A 項(xiàng)目中的源碼,并幫我實(shí)現(xiàn) XXX 的業(yè)務(wù)邏輯
當(dāng)然除了這幾種場(chǎng)景以外,還可以使用 Easy Code Reader 完成以下事項(xiàng):
異常問(wèn)題快速溯源:如果有異常信息是外部 jar 包依賴(lài)中拋出來(lái)的,可以使用 read_jar_source 工具根據(jù)異常堆棧日志快速定位異常點(diǎn)
依賴(lài)升級(jí)影響評(píng)估(舊/新版本差異核對(duì)):同樣是使用 read_jar_source 工具來(lái)完成新舊版本的實(shí)現(xiàn)差異,評(píng)估升級(jí)影響
業(yè)務(wù)代碼邏輯評(píng)審:如果業(yè)務(wù)邏輯開(kāi)發(fā)實(shí)現(xiàn)在多個(gè)項(xiàng)目中,可以借助讀取本地項(xiàng)目代碼的工具 list_all_project、list_project_files 和 read_project_code,來(lái)分析新增的邏輯是否滿(mǎn)足業(yè)務(wù)要求
新人快速上手多個(gè)微服務(wù):借助讀取本地項(xiàng)目代碼的工具,可以根據(jù)接口調(diào)用鏈路快速理清微服務(wù)項(xiàng)目代碼之間的關(guān)系,提高上手速度
環(huán)境要求
既然它有這么多的應(yīng)用場(chǎng)景,那么我們?cè)撊绾谓尤?Easy Code Reader 呢?下面我們來(lái)介紹一下接入步驟,它的環(huán)境要求如下:
uv - Python 包和項(xiàng)目管理工具
Python 3.10 或更高版本(一般情況下,可以先安裝 uv,安裝成功后嘗試啟動(dòng) MCP Server,如果提示缺少 Python 環(huán)境再進(jìn)行安裝)
Java Development Kit (JDK) - 用于運(yùn)行反編譯器,要求至少 Java 8
如果您還沒(méi)有安裝 uv,可以通過(guò)以下方式快速安裝:
# macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
或者參考 uv 官網(wǎng) 進(jìn)行安裝,并配置 uv 的安裝路徑添加到系統(tǒng) PATH 中,以便可以直接使用 uv 命令。
快速接入(方法一):使用 uvx(推薦)
參考以下在 Joycode 中的 MCP 客戶(hù)端配置,搜索 “Easy Code Reader”,點(diǎn)擊安裝:

注意以下兩個(gè)參數(shù)變量的配置:
--maven-repo: 指定 Maven 倉(cāng)庫(kù)路徑,將 /custom/path/to/maven/repository 內(nèi)容替換為本地 Maven 倉(cāng)庫(kù)路徑即可,不配置默認(rèn)使用 MAVEN_HOME 目錄或 ~/.m2/repository
--project-dir: 指定本地項(xiàng)目目錄路徑,將 /customer/path/to/project-dir 替換為實(shí)際保存所有項(xiàng)目的路徑
{
"mcpServers": {
"Easy Code Reader": {
"command": "uvx",
"args": [
"easy-code-reader",
"--maven-repo",
"/customer/maven-repository",
"--project-dir",
"/customer/path/to/project-dir"
]
}
}
}
將以上內(nèi)容配置好后,AI 助手即可通過(guò) MCP 協(xié)議調(diào)用 Easy Code Reader 提供的工具,完成多項(xiàng)目、多依賴(lài)的 Java 源代碼讀取工作。啟動(dòng)完成后,可以讓 Joycode 執(zhí)行 easy-code-reader://guide 命令獲取使用指南 Resource,檢查當(dāng)前的配置是否為符合自己本地的目錄配置:

快速接入(方法二):使用 uv 安裝到本地
如果使用 快速接入(方法一) 安裝運(yùn)行失敗,那么可以采用直接安裝到本地的方法,運(yùn)行如下命令:
uv tool install easy-code-reader
安裝成功后,執(zhí)行以下命令獲取安裝目錄:
which easy-code-reader
比如,輸出結(jié)果是:/Users/wangyilong13/.local/bin/easy-code-reader,那么需要按照如下方式配置 MCP 客戶(hù)端,注意 args 參數(shù)配置,注意 args 參數(shù)配置,注意 args 參數(shù)配置:
{
"mcpServers": {
"easy-code-reader": {
"command": "/Users/wangyilong13/.local/bin/easy-code-reader",
"args": [
"--maven-repo",
"/custom/path/to/maven/repository",
"--project-dir",
"/customer/path/to/project-dir"
],
"env": {}
}
}
}
一般這樣操作都能完成安裝,后續(xù)如果有版本更新,可以通過(guò)以下命令進(jìn)行升級(jí):
uv tool install --upgrade easy-code-reader
常見(jiàn)問(wèn)題
Q1: spawn uvx ENOENT spawn uvx ENOENT
uv 命令未找到,確保已正確安裝 uv 并將其路徑添加到系統(tǒng) PATH 中,參考 環(huán)境要求,并嘗試重啟 IDE 后再啟動(dòng) MCP Server。
Q2: Downloading cpython-3.10.19-macos-aarch64-none (download) (17.7MiB) MCP error -32001: Request timed out
Python 環(huán)境下載失敗,嘗試手動(dòng)下載或重試下載,或者參考 快速接入(方法二)。
以上內(nèi)容就是 MCP Easy Code Reader 的介紹和接入方法,接下來(lái)的內(nèi)容主要介紹一下它的實(shí)現(xiàn)原理,感興趣的朋友可以繼續(xù)往下看。
Easy Code Reader 實(shí)現(xiàn)原理
其實(shí)編寫(xiě)一個(gè) MCP Server 并不復(fù)雜,大家可以參考這篇 Github 上的文章 Model Context Protocol(MCP) 編程極速入門(mén)。Easy Code Reader 通過(guò) Python 語(yǔ)言實(shí)現(xiàn),它提供了 4 個(gè)主要工具來(lái)協(xié)同完成源碼讀取工作:
list_all_project: 列出所有本地項(xiàng)目,這個(gè)工具能將配置的項(xiàng)目目錄 --project-dir 下所有的文件夾都讀取出來(lái),每個(gè)文件夾代表一個(gè)項(xiàng)目,這樣 Code Agent 便能根據(jù)項(xiàng)目名稱(chēng)來(lái)選擇需要讀取的項(xiàng)目
list_project_files: 列出指定項(xiàng)目中的所有文件名,這個(gè)工具能將指定項(xiàng)目下的所有源碼文件名都讀取出來(lái),Code Agent 便能根據(jù)調(diào)用鏈路選擇需要讀取的文件
read_project_code: 讀取指定項(xiàng)目中的某個(gè)文件源碼,通過(guò)以上兩個(gè)工具,Code Agent 能夠定位到需要讀取的文件,然后使用這個(gè)工具將源碼內(nèi)容讀取出來(lái),供 Code Agent 進(jìn)行分析
read_jar_source: 讀取指定 jar 包中的某個(gè)類(lèi)源碼,如果調(diào)用鏈路中有外部 jar 包依賴(lài)的話,Code Agent 便可以使用這個(gè)工具將 jar 包中的源碼讀取出來(lái),供分析和編寫(xiě)代碼
這四個(gè)工具協(xié)同工作,便能實(shí)現(xiàn)跨項(xiàng)目、多依賴(lài)的源碼讀取工作,幫助 Code Agent 更好地理解代碼邏輯,從而提高代碼編寫(xiě)效率和準(zhǔn)確度,以下是 MCP Tool 實(shí)現(xiàn)的技術(shù)細(xì)節(jié):
list_all_project
列舉項(xiàng)目目錄下所有的項(xiàng)目文件夾名稱(chēng)。
用途:
查看所有可用的項(xiàng)目
當(dāng)輸入不完整的項(xiàng)目名時(shí),幫助推理出最接近的項(xiàng)目名
驗(yàn)證項(xiàng)目是否存在
支持項(xiàng)目名稱(chēng)模糊匹配,快速查找特定項(xiàng)目
參數(shù):
project_dir (可選): 項(xiàng)目目錄路徑,如未提供則使用啟動(dòng)時(shí)配置的路徑
project_name_pattern (可選): 項(xiàng)目名稱(chēng)模糊匹配模式(不區(qū)分大小寫(xiě)),用于過(guò)濾項(xiàng)目列表
支持左右模糊匹配,例如 nacos 將匹配包含 nacos、Nacos、NACOS 的項(xiàng)目名
?? 使用建議:如果匹配模式過(guò)于嚴(yán)格可能導(dǎo)致遺漏目標(biāo)項(xiàng)目
審核編輯 黃宇
-
源碼
+關(guān)注
關(guān)注
8文章
685瀏覽量
31317 -
JSF
+關(guān)注
關(guān)注
0文章
14瀏覽量
7925 -
MCP
+關(guān)注
關(guān)注
0文章
289瀏覽量
15007
發(fā)布評(píng)論請(qǐng)先 登錄
項(xiàng)目數(shù)據(jù)稀缺,算法開(kāi)發(fā)怎么辦?
冬季灌封膠不干?環(huán)氧聚氨酯低溫固化五大避坑指南 |鉻銳特實(shí)業(yè)
智能顯示模塊連接電腦后無(wú)法識(shí)別怎么辦?連接電腦后讀不到模塊U盤(pán)?
使用單片機(jī)系統(tǒng)時(shí)間不準(zhǔn)怎么辦?
最新MCP規(guī)范解讀,看這篇就夠了!
如何在VS code中配置Zephyr集成開(kāi)發(fā)環(huán)境
JoyCode:SWE-bench Verified打榜技術(shù)報(bào)告
USB 接口無(wú)法識(shí)別外接設(shè)備怎么辦??
電腦連接到openmv,但不會(huì)自動(dòng)彈出盤(pán)符,請(qǐng)問(wèn)怎么辦?
FPGA的Jtag接口燒了,怎么辦?
用MCP將百度地圖能力輕松接入DeepSeek
Joycode 無(wú)法跨項(xiàng)目讀取源碼怎么辦?MCP Easy Code Reader 幫你解決!
評(píng)論