MCP融合Spring AI,Java程序員大模型技術(shù)再上一層樓
在當(dāng)下的技術(shù)發(fā)展浪潮中,大語言模型(LLMs)正深度滲透至企業(yè)應(yīng)用開發(fā)領(lǐng)域,持續(xù)改寫著該領(lǐng)域的格局。開發(fā)者積極將其融入現(xiàn)代解決方案。然而,快速發(fā)展背后,大語言模型通信和上下文處理缺乏標(biāo)準(zhǔn)化協(xié)議的問題日益凸顯。
本文介紹模型上下文協(xié)議(MCP),其與Spring AI集成,為解決上述難題提供有效途徑,助力大語言模型在企業(yè)應(yīng)用開發(fā)中更好地落地。
1.問題:缺乏規(guī)范的大語言模型集成
如今,大多數(shù)開發(fā)者通過特定供應(yīng)商的API(如OpenAI、Anthropic或Azure OpenAI)與大語言模型進(jìn)行交互。盡管這些API功能強(qiáng)大,但在沒有標(biāo)準(zhǔn)接口的情況下進(jìn)行集成會導(dǎo)致以下問題:
- 供應(yīng)商鎖定:更換大語言模型供應(yīng)商需要重寫核心邏輯。
- 上下文處理不一致:不同供應(yīng)商在管理長期記憶、知識或工具訪問方面存在差異。
- 系統(tǒng)行為不明確:沒有正式規(guī)范來定義模型的需求,以及它們?nèi)绾闻c外部工具和函數(shù)進(jìn)行交互。
而模型上下文協(xié)議(MCP)正是為解決這些問題而生。
2.什么是MCP
模型上下文協(xié)議(MCP)是一種與供應(yīng)商無關(guān)的協(xié)議,旨在實(shí)現(xiàn)大語言模型、智能體、工具、記憶系統(tǒng)和外部服務(wù)之間的互操作性。
模型上下文協(xié)議(MCP)是由Anthropic開發(fā)的開放標(biāo)準(zhǔn),如今已成為一種開放協(xié)議,得到了包括LangChain、LangGraph,甚至Spring AI在內(nèi)的多個社區(qū)和工具的支持。
可以把MCP想象成大語言模型領(lǐng)域的REST協(xié)議:它是一個簡潔且可擴(kuò)展的規(guī)范,定義了如何構(gòu)建輸入、輸出、工具、記憶和上下文。
3.人工智能的通用標(biāo)準(zhǔn):一次編寫,隨處可用
在AI領(lǐng)域,模型上下文協(xié)議(MCP)致力于打造統(tǒng)一的通信規(guī)范。OpenAI、Anthropic等行業(yè)巨頭已采用MCP。
這一協(xié)議為開發(fā)者帶來極大便利。過去,針對不同大語言模型供應(yīng)商和輔助應(yīng)用,需構(gòu)建定制集成?,F(xiàn)在,借助MCP,開發(fā)者只需實(shí)現(xiàn)一次,就能在Claude、ChatGPT等眾多應(yīng)用,以及未來支持該協(xié)議的客戶端中復(fù)用,有效提升開發(fā)效率,降低成本。
4.MCP如何工作:簡單的客戶端 - 服務(wù)器架構(gòu)
MCP的基礎(chǔ)是簡潔且模塊化的客戶端 - 服務(wù)器架構(gòu)??梢詫⑵湎胂蟪梢粋€中心輻射型模型,宿主應(yīng)用程序(客戶端)通過與多個專門的MCP服務(wù)器進(jìn)行通信來完成任務(wù)。
圖片
具體如下:
- MCP宿主:這些是前端工具或應(yīng)用程序,如Claude桌面應(yīng)用、代碼編輯器或人工智能智能體,它們希望與數(shù)據(jù)、工具或邏輯進(jìn)行交互。
- MCP客戶端:每個宿主應(yīng)用程序通過該協(xié)議與一個或多個MCP服務(wù)器保持專用連接。這使得客戶端可以發(fā)送請求、接收響應(yīng),甚至觸發(fā)工具。
- MCP服務(wù)器:這些是輕量級的后端程序,通過模型上下文協(xié)議公開特定功能,如訪問本地文件、觸發(fā)API或運(yùn)行工作流。每個服務(wù)器都可以是專門構(gòu)建且獨(dú)立的。
- 本地?cái)?shù)據(jù)源:用戶本地機(jī)器上的文件、數(shù)據(jù)庫或微服務(wù),可由MCP服務(wù)器安全訪問。
- 遠(yuǎn)程服務(wù):MCP服務(wù)器可以連接的API或云平臺,擴(kuò)展了服務(wù)器的功能范圍,使其超越本地環(huán)境。
MCP支持開發(fā)者圍繞一種名為JsonRpcMessage的正式模式來構(gòu)建大語言模型交互。
5.MCP與Spring AI集成
Spring AI通過提供即用型的Spring Boot啟動器,使將模型上下文協(xié)議(MCP)集成到應(yīng)用程序變得輕松。這些啟動器涵蓋客戶端和服務(wù)器端設(shè)置,并支持多種通信傳輸方式,如標(biāo)準(zhǔn)輸入輸出(STDIO)和服務(wù)器發(fā)送事件(SSE)。
5.1 客戶端啟動器
這些啟動器幫助應(yīng)用程序連接到MCP服務(wù)器:
spring-ai-starter-mcp-client
:核心的MCP客戶端,內(nèi)置對基于STDIO和HTTP的SSE通信的支持。spring-ai-starter-mcp-client-webflux
:使用WebFlux為SSE傳輸添加響應(yīng)式支持。
5.2 服務(wù)器啟動器
這些用于使用Spring Boot構(gòu)建自定義MCP服務(wù)器:
spring-ai-starter-mcp-server
:使用STDIO傳輸?shù)幕痉?wù)器設(shè)置,適用于基于進(jìn)程的通信。spring-ai-starter-mcp-server-webmvc
:使用Spring MVC提供SSE服務(wù)器支持,適用于基于Servlet的環(huán)境。spring-ai-starter-mcp-server-webflux
:適用于使用Spring WebFlux的應(yīng)用程序的SSE服務(wù)器的響應(yīng)式版本。
支持STDIO、Servlet SSE、WebFlux和WebMVC傳輸。
圖片
6.使用STDIO傳輸啟動Spring AI MCP服務(wù)器
以下是一個完整的示例,展示如何使用Spring AI設(shè)置MCP服務(wù)器。該示例功能完備,且使用Spring Boot進(jìn)行了清晰的組織。此示例使用spring-ai-starter-mcp-server
,并可選支持STDIO和/或基于HTTP的SSE傳輸。
官方文檔提供了詳細(xì)指南:https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html
6.1 Maven依賴
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
@SpringBootApplication
publicclass SpringMcpApplication {
privatestaticfinal Logger log = LoggerFactory.getLogger(SpringMcpApplication.class);
public static void main(String[] args) {
SpringApplication.run(SpringMcpApplication.class, args);
}
@Bean
public List<ToolCallback> danTools(SpringMCPServerService courseService) {
log.info(Arrays.toString(Thread.currentThread().getStackTrace()).replace(',', '\n'));
return Arrays.asList(ToolCallbacks.from(courseService));
}
}
@Service
publicclass SpringMCPServerService {
@Tool(name = "get_system_information", description = "Gathers detailed system-level diagnostics including directory info, OS and architecture details, JVM configuration, memory stats, CPU load, and installed software versions.")
public static SystemInfo getSystemInfo() {
SystemInfo info = new SystemInfo();
Properties props = System.getProperties();
info.osName = props.getProperty("os.name");
//......
}
}
spring.application.name=courses
spring.main.web-application-type=none
spring.ai.mcp.server.name=jagnya-selflearn-mcp
spring.ai.mcp.server.versinotallow=0.0.1
spring.main.banner-mode=off
logging.pattern.cnotallow=
6.2 關(guān)鍵配置說明
- STDIO模式要求:
禁用Web應(yīng)用類型(spring.main.web-application-type=none
)
禁用Spring啟動橫幅(spring.main.banner-mode=off
)
清空控制臺日志模式(logging.pattern.cnotallow=
)
7.MCP服務(wù)器與Claude(Anthropic)客戶端的集成
現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了MCP服務(wù)器,接下來要將它與Anthropic的Claude AI進(jìn)行集成。這可以驗(yàn)證服務(wù)器是否正常運(yùn)行,以及是否能夠?yàn)橄馛laude這樣符合MCP規(guī)范的客戶端提供上下文數(shù)據(jù)。
圖片
8.MCP服務(wù)器與Claude桌面應(yīng)用集成:分步指南
以下是如何將基于Spring的MCP服務(wù)器與Claude桌面應(yīng)用(Anthropic)進(jìn)行集成,以驗(yàn)證一切是否按預(yù)期工作:
1) 如果尚未下載,請從Anthropic網(wǎng)站下載并安裝Claude桌面應(yīng)用。
2) 啟動Claude桌面應(yīng)用程序。Claude設(shè)計(jì)為支持通過模型上下文協(xié)議(MCP)與自定義人工智能模型服務(wù)器進(jìn)行通信。
- 進(jìn)入Claude的“設(shè)置”。
- 導(dǎo)航到“開發(fā)者”部分。
- 點(diǎn)擊“編輯配置”以打開
claude_desktop_config.json
。 - 使用自定義MCP服務(wù)器配置更新
claude_desktop_config.json
。例如:
{
"mcpServers": {
"jagnya-spring-mcp": {
"command": "/Users/user/Library/Java/JavaVirtualMachines/sapmachine-21.0.6/Contents/Home/bin/java",
"args": [
"-jar",
"/Users/<add ur path to jar>/spring-mcp/target/spring-mcp-0.0.1-SNAPSHOT.jar"
]
}
}
}
3) 保存配置后,重啟Claude桌面應(yīng)用。
如果一切配置正確,你會看到:
- 一個代表開發(fā)者工具的錘子圖標(biāo)???
- 一個代表自定義集成的插件圖標(biāo)??
- 點(diǎn)擊錘子圖標(biāo)打開MCP工具。
- 在Claude中輸入以下內(nèi)容:
Hi, get my system details with the Java version installed.
- Claude會彈出一個權(quán)限請求對話框,點(diǎn)擊“允許”。
圖片