1"use strict";(self.webpackChunkspring_ai_alibaba_website=self.webpackChunkspring_ai_alibaba_website||[]).push([[2897],{4084:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/5-12fc9c0cf775b06544a9e81fd68baaff.png"},14976:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/12-1c822c559ae0372d15f20911a08d2869.png"},20765:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/4-5a84801c46cca04ad035af27abcb934c.png"},28453:(n,e,i)=>{i.d(e,{R:()=>s,x:()=>t});var r=i(96540);const a={},l=r.createContext(a);function s(n){const e=r.useContext(l);return r.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(a):n.components||a:s(n.components),r.createElement(l.Provider,{value:e},n.children)}},32866:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/3-940402af35ab8f1f4ebcfc87549dea7c.png"},39558:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/7-d9293b2d6e390e7a77c4107f92b165da.png"},49360:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>t,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>o});var r=i(84823),a=i(74848),l=i(28453);const s={title:"Java\u5f00\u53d1\u57fa\u4e8eSpring AI Alibaba\u73a9\u8f6cMCP\uff1a\u4ece\u53d1\u5e03\u3001\u8c03\u7528\u5230 Claude \u96c6\u6210",tags:["Model Context Protocol","MCP","Spring Ai","Claude","OpenManus"],description:"\u672c\u6587\u8ba8\u8bba\u4e86 2024 \u5e74 11 \u6708 Anthropic \u516c\u53f8\u63a8\u51fa\u7684 MCP \u534f\u8bae\uff0c\u4ecb\u7ecd\u4e86\u5176\u5728 Claude \u81ea\u52a8\u5316\u5230 Spring AI Alibaba \u751f\u6001\u6574\u5408\u4e2d\u7684\u5e94\u7528\uff0c\u5305\u62ec\u67b6\u6784\u3001\u642d\u5efa\u65b9\u6cd5\u53ca\u6d4b\u8bd5\u8fc7\u7a0b\u7b49\u3002",authors:["brianxiadong"],date:"2025-04-02",slug:"spring-ai-alibaba-mcp",category:"article"},t="0\u3001\u6587\u7ae0\u6458\u8981",c={authorsImageUrls:[void 0]},o=[{value:"1.1 \u5728 Claude Desktop \u4e2d\u4f53\u9a8c MCP",id:"11-\u5728-claude-desktop-\u4e2d\u4f53\u9a8c-mcp",level:2},{value:"1.2 MCP \u7684\u67b6\u6784",id:"12-mcp-\u7684\u67b6\u6784",level:2},{value:"2.1 Spring AI MCP \u7684\u4ecb\u7ecd",id:"21-spring-ai-mcp-\u7684\u4ecb\u7ecd",level:2},{value:"2.2 \u4f7f\u7528 Spring AI MCP \u5feb\u901f\u642d\u5efa MCP Server",id:"22-\u4f7f\u7528-spring-ai-mcp-\u5feb\u901f\u642d\u5efa-mcp-server",level:2},{value:"2.2.1 \u57fa\u4e8e stdio \u7684 MCP \u670d\u52a1\u7aef\u5b9e\u73b0",id:"221-\u57fa\u4e8e-stdio-\u7684-mcp-\u670d\u52a1\u7aef\u5b9e\u73b0",level:3},{value:"\u6dfb\u52a0\u4f9d\u8d56",id:"\u6dfb\u52a0\u4f9d\u8d56",level:4},{value:"\u914d\u7f6e MCP \u670d\u52a1\u7aef",id:"\u914d\u7f6e-mcp-\u670d\u52a1\u7aef",level:4},{value:"\u5b9e\u73b0 MCP \u5de5\u5177",id:"\u5b9e\u73b0-mcp-\u5de5\u5177",level:4},{value:"\u6ce8\u518c MCP \u5de5\u5177",id:"\u6ce8\u518c-mcp-\u5de5\u5177",level:4},{value:"\u8fd0\u884c\u670d\u52a1\u7aef",id:"\u8fd0\u884c\u670d\u52a1\u7aef",level:4},{value:"2.2.2 \u57fa\u4e8e SSE \u7684 MCP \u670d\u52a1\u7aef\u5b9e\u73b0",id:"222-\u57fa\u4e8e-sse-\u7684-mcp-\u670d\u52a1\u7aef\u5b9e\u73b0",level:3},{value:"\u6dfb\u52a0\u4f9d\u8d56",id:"\u6dfb\u52a0\u4f9d\u8d56-1",level:4},{value:"\u914d\u7f6e MCP Server",id:"\u914d\u7f6e-mcp-server",level:4},{value:"\u5b9e\u73b0 MCP Tool",id:"\u5b9e\u73b0-mcp-tool",level:4},{value:"\u6ce8\u518c MCP \u5de5\u5177",id:"\u6ce8\u518c-mcp-\u5de5\u5177-1",level:4},{value:"\u8fd0\u884c\u670d\u52a1\u7aef",id:"\u8fd0\u884c\u670d\u52a1\u7aef-1",level:4},{value:"2.3 \u5728 Claude \u4e2d\u6d4b\u8bd5 mcp \u670d\u52a1",id:"23-\u5728-claude-\u4e2d\u6d4b\u8bd5-mcp-\u670d\u52a1",level:2},{value:"3.1 \u57fa\u4e8e stdio \u7684 MCP \u5ba2\u6237\u7aef\u5b9e\u73b0",id:"31-\u57fa\u4e8e-stdio-\u7684-mcp-\u5ba2\u6237\u7aef\u5b9e\u73b0",level:2},{value:"\u6dfb\u52a0\u4f9d\u8d56",id:"\u6dfb\u52a0\u4f9d\u8d56-2",level:3},{value:"\u914d\u7f6e MCP \u670d\u52a1\u5668",id:"\u914d\u7f6e-mcp-\u670d\u52a1\u5668",level:3},{value:"\u7f16\u5199\u4e00\u4e2a\u542f\u52a8\u7c7b\u8fdb\u884c\u6d4b\u8bd5\uff1a",id:"\u7f16\u5199\u4e00\u4e2a\u542f\u52a8\u7c7b\u8fdb\u884c\u6d4b\u8bd5",level:3}
1,{value:"3.2 \u57fa\u4e8e SSE \u7684 MCP \u5ba2\u6237\u7aef\u5b9e\u73b0",id:"32-\u57fa\u4e8e-sse-\u7684-mcp-\u5ba2\u6237\u7aef\u5b9e\u73b0",level:2},{value:"\u6dfb\u52a0\u4f9d\u8d56",id:"\u6dfb\u52a0\u4f9d\u8d56-3",level:3},{value:"\u914d\u7f6e MCP \u670d\u52a1\u5668",id:"\u914d\u7f6e-mcp-\u670d\u52a1\u5668-1",level:3},{value:"\u4f7f\u7528 MCP Client",id:"\u4f7f\u7528-mcp-client",level:3},{value:"\u6dfb\u52a0\u4f9d\u8d56",id:"\u6dfb\u52a0\u4f9d\u8d56-4",level:2},{value:"\u914d\u7f6e MCP \u670d\u52a1\u5668",id:"\u914d\u7f6e-mcp-\u670d\u52a1\u5668-2",level:3},{value:"\u4f7f\u7528 MCP \u5de5\u5177",id:"\u4f7f\u7528-mcp-\u5de5\u5177",level:3},{value:"\u6d4b\u8bd5\u6548\u679c",id:"\u6d4b\u8bd5\u6548\u679c",level:3}];function d(n){const e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...n.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.p,{children:"\u672c\u6587\u4f5c\u8005\uff1a\u590f\u51ac\uff0cSpring AI Alibaba Contributor\u3002"}),"\n",(0,a.jsxs)(e.ol,{children:["\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:"MCP \u57fa\u7840\u4e0e\u5feb\u901f\u4f53\u9a8c\uff08\u719f\u6089\u7684\u8bfb\u8005\u53ef\u4ee5\u8df3\u8fc7\u6b64\u90e8\u5206\uff09"}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:"\u5982\u4f55\u5c06\u81ea\u5df1\u5f00\u53d1\u7684 Spring \u5e94\u7528\u53d1\u5e03\u4e3a MCP Server\uff0c\u9a8c\u8bc1\u4f7f\u7528 Claude \u6216 Spring \u5e94\u7528\u4f5c\u4e3a\u5ba2\u6237\u7aef\u63a5\u5165\u81ea\u5df1\u53d1\u5e03\u7684 Java MCP Server\u3002"}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"\u53d1\u5e03 stdio \u6a21\u5f0f\u7684 MCP Server"}),"\n",(0,a.jsx)(e.li,{children:"\u53d1\u5e03 SSE \u6a21\u5f0f\u7684 MCP Server"}),"\n",(0,a.jsx)(e.li,{children:"\u5f00\u53d1\u53e6\u4e00\u4e2a Spring \u5e94\u7528\u4f5c\u4e3a MCP Client \u8c03\u7528 MCP Server \u670d\u52a1"}),"\n",(0,a.jsx)(e.li,{children:"\u4f7f\u7528 Claude \u684c\u9762\u5e94\u7528\u63a5\u5165\u6211\u4eec\u7684 Java MCP Server"}),"\n"]}),"\n",(0,a.jsxs)(e.ol,{start:"3",children:["\n",(0,a.jsx)(e.li,{children:"\u5982\u4f55\u4f7f\u7528\u81ea\u5df1\u5f00\u53d1\u7684 Spring \u5e94\u7528\u8c03\u7528 MCP Server\uff0c\u5305\u62ec\u8c03\u7528\u81ea\u5df1\u53d1\u5e03\u7684 Java MCP Server\uff0c\u4e5f\u5305\u62ec\u5e02\u9762\u4e0a\u5176\u4ed6\u901a\u7528 MCP Server\u3002"}),"\n"]}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"\u914d\u7f6e\u5e76\u8c03\u7528 stdio \u6a21\u5f0f\u7684 MCP Server"}),"\n",(0,a.jsx)(e.li,{children:"\u914d\u7f6e\u5e76\u8c03\u7528 SSE \u6a21\u5f0f\u7684 MCP Server"}),"\n"]}),"\n",(0,a.jsxs)(e.ol,{start:"4",children:["\n",(0,a.jsx)(e.li,{children:"\u5982\u4f55\u5728 Spring AI Alibaba OpemManus Agent \u6846\u67b6\u4e2d\u4f7f\u7528 MCP Server"}),"\n"]}),"\n",(0,a.jsx)(e.h1,{id:"1\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8baemodel-context-protocol\u5165\u95e8",children:"1\u3001\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff08Model Context Protocol\uff09\u5165\u95e8"}),"\n",(0,a.jsx)(e.p,{children:'2024 \u5e74 11 \u6708\uff0cAnthropic \u516c\u53f8\u641e\u4e86\u4e2a\u633a\u6709\u610f\u601d\u7684\u65b0\u73a9\u610f - Model Context Protocol\uff08\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff09\u7b80\u79f0\u4e3a MCP \u534f\u8bae\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u5b83\u5c31\u662f\u7ed9 AI \u548c\u5404\u7c7b\u5de5\u5177\u6570\u636e\u4e4b\u95f4\u642d\u4e86\u4e2a\u6807\u51c6\u5316\u7684"\u6865\u6881"\uff0c\u8ba9\u5f00\u53d1\u8005\u4e0d\u7528\u518d\u4e3a\u5bf9\u63a5\u95ee\u9898\u5934\u75bc\u4e86\u3002\u5927\u6a21\u578b\u5e94\u7528\u53ef\u4ee5\u4f7f\u7528\u522b\u4eba\u5206\u4eab\u7684 MCP \u670d\u52a1\u6765\u5b8c\u6210\u5404\u79cd\u5404\u6837\u7684\u5de5\u4f5c\u5185\u5bb9\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u4e9b\u5730\u65b9\u83b7\u53d6 MCP \u670d\u52a1\uff1a'}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"awesome-mcp-servers"}),"\n",(0,a.jsx)(e.li,{children:"mcp.so"}),"\n"]}),"\n",(0,a.jsx)(e.p,{children:"MCP \u534f\u8bae\u5728\u5b9e\u9645\u7684\u5e94\u7528\u573a\u666f\u4e0a\u975e\u5e38\u5e7f\u6cdb\uff0c\u5217\u4e3e\u4e00\u4e9b\u6bd4\u8f83\u5e38\u89c1\u7684\u5e94\u7528\u573a\u666f\uff1a"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"\u4f7f\u7528\u767e\u5ea6/\u9ad8\u5fb7\u5730\u56fe\u5206\u6790\u65c5\u7ebf\u8ba1\u7b97\u65f6\u95f4"}),"\n",(0,a.jsx)(e.li,{children:"\u63a5 Puppeteer \u81ea\u52a8\u64cd\u4f5c\u7f51\u9875"}),"\n",(0,a.jsx)(e.li,{children:"\u4f7f\u7528 Github/Gitlab \u8ba9\u5927\u6a21\u578b\u63a5\u7ba1\u4ee3\u7801\u4ed3\u5e93"}),"\n",(0,a.jsx)(e.li,{children:"\u4f7f\u7528\u6570\u636e\u5e93\u7ec4\u4ef6\u5b8c\u6210\u5bf9 Mysql\u3001ES\u3001Redis \u7b49\u6570\u636e\u5e93\u7684\u64cd\u4f5c"}),"\n",(0,a.jsx)(e.li,{children:"\u4f7f\u7528\u641c\u7d22\u7ec4\u4ef6\u6269\u5c55\u5927\u6a21\u578b\u7684\u6570\u636e\u641c\u7d22\u80fd\u529b"}),"\n"]}),"\n",(0,a.jsx)(e.h2,{id:"11-\u5728-claude-desktop-\u4e2d\u4f53\u9a8c-mcp",children:"1.1 \u5728 Claude Desktop \u4e2d\u4f53\u9a8c MCP"}),"\n",(0,a.jsx)(e.p,{children:"\u63a5\u4e0b\u6765\u6211\u4eec\u4f7f\u7528 Claude \u5feb\u901f\u63a5\u5165 Github \u670d\u52a1\uff08\u63d0\u524d\u7533\u8bf7 token\uff09\uff0c\u7f16\u8f91\u4e00\u4e0b Claude Desktop \u7684\u914d\u7f6e\u6587\u4ef6\uff1a"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["macOS: ",(0,a.jsx)(e.code,{children:"~/Library/Application Support/Claude/claude_desktop_config.json"})]}),"\n",(0,a.jsxs)(e.li,{children:["Windows: ",(0,a.jsx)(e.code,{children:"%APPDATA%\\Claude\\claude_desktop_config.json"})]}),"\n"]}),"\n",(0,a.jsxs)(e.p,{children:["\u6dfb\u52a0\u5982\u4e0b\u5185\u5bb9\uff0c\u6ce8\u610f\u628a",(0,a.jsx)(e.code,{children:"<YOUR_TOKEN>"}),"\u66ff\u6362\u6210\u4f60\u81ea\u5df1\u7533\u8bf7\u7684 token\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "mcpServers": {\n "github": {\n "command": "npx",\n "args": [\n "-y",\n "@modelcontextprotocol/server-github"\n ],\n "env": {\n "GITHUB_PERSONAL_ACCESS_TOKEN": "`"\n }\n }\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"\u91cd\u542fClaude\u4e4b\u540e\uff0c\u53ef\u4ee5\u770b\u5230\u5df2\u7ecf\u52a0\u8f7d\u4e86MCP\u5bf9\u5e94\u7684\u5de5\u5177\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(66352).A+"",width:"1404",height:"356"})}),"\n",(0,a.jsx)(e.p,{children:"\u70b9\u5f00\u4e4b\u540e\u53ef\u4ee5\u770b\u5230\u5177\u4f53\u7684\u5de5\u5177\u5185\u5bb9\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(53995).A+"",width:"882",height:"1280"})}),"\n",(0,a.jsx)(e.p,{children:"\u6b64\u65f6\u6211\u4eec\u5c31\u53ef\u4ee5\u4eab\u53d7 Github \u670d\u52a1\u63d0\u4f9b\u7684\u64cd\u4f5c\u4ed3\u5e93\u7684\u80fd\u529b\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(32866).A+"",width:"1280",height:"899"})}),"\n",(0,a.jsx)(e.p,{children:"\u4ece\u56fe\u4e0a\u53ef\u4ee5\u770b\u5230\uff0c\u901a\u8fc7\u521b\u5efa\u4ed3\u5e93test-mcp\u8fd9\u6837\u7684\u63d0\u793a\u8bcd\uff0cClaude \u7684\u5927\u6a21\u578b\u81ea\u884c\u5224\u65ad\u9700\u8981\u4f7f\u7528 mcp \u4e2d\u63d0\u4f9b\u7684create_repository\u80fd\u529b\uff0c\u4ece\u800c\u5b8c\u6210\u4e86\u4ed3\u5e93\u7684\u521b\u5efa\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u6253\u5f00 Github \u4e5f\u786e\u5b9e\u53d1\u73b0\u4e86\u8fd9\u4e2a\u5df2\u7ecf\u521b\u5efa\u7684\u4ed3\u5e93\u3002"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(20765).A+"",width:"504",height:"296"})}),"\n",(0,a.jsx)(e.p,{children:"\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f\uff0c\u5927\u6a21\u578b\u5c31\u53ef\u4ee5\u5229\u7528MCP\u63a5\u5165\u5404\u5f0f\u5404\u6837\u7684\u80fd\u529b\uff0c\u5b8c\u6210\u5404\u79cd\u66f4\u4e3a\u590d\u6742\u7684\u5de5\u4f5c\u3002"}),"\n",(0,a.jsx)(e.h2,{id:"12-mcp-\u7684\u67b6\u6784",children:"1.2 MCP \u7684\u67b6\u6784"}),"\n",(0,a.jsx)(e.p,{children:"MCP \u4e3b\u8981\u5206\u4e3aMCP\u670d\u52a1\u548cMCP\u5ba2\u6237\u7aef\uff1a"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"\u5ba2\u6237\u7aef\uff1a\u4e00\u822c\u6307\u7684\u662f\u5927\u6a21\u578b\u5e94\u7528\uff0c\u6bd4\u5982 Claude\u3001\u901a\u8fc7 Spring AI Alibaba\u3001Langchain \u7b49\u6846\u67b6\u5f00\u53d1\u7684 AI \u5e94\u7528"}),"\n",(0,a.jsx)(e.li,{children:"\u670d\u52a1\u7aef\uff1a\u8fde\u63a5\u5404\u79cd\u6570\u636e\u6e90\u7684\u670d\u52a1\u548c\u5de5\u5177"}),"\n"]}),"\n",(0,a.jsx)(e.p,{children:"\u6574\u4f53\u67b6\u6784\u5982\u4e0b\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(4084).A+"",width:"1280",height:"893"})}),"\n",(0,a.jsx)(e.p,{children:"\u6574\u4f53\u7684\u5de5\u4f5c\u6d41\u7a0b\u662f\u8fd9\u6837\u7684\uff1aAI \u5e94\u7528\u4e2d\u96c6\u62
110MCP\u5ba2\u6237\u7aef\uff0c\u901a\u8fc7MCP\u534f\u8bae\u5411MCP\u670d\u52a1\u7aef\u53d1\u8d77\u8bf7\u6c42\uff0cMCP \u670d\u52a1\u7aef\u53ef\u4ee5\u8fde\u63a5\u672c\u5730/\u8fdc\u7a0b\u7684\u6570\u636e\u6e90\uff0c\u6216\u8005\u901a\u8fc7 API \u8bbf\u95ee\u5176\u4ed6\u670d\u52a1\uff0c\u4ece\u800c\u5b8c\u6210\u6570\u636e\u7684\u83b7\u53d6\uff0c\u8fd4\u56de\u7ed9 AI \u5e94\u7528\u53bb\u4f7f\u7528\u3002"}),"\n",(0,a.jsx)(e.h1,{id:"2\u5728-spring-ai-\u4e2d\u4f7f\u7528-mcp-server",children:"2\u3001\u5728 Spring AI \u4e2d\u4f7f\u7528 Mcp Server"}),"\n",(0,a.jsx)(e.h2,{id:"21-spring-ai-mcp-\u7684\u4ecb\u7ecd",children:"2.1 Spring AI MCP \u7684\u4ecb\u7ecd"}),"\n",(0,a.jsx)(e.p,{children:"Spring AI MCP \u4e3a\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\u63d0\u4f9b Java \u548c Spring \u6846\u67b6\u96c6\u6210\u3002\u5b83\u4f7f Spring AI \u5e94\u7528\u7a0b\u5e8f\u80fd\u591f\u901a\u8fc7\u6807\u51c6\u5316\u7684\u63a5\u53e3\u4e0e\u4e0d\u540c\u7684\u6570\u636e\u6e90\u548c\u5de5\u5177\u8fdb\u884c\u4ea4\u4e92\uff0c\u652f\u6301\u540c\u6b65\u548c\u5f02\u6b65\u901a\u4fe1\u6a21\u5f0f\u3002\u6574\u4f53\u67b6\u6784\u5982\u4e0b\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(78575).A+"",width:"1280",height:"1206"})}),"\n",(0,a.jsx)(e.p,{children:"Spring AI MCP \u91c7\u7528\u6a21\u5757\u5316\u67b6\u6784\uff0c\u5305\u62ec\u4ee5\u4e0b\u7ec4\u4ef6\uff1a"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"Spring AI \u5e94\u7528\u7a0b\u5e8f\uff1a\u4f7f\u7528 Spring AI \u6846\u67b6\u6784\u5efa\u60f3\u8981\u901a\u8fc7 MCP \u8bbf\u95ee\u6570\u636e\u7684\u751f\u6210\u5f0f AI \u5e94\u7528\u7a0b\u5e8f"}),"\n",(0,a.jsx)(e.li,{children:"Spring MCP \u5ba2\u6237\u7aef\uff1aMCP \u534f\u8bae\u7684 Spring AI \u5b9e\u73b0\uff0c\u4e0e\u670d\u52a1\u5668\u4fdd\u6301 1:1 \u8fde\u63a5"}),"\n"]}),"\n",(0,a.jsx)(e.p,{children:"\u901a\u8fc7 Spring AI MCP\uff0c\u53ef\u4ee5\u5feb\u901f\u642d\u5efa MCP \u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u7a0b\u5e8f\u3002"}),"\n",(0,a.jsx)(e.h2,{id:"22-\u4f7f\u7528-spring-ai-mcp-\u5feb\u901f\u642d\u5efa-mcp-server",children:"2.2 \u4f7f\u7528 Spring AI MCP \u5feb\u901f\u642d\u5efa MCP Server"}),"\n",(0,a.jsx)(e.p,{children:"Spring AI \u63d0\u4f9b\u4e86\u4e24\u79cd\u673a\u5236\u5feb\u901f\u642d\u5efa MCP Server\uff0c\u901a\u8fc7\u8fd9\u4e24\u79cd\u65b9\u5f0f\u5f00\u53d1\u8005\u53ef\u4ee5\u5feb\u901f\u5411 AI \u5e94\u7528\u5f00\u653e\u81ea\u8eab\u7684\u80fd\u529b\uff0c\u8fd9\u4e24\u79cd\u673a\u5236\u5982\u4e0b\uff1a"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"\u57fa\u4e8e stdio \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u4f20\u8f93\uff0c\u4ee5\u72ec\u7acb\u7684\u8fdb\u7a0b\u8fd0\u884c\u5728 AI \u5e94\u7528\u672c\u5730\uff0c\u9002\u7528\u4e8e\u6bd4\u8f83\u8f7b\u91cf\u7ea7\u7684\u5de5\u5177\u3002"}),"\n",(0,a.jsx)(e.li,{children:"\u57fa\u4e8e SSE\uff08Server-Sent Events\uff09 \u8fdb\u884c\u8fdc\u7a0b\u670d\u52a1\u8bbf\u95ee\uff0c\u9700\u8981\u5c06\u670d\u52a1\u5355\u72ec\u90e8\u7f72\uff0c\u5ba2\u6237\u7aef\u901a\u8fc7\u670d\u52a1\u7aef\u7684 URL \u8fdb\u884c\u8fdc\u7a0b\u8bbf\u95ee\uff0c\u9002\u7528\u4e8e\u6bd4\u8f83\u91cd\u91cf\u7ea7\u7684\u5de5\u5177\u3002"}),"\n"]}),"\n",(0,a.jsxs)(e.p,{children:["\u63a5\u4e0b\u6765\u9010\u4e00\u4ecb\u7ecd\u4e00\u4e0b\u8fd9\u4e24\u79cd\u65b9\u5f0f\u7684\u5b9e\u73b0\uff0c\u793a\u4f8b\u4ee3\u7801\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u94fe\u63a5\u83b7\u53d6\uff1a",(0,a.jsx)(e.a,{href:"https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/server",children:"https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/server"})]}),"\n",(0,a.jsx)(e.h3,{id:"221-\u57fa\u4e8e-stdio-\u7684-mcp-\u670d\u52a1\u7aef\u5b9e\u73b0",children:"2.2.1 \u57fa\u4e8e stdio \u7684 MCP \u670d\u52a1\u7aef\u5b9e\u73b0"}),"\n",(0,a.jsx)(e.p,{children:"\u57fa\u4e8e stdio \u7684 MCP \u670d\u52a1\u7aef\u901a\u8fc7\u6807\u51c6\u8f93\u5165\u8f93\u51fa\u6d41\u4e0e\u5ba2\u6237\u7aef\u901a\u4fe1\uff0c\u9002\u7528\u4e8e\u4f5c\u4e3a\u5b50\u8fdb\u7a0b\u88ab\u5ba2\u6237\u7aef\u542f\u52a8\u548c\u7ba1\u7406\u7684\u573a\u666f\u3002"}),"\n",(0,a.jsx)(e.h4,{id:"\u6dfb\u52a0\u4f9d\u8d56",children:"\u6dfb\u52a0\u4f9d\u8d56"}),"\n",(0,a.jsx)(e.p,{children:"\u9996\u5148\uff0c\u5728\u9879\u76ee\u4e2d\u6dfb\u52a0 Spring AI MCP Server Starter \u4f9d\u8d56\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-xml",children:"<dependency>\n <groupId>org.springframework.ai</groupId>\n <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>\n</dependency>\n"})}),"\n",(0,a.jsx)(e.h4,{id:"\u914d\u7f6e-mcp-\u670d\u52a1\u7aef",children:"\u914d\u7f6e MCP \u670d\u52a1\u7aef"}),"\n",(0,a.jsxs)(e.p,{children:["\u5728",(0,a.jsx)(e.code,{children:"application.yml"}),"\u4e2d\u914d\u7f6e MCP \u670d\u52a1\u7aef\uff0c\u8fd9\u6b21\u8981\u5b9e\u73b0\u7684\u662f\u4e00\u4e2a\u5929\u6c14\u670d\u52a1\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-yaml",children:"spring:\n main:\n web-application-type: none # \u5fc5\u987b\u7981\u7528web\u5e94\u7528\u7c7b\u578b\n banner-mode: off # \u7981\u7528banner\n ai:\n mcp:\n server:\n stdio: true # \u542f\u7528stdio\u6a21\u5f0f\n name: my-weather-server # \u670d\u52a1\u5668\u540d\u79f0\n version: 0.0.1 # \u670d\u52a1\u5668\u7248\u672c\n"})}),"\n",(0,a.jsx)(e.h4,{id:"\u5b9e\u73b0-mcp-\u5de5\u5177",children:"\u5b9e\u73b0 MCP \u5de5\u5177"}),"\n",(0,a.jsxs)(e.p,{children:["\u4f7f\u7528",(0,a.jsx)(e.code,{children:"@Tool"}),"\u6ce8\u89e3\u6807\u8bb0\u65b9\u6cd5\uff0c\u4f7f\u5176\u53ef\u4ee5\u88ab MCP \u5ba2\u6237\u7aef\u53d1\u73b0\u548c\u8c03\u7528\uff0c\u901a\u8fc7",(0,a.jsx)(e.code,{children:"@ToolParameter"}),"\u6ce8\u89e3\u5de5\u5177\u7684\u5177\u4f53\u53c2\u6570\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:'@Service\npublic class OpenMeteoService {\n\n private final WebClient webClient;
1\n\n public OpenMeteoService(WebClient.Builder webClientBuilder) {\n this.webClient = webClientBuilder\n .baseUrl("https://api.open-meteo.com/v1")\n .build();\n }\n\n @Tool(description = "\u6839\u636e\u7ecf\u7eac\u5ea6\u83b7\u53d6\u5929\u6c14\u9884\u62a5")\n public String getWeatherForecastByLocation(\n @ToolParameter(description = "\u7eac\u5ea6\uff0c\u4f8b\u5982\uff1a39.9042") String latitude,\n @ToolParameter(description = "\u7ecf\u5ea6\uff0c\u4f8b\u5982\uff1a116.4074") String longitude) {\n\n try {\n String response = webClient.get()\n .uri(uriBuilder -> uriBuilder\n .path("/forecast")\n .queryParam("latitude", latitude)\n .queryParam("longitude", longitude)\n .queryParam("current", "temperature_2m,wind_speed_10m")\n .queryParam("timezone", "auto")\n .build())\n .retrieve()\n .bodyToMono(String.class)\n .block();\n\n // \u89e3\u6790\u54cd\u5e94\u5e76\u8fd4\u56de\u683c\u5f0f\u5316\u7684\u5929\u6c14\u4fe1\u606f\n // \u8fd9\u91cc\u7b80\u5316\u5904\u7406\uff0c\u5b9e\u9645\u5e94\u7528\u4e2d\u5e94\u8be5\u89e3\u6790JSON\n return "\u5f53\u524d\u4f4d\u7f6e\uff08\u7eac\u5ea6\uff1a" + latitude + "\uff0c\u7ecf\u5ea6\uff1a" + longitude + "\uff09\u7684\u5929\u6c14\u4fe1\u606f\uff1a\\n" + response;\n } catch (Exception e) {\n return "\u83b7\u53d6\u5929\u6c14\u4fe1\u606f\u5931\u8d25\uff1a" + e.getMessage();\n }\n }\n\n @Tool(description = "\u6839\u636e\u7ecf\u7eac\u5ea6\u83b7\u53d6\u7a7a\u6c14\u8d28\u91cf\u4fe1\u606f")\n public String getAirQuality(\n @ToolParameter(description = "\u7eac\u5ea6\uff0c\u4f8b\u5982\uff1a39.9042") String latitude,\n @ToolParameter(description = "\u7ecf\u5ea6\uff0c\u4f8b\u5982\uff1a116.4074") String longitude) {\n\n // \u6a21\u62df\u6570\u636e\uff0c\u5b9e\u9645\u5e94\u7528\u4e2d\u5e94\u8c03\u7528\u771f\u5b9eAPI\n return "\u5f53\u524d\u4f4d\u7f6e\uff08\u7eac\u5ea6\uff1a" + latitude + "\uff0c\u7ecf\u5ea6\uff1a" + longitude + "\uff09\u7684\u7a7a\u6c14\u8d28\u91cf\uff1a\\n" +\n "- PM2.5: 15 \u03bcg/m\xb3 (\u4f18)\\n" +\n "- PM10: 28 \u03bcg/m\xb3 (\u826f)\\n" +\n "- \u7a7a\u6c14\u8d28\u91cf\u6307\u6570(AQI): 42 (\u4f18)\\n" +\n "- \u4e3b\u8981\u6c61\u67d3\u7269: \u65e0";\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"\u8fd9\u91cc\u4f7f\u7528\u4e86OpenMeteo\uff0c OpenMeteo\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u5929\u6c14 API\uff0c\u4e3a\u975e\u5546\u4e1a\u7528\u9014\u63d0\u4f9b\u514d\u8d39\u8bbf\u95ee\uff0c\u65e0\u9700 API \u5bc6\u94a5\u3002"}),"\n",(0,a.jsx)(e.h4,{id:"\u6ce8\u518c-mcp-\u5de5\u5177",children:"\u6ce8\u518c MCP \u5de5\u5177"}),"\n",(0,a.jsx)(e.p,{children:"\u5728\u5e94\u7528\u7a0b\u5e8f\u5165\u53e3\u7c7b\u4e2d\u6ce8\u518c\u5de5\u5177\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:"@SpringBootApplication\npublic class McpServerApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(McpServerApplication.class, args);\n }\n\n @Bean\n public ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService) {\n return MethodToolCallbackProvider.builder()\n .toolObjects(openMeteoService)\n .build();\n }\n}\n"})}),"\n",(0,a.jsx)(e.h4,{id:"\u8fd0\u884c\u670d\u52a1\u7aef",children:"\u8fd0\u884c\u670d\u52a1\u7aef"}),"\n",(0,a.jsx)(e.p,{children:"\u5728\u63a7\u5236\u53f0\u4e2d\u6267\u884c\u5982\u4e0b\u547d\u4ee4\uff0c\u7f16\u8bd1\u5e76\u6253\u5305\u5e94\u7528\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"mvn clean package -DskipTests\n"})}),"\n",(0,a.jsx)(e.h3,{id:"222-\u57fa\u4e8e-sse-\u7684-mcp-\u670d\u52a1\u7aef\u5b9e\u73b0",children:"2.2.2 \u57fa\u4e8e SSE \u7684 MCP \u670d\u52a1\u7aef\u5b9e\u73b0"}),"\n",(0,a.jsx)(e.p,{children:"\u57fa\u4e8e SSE \u7684 MCP \u670d\u52a1\u7aef\u901a\u8fc7 HTTP \u534f\u8bae\u4e0e\u5ba2\u6237\u7aef\u901a\u4fe1\uff0c\u9002\u7528\u4e8e\u4f5c\u4e3a\u72ec\u7acb\u670d\u52a1\u90e8\u7f72\u7684\u573a\u666f\uff0c\u53ef\u4ee5\u88ab\u591a\u4e2a\u5ba2\u6237\u7aef\u8fdc\u7a0b\u8c03\u7528\uff0c\u5177\u4f53\u505a\u6cd5\u4e0e stdio \u975e\u5e38\u7c7b\u4f3c\u3002"}),"\n",(0,a.jsx)(e.h4,{id:"\u6dfb\u52a0\u4f9d\u8d56-1",children:"\u6dfb\u52a0\u4f9d\u8d56"}),"\n",(0,a.jsx)(e.p,{children:"\u9996\u5148\uff0c\u5728\u60a8\u7684\u9879\u76ee\u4e2d\u6dfb\u52a0 Spring AI MCP Server Starter \u4f9d\u8d56\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-xml",children:"<dependency>\n <groupId>org.springframework.ai</groupId>\n <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId>\n</dependency>\n"})}),"\n",(0,a.jsx)(e.h4,{id:"\u914d\u7f6e-mcp-server",children:"\u914d\u7f6e MCP Server"}),"\n",(0,a.jsxs)(e.p,{children:["\u5728",(0,a.jsx)(e.code,{children:"application.yml"}),"\u4e2d\u914d\u7f6e MCP Server\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-yaml",children:"server:\n port: 8080 # MCP Server \u7aef\u53e3\u914d\u7f6e\n\nspring:\n ai:\n mcp:\n server:\n name: my-weather-server # MCP Server \u540d\u79f0\n version: 0.0.1 # MCP Server \u7248\u672c\u53f7\n"})}),"\n",(0,a.jsx)(e.h4,{id:"\u5b9e\u73b0-mcp-tool",children:"\u5b9e\u73b0 MCP Tool"}),"\n",(0,a.jsx)(e.p,{children:"\u4e0e\u57fa\u4e8e stdio \u7684\u5b9e\u73b0\u5b8c\u5168\u76f8\u540c\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:'@Service\npublic class OpenMeteoService {\n\n private final WebClient webClient;
1\n\n public OpenMeteoService(WebClient.Builder webClientBuilder) {\n this.webClient = webClientBuilder\n .baseUrl("https://api.open-meteo.com/v1")\n .build();\n }\n\n @Tool(description = "\u6839\u636e\u7ecf\u7eac\u5ea6\u83b7\u53d6\u5929\u6c14\u9884\u62a5")\n public String getWeatherForecastByLocation(\n @ToolParameter(description = "\u7eac\u5ea6\uff0c\u4f8b\u5982\uff1a39.9042") String latitude,\n @ToolParameter(description = "\u7ecf\u5ea6\uff0c\u4f8b\u5982\uff1a116.4074") String longitude) {\n\n try {\n String response = webClient.get()\n .uri(uriBuilder -> uriBuilder\n .path("/forecast")\n .queryParam("latitude", latitude)\n .queryParam("longitude", longitude)\n .queryParam("current", "temperature_2m,wind_speed_10m")\n .queryParam("timezone", "auto")\n .build())\n .retrieve()\n .bodyToMono(String.class)\n .block();\n\n // \u89e3\u6790\u54cd\u5e94\u5e76\u8fd4\u56de\u683c\u5f0f\u5316\u7684\u5929\u6c14\u4fe1\u606f\n return "\u5f53\u524d\u4f4d\u7f6e\uff08\u7eac\u5ea6\uff1a" + latitude + "\uff0c\u7ecf\u5ea6\uff1a" + longitude + "\uff09\u7684\u5929\u6c14\u4fe1\u606f\uff1a\\n" + response;\n } catch (Exception e) {\n return "\u83b7\u53d6\u5929\u6c14\u4fe1\u606f\u5931\u8d25\uff1a" + e.getMessage();\n }\n }\n\n @Tool(description = "\u6839\u636e\u7ecf\u7eac\u5ea6\u83b7\u53d6\u7a7a\u6c14\u8d28\u91cf\u4fe1\u606f")\n public String getAirQuality(\n @ToolParameter(description = "\u7eac\u5ea6\uff0c\u4f8b\u5982\uff1a39.9042") String latitude,\n @ToolParameter(description = "\u7ecf\u5ea6\uff0c\u4f8b\u5982\uff1a116.4074") String longitude) {\n\n // \u6a21\u62df\u6570\u636e\uff0c\u5b9e\u9645\u5e94\u7528\u4e2d\u5e94\u8c03\u7528\u771f\u5b9eAPI\n return "\u5f53\u524d\u4f4d\u7f6e\uff08\u7eac\u5ea6\uff1a" + latitude + "\uff0c\u7ecf\u5ea6\uff1a" + longitude + "\uff09\u7684\u7a7a\u6c14\u8d28\u91cf\uff1a\\n" +\n "- PM2.5: 15 \u03bcg/m\xb3 (\u4f18)\\n" +\n "- PM10: 28 \u03bcg/m\xb3 (\u826f)\\n" +\n "- \u7a7a\u6c14\u8d28\u91cf\u6307\u6570(AQI): 42 (\u4f18)\\n" +\n "- \u4e3b\u8981\u6c61\u67d3\u7269: \u65e0";\n }\n}\n'})}),"\n",(0,a.jsx)(e.h4,{id:"\u6ce8\u518c-mcp-\u5de5\u5177-1",children:"\u6ce8\u518c MCP \u5de5\u5177"}),"\n",(0,a.jsx)(e.p,{children:"\u5728\u5e94\u7528\u7a0b\u5e8f\u5165\u53e3\u7c7b\u4e2d\u6ce8\u518c\u5de5\u5177\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:"@SpringBootApplication\npublic class McpServerApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(McpServerApplication.class, args);\n }\n\n @Bean\n public ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService) {\n return MethodToolCallbackProvider.builder()\n .toolObjects(openMeteoService)\n .build();\n }\n\n @Bean\n public WebClient.Builder webClientBuilder() {\n return WebClient.builder();\n }\n}\n"})}),"\n",(0,a.jsx)(e.h4,{id:"\u8fd0\u884c\u670d\u52a1\u7aef-1",children:"\u8fd0\u884c\u670d\u52a1\u7aef"}),"\n",(0,a.jsx)(e.p,{children:"\u5728\u63a7\u5236\u53f0\u4e2d\u8f93\u5165\u547d\u4ee4\uff0c\u8fd0\u884c\u670d\u52a1\u7aef\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,a.jsxs)(e.p,{children:["\u670d\u52a1\u7aef\u5c06\u5728 ",(0,a.jsx)(e.a,{href:"http://localhost:8080",children:"http://localhost:8080"})," \u542f\u52a8\u3002"]}),"\n",(0,a.jsx)(e.h2,{id:"23-\u5728-claude-\u4e2d\u6d4b\u8bd5-mcp-\u670d\u52a1",children:"2.3 \u5728 Claude \u4e2d\u6d4b\u8bd5 mcp \u670d\u52a1"}),"\n",(0,a.jsx)(e.p,{children:"\u5728\u4e0a\u4e00\u5c0f\u8282\u4e2d\u6211\u4eec\u7f16\u5199\u5b8c\u4e86 MCP \u670d\u52a1\uff0c\u8fd9\u4e9b\u670d\u52a1\u5230\u5e95\u662f\u5426\u80fd\u6b63\u5e38\u8fd0\u884c\u5462\uff1f\u5728 Claude Desktop \u4e2d\u53ef\u4ee5\u6d4b\u8bd5\u4e00\u4e0b\u3002"}),"\n",(0,a.jsx)(e.p,{children:"\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\uff0c\u6dfb\u52a0weather\u7684\u914d\u7f6e\uff0c\u4e00\u5b9a\u8981\u6ce8\u610f jar \u5305\u7684\u8def\u5f84\u5fc5\u987b\u662f\u5168\u8def\u5f84\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "mcpServers": {\n "github": {\n "command": "npx",\n "args": [\n "-y",\n "@modelcontextprotocol/server-github"\n ],\n "env": {\n "GITHUB_PERSONAL_ACCESS_TOKEN": your token\n }\n },\n "weather": {\n "command": "java",\n "args": [\n "-Dspring.ai.mcp.server.stdio=true",\n "-Dspring.main.web-application-type=none",\n "-Dlogging.pattern.console=",\n "-jar",\n "<\u4fee\u6539\u4e3astdio\u7f16\u8bd1\u4e4b\u540e\u7684jar\u5305\u5168\u8def\u5f84>"\n ],\n "env": {}\n }\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"\u91cd\u542f Claude \u4e4b\u540e\u770b\u5230\uff0c\u6211\u4eec\u7f16\u5199\u7684\u4e24\u4e2a Tool \u5df2\u7ecf\u88ab\u52a0\u8f7d\u8fdb\u6765\u4e86\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(39558).A+"",width:"970",height:"528"})}),"\n",(0,a.jsx)(e.p,{children:"\u8f93\u5165\u63d0\u793a\u8bcd\uff0c\u67e5\u8be2\u4eca\u5929\u5317\u4eac\u7684\u7a7a\u6c14\u8d28\u91cf\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(74753).A+"",width:"1280",height:"599"})}),"\n",(0,a.jsx)(e.p,{children:"Claude \u89e6\u53d1\u4e86\u6211\u4eec\u81ea\u5df1\u7f16\u5199\u7684\u5929\u6c14\u670d\u52a1\uff0c\u5c55\u793a\u4e86\u5b8c\u6574\u7684\u6570\u636e\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(53624).A+"",width:"1280",height:"728"})}),"\n",(0,a.jsx)(e.p,{children:"\u4e0a\u9762\u4f7f\u7528\u4e86 stdio \u7684\u65b9\u5f0f\u5
1728 Claude Desktop \u4e2d\u4f7f\u7528\u6211\u4eec\u81ea\u5df1\u7f16\u5199\u7684 MCP \u670d\u52a1\uff0c\u4f46\u662f\u5f88\u53ef\u60dc Claude Desktop \u4e0d\u652f\u6301\u76f4\u63a5\u901a\u8fc7 SSE \u6a21\u5f0f\u8bbf\u95ee\uff0c\u5fc5\u987b\u4f7f\u7528 mcp-proxy \u4f5c\u4e3a\u4e2d\u4ecb\uff0c\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u4e0d\u518d\u6f14\u793a Claude Desktop \u63a5\u5165 SSE \u6a21\u5f0f\u7684 MCP \u670d\u52a1\u3002"}),"\n",(0,a.jsx)(e.h1,{id:"3\u5728-spring-ai-alibaba-\u4e2d\u96c6\u6210-mcp-client",children:"3\u3001\u5728 Spring AI Alibaba \u4e2d\u96c6\u6210 Mcp Client"}),"\n",(0,a.jsxs)(e.p,{children:["\u5bf9\u4e8e\u5ba2\u6237\u7aef\uff0cSpring AI \u540c\u6837\u63d0\u4f9b\u4e86 stdio \u548c SSE \u4e24\u79cd\u673a\u5236\u5feb\u901f\u96c6\u6210 MCP Server\uff0c\u5206\u522b\u5bf9\u5e94\u5230 MCP Server \u7684 stdio \u548c SSE \u4e24\u79cd\u6a21\u5f0f\uff0c\u53c2\u8003\u4ee3\u7801\u5982\u4e0b\uff1a",(0,a.jsx)(e.a,{href:"https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/client",children:"https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/client"})]}),"\n",(0,a.jsx)(e.h2,{id:"31-\u57fa\u4e8e-stdio-\u7684-mcp-\u5ba2\u6237\u7aef\u5b9e\u73b0",children:"3.1 \u57fa\u4e8e stdio \u7684 MCP \u5ba2\u6237\u7aef\u5b9e\u73b0"}),"\n",(0,a.jsx)(e.p,{children:"\u57fa\u4e8e stdio \u7684\u5b9e\u73b0\u662f\u6700\u5e38\u89c1\u7684 MCP \u5ba2\u6237\u7aef\u5b9e\u73b0\u65b9\u5f0f\uff0c\u5b83\u901a\u8fc7\u6807\u51c6\u8f93\u5165\u8f93\u51fa\u6d41\u4e0e MCP \u670d\u52a1\u5668\u8fdb\u884c\u901a\u4fe1\u3002\u8fd9\u79cd\u65b9\u5f0f\u9002\u7528\u4e8e\u4f7f\u7528\u4e86 stdio \u65b9\u5f0f\u672c\u5730\u90e8\u7f72\u7684 MCP \u670d\u52a1\u5668\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u542f\u52a8 MCP \u670d\u52a1\u5668\u8fdb\u7a0b\u3002"}),"\n",(0,a.jsx)(e.h3,{id:"\u6dfb\u52a0\u4f9d\u8d56-2",children:"\u6dfb\u52a0\u4f9d\u8d56"}),"\n",(0,a.jsx)(e.p,{children:"\u9996\u5148\uff0c\u5728\u9879\u76ee\u4e2d\u6dfb\u52a0 Spring AI MCP starter \u4f9d\u8d56\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-xml",children:"<dependency>\n <groupId>org.springframework.ai</groupId>\n <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>\n</dependency>\n\x3c!-- \u6dfb\u52a0Spring AI MCP starter\u4f9d\u8d56 --\x3e\n<dependency>\n <groupId>org.springframework.ai</groupId>\n <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>\n</dependency>\n"})}),"\n",(0,a.jsx)(e.h3,{id:"\u914d\u7f6e-mcp-\u670d\u52a1\u5668",children:"\u914d\u7f6e MCP \u670d\u52a1\u5668"}),"\n",(0,a.jsxs)(e.p,{children:["\u5728",(0,a.jsx)(e.code,{children:"application.yml"}),"\u4e2d\u914d\u7f6e MCP \u670d\u52a1\u5668\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-yaml",children:"spring:\n ai:\n dashscope:\n # \u914d\u7f6e\u901a\u4e49\u5343\u95eeAPI\u5bc6\u94a5\n api-key: ${DASH_SCOPE_API_KEY}\n mcp:\n client:\n stdio:\n # \u6307\u5b9a MCP Server \u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff08\u63a8\u8350\uff09\n servers-configuration: classpath:/mcp-servers-config.json\n # \u76f4\u63a5\u914d\u7f6e\u793a\u4f8b\uff0c\u548c\u4e0a\u8fb9\u7684\u914d\u5236\u4e8c\u9009\u4e00\n # connections:\n # server1:\n # command: java\n # args:\n # - -jar\n # - /path/to/your/mcp-server.jar\n"})}),"\n",(0,a.jsxs)(e.p,{children:["\u8fd9\u4e2a\u914d\u7f6e\u6587\u4ef6\u8bbe\u7f6e\u4e86 MCP Client \u7684\u57fa\u672c\u914d\u7f6e\uff0c\u5305\u62ec API \u5bc6\u94a5\u548c\u670d\u52a1\u5668\u914d\u7f6e\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u4f60\u4e5f\u53ef\u4ee5\u9009\u62e9\u76f4\u63a5\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u5b9a\u4e49\u670d\u52a1\u5668\u914d\u7f6e\uff0c\u4f46\u662f\u8fd8\u662f\u5efa\u8bae\u4f7f\u7528json\u6587\u4ef6\u7ba1\u7406 mcp \u914d\u7f6e\u3002\u5728",(0,a.jsx)(e.code,{children:"resources"}),"\u76ee\u5f55\u4e0b\u521b\u5efa",(0,a.jsx)(e.code,{children:"mcp-servers-config.json"}),"\u914d\u7f6e\u6587\u4ef6\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "mcpServers": {\n // \u5b9a\u4e49\u540d\u4e3a"weather"\u7684 MCP Server\n "weather": {\n // \u6307\u5b9a\u542f\u52a8\u547d\u4ee4\u4e3ajava\n "command": "java",\n // \u5b9a\u4e49\u542f\u52a8\u53c2\u6570\n "args": [\n "-Dspring.ai.mcp.server.stdio=true",\n "-Dspring.main.web-application-type=none",\n "-jar",\n "<\u4fee\u6539\u4e3astdio\u7f16\u8bd1\u4e4b\u540e\u7684jar\u5305\u5168\u8def\u5f84>"\n ],\n // \u73af\u5883\u53d8\u91cf\u914d\u7f6e\uff08\u53ef\u9009\uff09\n "env": {}\n }\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"\u8fd9\u4e2a JSON \u914d\u7f6e\u6587\u4ef6\u5b9a\u4e49\u4e86 MCP Server \u7684\u8be6\u7ec6\u914d\u7f6e\uff0c\u5305\u62ec\u5982\u4f55\u542f\u52a8 Server \u8fdb\u7a0b\u3001\u9700\u8981\u4f20\u9012\u7684\u53c2\u6570\u4ee5\u53ca\u73af\u5883\u53d8\u91cf\u8bbe\u7f6e\uff0c\u8fd8\u662f\u8981\u6ce8\u610f\u5f15\u7528\u7684 jar \u5305\u5fc5\u987b\u662f\u5168\u8def\u5f84\u3002"}),"\n",(0,a.jsx)(e.h3,{id:"\u7f16\u5199\u4e00\u4e2a\u542f\u52a8\u7c7b\u8fdb\u884c\u6d4b\u8bd5",children:"\u7f16\u5199\u4e00\u4e2a\u542f\u52a8\u7c7b\u8fdb\u884c\u6d4b\u8bd5\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:'@SpringBootApplication\npublic class Application {\n\n public static void main(String[] args) {\n // \u542f\u52a8Spring Boot\u5e94\u7528\n SpringApplication.run(Application.class, args);\n }\n\n @Bean\n public CommandLineRunner predefinedQuestions(\n ChatClient.Bu
1ilder chatClientBuilder,\n ToolCallbackProvider tools,\n ConfigurableApplicationContext context) {\n return args -> {\n // \u6784\u5efaChatClient\u5e76\u6ce8\u5165MCP\u5de5\u5177\n var chatClient = chatClientBuilder\n .defaultTools(tools)\n .build();\n\n // \u5b9a\u4e49\u7528\u6237\u8f93\u5165\n String userInput = "\u5317\u4eac\u7684\u5929\u6c14\u5982\u4f55\uff1f";\n // \u6253\u5370\u95ee\u9898\n System.out.println("\\n>>> QUESTION: " + userInput);\n // \u8c03\u7528LLM\u5e76\u6253\u5370\u54cd\u5e94\n System.out.println("\\n>>> ASSISTANT: " +\n chatClient.prompt(userInput).call().content());\n\n // \u5173\u95ed\u5e94\u7528\u4e0a\u4e0b\u6587\n context.close();\n };\n }\n}\n'})}),"\n",(0,a.jsxs)(e.p,{children:["\u8fd9\u6bb5\u4ee3\u7801\u5c55\u793a\u4e86\u5982\u4f55\u5728 Spring Boot \u5e94\u7528\u4e2d\u4f7f\u7528 MCP Client\u3002\u5b83\u521b\u5efa\u4e86\u4e00\u4e2a\u547d\u4ee4\u884c\u8fd0\u884c\u5668\uff0c\u6784\u5efa\u4e86 ChatClient \u5e76\u6ce8\u5165\u4e86 MCP Tool\uff0c\u7136\u540e\u4f7f\u7528\u8fd9\u4e2a\u5ba2\u6237\u7aef\u53d1\u9001\u67e5\u8be2\u5e76\u83b7\u53d6\u54cd\u5e94\u3002\u5728 Spring AI Alibaba \u4e2d\u4f7f\u7528 Mcp \u5de5\u5177\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u628a",(0,a.jsx)(e.code,{children:"ToolCallbackProvider"}),"\u653e\u5230",(0,a.jsx)(e.code,{children:"chatClientBuilder"}),"\u7684",(0,a.jsx)(e.code,{children:"defaultTools"}),"\u65b9\u6cd5\u4e2d\uff0c\u5c31\u53ef\u4ee5\u81ea\u52a8\u7684\u9002\u914d\u3002"]}),"\n",(0,a.jsx)(e.p,{children:"\u901a\u8fc7\u547d\u4ee4\u542f\u52a8\u7a0b\u5e8f\u8fdb\u884c\u6d4b\u8bd5\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u542f\u52a8\u4e4b\u540e\u663e\u793a\u7ed3\u679c\u4e3a\uff0c\u4ece\u65e5\u5fd7\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u81ea\u5df1\u7f16\u5199\u7684 MCP Server \u88ab\u8c03\u7528\u4e86\uff0c\u8fd4\u56de\u4e86\u6570\u636e\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:'>>> QUESTION: \u5317\u4eac\u7684\u5929\u6c14\u5982\u4f55\uff1f\n2025-03-31T17:56:17.931+08:00 DEBUG 23455 --- [mcp] [pool-1-thread-1] io.modelcontextprotocol.spec.McpSchema : Received JSON message: {"jsonrpc":"2.0","id":"60209de5-3","result":{"content":[{"type":"text","text":"\\"\u5f53\u524d\u5929\u6c14:\\\\n\u6e29\u5ea6: 18.6\xb0C (\u4f53\u611f\u6e29\u5ea6: 15.1\xb0C)\\\\n\u5929\u6c14: \u591a\u4e91\\\\n\u98ce\u5411: \u5357\u98ce (4.7 km/h)\\\\n\u6e7f\u5ea6: 18%\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n\u672a\u6765\u5929\u6c14\u9884\u62a5:\\\\n2025-03-31 (\u5468\u4e00):\\\\n\u6e29\u5ea6: 2.4\xb0C ~ 19.5\xb0C\\\\n\u5929\u6c14: \u591a\u4e91\\\\n\u98ce\u5411: \u5357\u98ce (8.4 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n2025-04-01 (\u5468\u4e8c):\\\\n\u6e29\u5ea6: 7.6\xb0C ~ 20.6\xb0C\\\\n\u5929\u6c14: \u591a\u4e91\\\\n\u98ce\u5411: \u897f\u5317\u98ce (19.1 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n2025-04-02 (\u5468\u4e09):\\\\n\u6e29\u5ea6: 6.9\xb0C ~ 18.4\xb0C\\\\n\u5929\u6c14: \u6674\u6717\\\\n\u98ce\u5411: \u897f\u5317\u98ce (12.8 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n2025-04-03 (\u5468\u56db):\\\\n\u6e29\u5ea6: 7.0\xb0C ~ 19.8\xb0C\\\\n\u5929\u6c14: \u591a\u4e91\\\\n\u98ce\u5411: \u5357\u98ce (16.3 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n2025-04-04 (\u5468\u4e94):\\\\n\u6e29\u5ea6: 7.5\xb0C ~ 21.6\xb0C\\\\n\u5929\u6c14: \u591a\u4e91\\\\n\u98ce\u5411: \u897f\u5317\u98ce (19.6 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n2025-04-05 (\u5468\u516d):\\\\n\u6e29\u5ea6: 5.6\xb0C ~ 20.7\xb0C\\\\n\u5929\u6c14: \u591a\u4e91\\\\n\u98ce\u5411: \u897f\u98ce (16.5 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n2025-04-06 (\u5468\u65e5):\\\\n\u6e29\u5ea6: 8.4\xb0C ~ 22.3\xb0C\\\\n\u5929\u6c14: \u6674\u6717\\\\n\u98ce\u5411: \u5357\u98ce (9.4 km/h)\\\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\\\n\\\\n\\""}],"isError":false}}\n2025-03-31T17:56:17.932+08:00 DEBUG 23455 --- [mcp] [pool-1-thread-1] i.m.spec.McpClientSession : Received Response: JSONRPCResponse[jsonrpc=2.0, id=60209de5-3, result={content=[{type=text, text="\u5f53\u524d\u5929\u6c14:\\n\u6e29\u5ea6: 18.6\xb0C (\u4f53\u611f\u6e29\u5ea6: 15.1\xb0C)\\n\u5929\u6c14: \u591a\u4e91\\
1n\u98ce\u5411: \u5357\u98ce (4.7 km/h)\\n\u6e7f\u5ea6: 18%\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n\u672a\u6765\u5929\u6c14\u9884\u62a5:\\n2025-03-31 (\u5468\u4e00):\\n\u6e29\u5ea6: 2.4\xb0C ~ 19.5\xb0C\\n\u5929\u6c14: \u591a\u4e91\\n\u98ce\u5411: \u5357\u98ce (8.4 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n2025-04-01 (\u5468\u4e8c):\\n\u6e29\u5ea6: 7.6\xb0C ~ 20.6\xb0C\\n\u5929\u6c14: \u591a\u4e91\\n\u98ce\u5411: \u897f\u5317\u98ce (19.1 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n2025-04-02 (\u5468\u4e09):\\n\u6e29\u5ea6: 6.9\xb0C ~ 18.4\xb0C\\n\u5929\u6c14: \u6674\u6717\\n\u98ce\u5411: \u897f\u5317\u98ce (12.8 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n2025-04-03 (\u5468\u56db):\\n\u6e29\u5ea6: 7.0\xb0C ~ 19.8\xb0C\\n\u5929\u6c14: \u591a\u4e91\\n\u98ce\u5411: \u5357\u98ce (16.3 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n2025-04-04 (\u5468\u4e94):\\n\u6e29\u5ea6: 7.5\xb0C ~ 21.6\xb0C\\n\u5929\u6c14: \u591a\u4e91\\n\u98ce\u5411: \u897f\u5317\u98ce (19.6 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n2025-04-05 (\u5468\u516d):\\n\u6e29\u5ea6: 5.6\xb0C ~ 20.7\xb0C\\n\u5929\u6c14: \u591a\u4e91\\n\u98ce\u5411: \u897f\u98ce (16.5 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n2025-04-06 (\u5468\u65e5):\\n\u6e29\u5ea6: 8.4\xb0C ~ 22.3\xb0C\\n\u5929\u6c14: \u6674\u6717\\n\u98ce\u5411: \u5357\u98ce (9.4 km/h)\\n\u964d\u6c34\u91cf: 0.0 \u6beb\u7c73\\n\\n"}], isError=false}, error=null]\n'})}),"\n",(0,a.jsx)(e.h2,{id:"32-\u57fa\u4e8e-sse-\u7684-mcp-\u5ba2\u6237\u7aef\u5b9e\u73b0",children:"3.2 \u57fa\u4e8e SSE \u7684 MCP \u5ba2\u6237\u7aef\u5b9e\u73b0"}),"\n",(0,a.jsx)(e.p,{children:"\u9664\u4e86\u57fa\u4e8e stdio \u7684\u5b9e\u73b0\u5916\uff0cSpring AI Alibaba \u8fd8\u63d0\u4f9b\u4e86\u57fa\u4e8e Server-Sent Events \uff08SSE\uff09\u7684 MCP \u5ba2\u6237\u7aef\u5b9e\u73b0\u3002\u8fd9\u79cd\u65b9\u5f0f\u9002\u7528\u4e8e\u8fdc\u7a0b\u90e8\u7f72\u7684 MCP \u670d\u52a1\u5668\uff0c\u53ef\u4ee5\u901a\u8fc7 HTTP \u534f\u8bae\u4e0e MCP \u670d\u52a1\u5668\u8fdb\u884c\u901a\u4fe1\u3002"}),"\n",(0,a.jsx)(e.h3,{id:"\u6dfb\u52a0\u4f9d\u8d56-3",children:"\u6dfb\u52a0\u4f9d\u8d56"}),"\n",(0,a.jsx)(e.p,{children:"\u9996\u5148\uff0c\u5728\u60a8\u7684\u9879\u76ee\u4e2d\u6dfb\u52a0 Spring AI MCP Client Starter \u4f9d\u8d56\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-xml",children:"<dependency>\n <groupId>org.springframework.ai</groupId>\n <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId>\n</dependency>\n"})}),"\n",(0,a.jsx)(e.h3,{id:"\u914d\u7f6e-mcp-\u670d\u52a1\u5668-1",children:"\u914d\u7f6e MCP \u670d\u52a1\u5668"}),"\n",(0,a.jsxs)(e.p,{children:["\u5728",(0,a.jsx)(e.code,{children:"application.yml"}),"\u4e2d\u914d\u7f6e MCP Server\uff0c\u8fd9\u91cc\u9700\u8981\u6307\u5b9a SSE \u542f\u52a8\u7684\u670d\u52a1\u5730\u5740\uff0c\u4e4b\u524d\u6211\u4eec\u5728 8080 \u7aef\u53e3\u4e0a\u542f\u52a8\u4e86\u5bf9\u5e94\u7684\u670d\u52a1\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-yaml",children:"spring:\n ai:\n dashscope:\n api-key: ${DASH_SCOPE_API_KEY}\n mcp:\n client:\n sse:\n connections:\n server1:\n url: http://localhost:8080 #\u670d\u52a1\u5730\u5740\n"})}),"\n",(0,a.jsx)(e.h3,{id:"\u4f7f\u7528-mcp-client",children:"\u4f7f\u7528 MCP Client"}),"\n",(0,a.jsxs)(e.p,{children:["\u4f7f\u7528\u65b9\u5f0f\u4e0e\u57fa\u4e8e stdio \u7684\u5b9e\u73b0\u76f8\u540c\uff0c\u53ea\u9700\u6ce8\u5165",(0,a.jsx)(e.code,{children:"ToolCallbackProvider"}),"\u548c",(0,a.jsx)(e.code,{children:"ChatClient.Builder"}),"\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:'@SpringBootApplication\npublic class Application {\n\n public static void main(String[] args) {\n SpringApplication.run(Application.class, args);\n }\n\n @Bean\n public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,\n ToolCallbackProvider tools,\n ConfigurableApplicationContext context) {\n return args -> {\n // \u6784\u5efaChatClient\u5e76\u6ce8\u5165MCP\u5de5\u5177\n var chatClient = chatClientBuilder\n .defaultTools(tools)\n .build();\n\n // \u4f7f\u7528ChatClient\u4e0eLLM\u4ea4\u4e92\n String userInput = "\u5317\u4eac\u7684\u5929\u6c14\u5982\u4f55\uff1f";\n System.out.println("\\n>>> QUESTION: " + userInput);\n System.out.println("\\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());\n\n context.close();\n };\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"\u901a\u8fc7\u547d\u4ee4\u542f\u52a8\u7a0b\u5e8f\u8fdb\u884c\u6d4b\u8bd5\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u542f\u52a8\u4e4b\u540e\u4f1a\u6709\u62a5\u9519\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"Caused by: java.lang.IllegalStateException: Multiple tools with the same name (spring-ai-mcp-client-getWeatherForec
1astByLocation, spring-ai-mcp-client-getAirQuality)\n at org.springframework.ai.mcp.SyncMcpToolCallbackProvider.validateToolCallbacks(SyncMcpToolCallbackProvider.java:126) ~[spring-ai-mcp-1.0.0-20250325.064812-147.jar:1.0.0-SNAPSHOT]\n at org.springframework.ai.mcp.SyncMcpToolCallbackProvider.getToolCallbacks(SyncMcpToolCallbackProvider.java:110) ~[spring-ai-mcp-1.0.0-20250325.064812-147.jar:1.0.0-SNAPSHOT]\n at org.springframework.ai.autoconfigure.mcp.client.McpClientAutoConfiguration.toolCallbacksDeprecated(McpClientAutoConfiguration.java:196) ~[spring-ai-mcp-client-spring-boot-autoconfigure-1.0.0-M6.jar:1.0.0-M6]\n at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]\n at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]\n at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.2.0.jar:6.2.0]\n ... 23 common frames omitted\n"})}),"\n",(0,a.jsxs)(e.p,{children:["\u4ece\u65e5\u5fd7\u4e0a\u5206\u6790\uff0c\u662f\u56e0\u4e3a\u6ce8\u518c\u4e86\u76f8\u540c\u7684\u670d\u52a1\u540d",(0,a.jsx)(e.code,{children:"spring-ai-mcp-client-getWeatherForec
1astByLocation"}),"\u548c",(0,a.jsx)(e.code,{children:"spring-ai-mcp-client-getAirQuality"}),"\uff0c\u4f46\u662f\u4ece\u4ee3\u7801\u4e0a\u5206\u6790\uff0c\u8fd9\u4e24\u4e2a\u670d\u52a1\u6211\u4eec\u90fd\u53ea\u6ce8\u518c\u4e86\u4e00\u6b21\uff0c\u90a3\u4e3a\u4ec0\u4e48\u4f1a\u62a5\u9519\u5462\uff1f"]}),"\n",(0,a.jsxs)(e.p,{children:["\u5176\u5b9e\u8fd9\u662f Spring AI \u76ee\u524d\u7684\u4e00\u4e2a BUG\uff0cSpring AI \u63d0\u4f9b\u4e86\u4e24\u4e2a\u81ea\u52a8\u914d\u7f6e\u7c7b\u53bb\u751f\u6210\u5ba2\u6237\u7aef\u5de5\u5177\u5904\u7406 MCP \u670d\u52a1\u4e2d Tool \u7684\u83b7\u53d6\uff0c\u5206\u522b\u662f",(0,a.jsx)(e.code,{children:"SseHttpClientTransportAutoConfiguration"}),"\u548c",(0,a.jsx)(e.code,{children:"SseWebFluxTransportAutoConfiguration"}),"\u3002\u8fd9\u4e24\u4e2a\u81ea\u52a8\u914d\u7f6e\u7c7b\u63d0\u4f9b\u4e86\u540c\u6b65\u548c\u5f02\u6b65\u4e24\u79cd\u65b9\u5f0f\uff0c\u672c\u8eab\u5e94\u8be5\u662f\u4e92\u65a5\u7684\uff0c\u4f46\u662f Spring AI \u5bf9\u4e8e\u4e92\u65a5\u7684\u5904\u7406\u4e0a\u51fa\u4e86\u95ee\u9898\uff0c\u5bfc\u81f4\u4e24\u4e2a\u81ea\u52a8\u914d\u7f6e\u7c7b\u90fd\u4f1a\u52a0\u8f7d\u3002"]}),"\n",(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.code,{children:"SseWebFluxTransportAutoConfiguration"}),"\u7684\u52a0\u8f7d\uff1a"]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(79090).A+"",width:"1280",height:"406"})}),"\n",(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.code,{children:"SseHttpClientTransportAutoConfiguration"}),"\u7684\u52a0\u8f7d\uff1a"]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(93307).A+"",width:"1280",height:"487"})}),"\n",(0,a.jsxs)(e.p,{children:["\u4e24\u4e2a\u81ea\u52a8\u914d\u7f6e\u7c7b\u52a0\u8f7d\u4e4b\u540e\uff0c\u5c31\u4f1a\u5411\u63d0\u4f9b SSE \u670d\u52a1\u7684 MCP \u670d\u52a1\u7533\u8bf7 Tool\uff0c\u8fd9\u6837\u5c31\u5bfc\u81f4\u540c\u6837\u7684 Tool \u88ab\u7533\u8bf7\u4e86\u4e24\u6b21\uff0c\u81ea\u7136\u5c31\u4f1a\u91cd\u590d\u4e86\u3002\u89e3\u51b3\u65b9\u6848\u4e5f\u975e\u5e38\u7b80\u5355\uff0c\u5728\u542f\u52a8\u7c7b\u4e0a\u6392\u9664",(0,a.jsx)(e.code,{children:"SseHttpClientTransportAutoConfiguration"}),"\u5b9e\u73b0\u5c31\u53ef\u4ee5\u4e86\u3002"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:"@SpringBootApplication(exclude = {\n org.springframework.ai.autoconfigure.mcp.client.SseHttpClientTransportAutoConfiguration.class\n})\npublic class Application {\n...\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u518d\u6b21\u901a\u8fc7\u547d\u4ee4\u542f\u52a8\u7a0b\u5e8f\u8fdb\u884c\u6d4b\u8bd5\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u8fd9\u4e00\u6b21\u5c31\u8f93\u51fa\u4e86\u6b63\u786e\u7684\u7ed3\u679c\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(14976).A+"",width:"730",height:"342"})}),"\n",(0,a.jsx)(e.h1,{id:"4\u5728-spring-ai-alibaba-\u7684-open-manus-\u4e2d\u4f53\u9a8c-mcp",children:"4\u3001\u5728 Spring AI Alibaba \u7684 Open Manus \u4e2d\u4f53\u9a8c MCP"}),"\n",(0,a.jsx)(e.p,{children:"Spring AI Alibaba \u4e2d\u63d0\u4f9b\u4e86 Open Manus \u7684\u5b9e\u73b0\uff0c\u6574\u4f53\u67b6\u6784\u5982\u4e0b\uff1a"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(61174).A+"",width:"1056",height:"1280"})}),"\n",(0,a.jsx)(e.p,{children:"\u5728\u6267\u884c\u9636\u6bb5\uff0c\u4f1a\u8c03\u7528\u5404\u79cd Tool \u6765\u5b8c\u6210\u4efb\u52a1\uff0c\u5982\u679c\u6211\u4eec\u80fd\u4f7f\u7528 MCP \u589e\u52a0 Tool \u7684\u80fd\u529b\uff0c\u90a3\u52bf\u5fc5\u80fd Open Manus \u5982\u864e\u6dfb\u7ffc\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u6765\u770b\u4e00\u4e0b Open Manus \u4e2d\u662f\u5982\u4f55\u53bb\u4f7f\u7528 MCP \u7684\u3002"}),"\n",(0,a.jsxs)(e.p,{children:["\u6e90\u4ee3\u7801\u5982\u4e0b\uff1a",(0,a.jsx)(e.a,{href:"https://github.com/alibaba/spring-ai-alibaba/tree/main/community/openmanus",children:"https://github.com/alibaba/spring-ai-alibaba/tree/main/community/openmanus"})]}),"\n",(0,a.jsx)(e.h2,{id:"\u6dfb\u52a0\u4f9d\u8d56-4",children:"\u6dfb\u52a0\u4f9d\u8d56"}),"\n",(0,a.jsx)(e.p,{children:"\u9996\u5148\uff0c\u5728\u9879\u76ee\u4e2d\u6dfb\u52a0 Spring AI MCP starter \u4f9d\u8d56\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-xml",children:"<dependency>\n <groupId>org.springframework.ai</groupId>\n <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>\n <version>${spring-ai.version}</version>\n</dependency>\n"})}),"\n",(0,a.jsx)(e.h3,{id:"\u914d\u7f6e-mcp-\u670d\u52a1\u5668-2",children:"\u914d\u7f6e MCP \u670d\u52a1\u5668"}),"\n",(0,a.jsxs)(e.p,{children:["\u5728",(0,a.jsx)(e.code,{children:"application.yml"}),"\u4e2d\u5df2\u7ecf\u914d\u7f6e\u4e86 MCP \u670d\u52a1\u5668\uff0c\u8bbe\u7f6e\u5ba2\u6237\u7aef\u8bf7\u6c42\u670d\u52a1\u7aef\u7684\u8d85\u65f6\u65f6\u95f4\u4e3a 1 \u5206\u949f\uff1a"]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"spring-ai-alibaba-mcp",src:i(69974).A+"",width:"1280",height:"281"})}),"\n",(0,a.jsxs)(e.p,{children:["\u6dfb\u52a0",(0,a.jsx)(e.code,{children:"mcp-servers-config.json"}),"\uff0c\u5728 json \u4e2d\u914d\u7f6e\u4e86\u767e\u5ea6\u5730\u56fe\u3002\u767e\u5ea6\u5730\u56fe\u6838\u5fc3 API \u73b0\u5df2\u5168\u9762\u517c\u5bb9 MCP \u534f\u8bae\uff0c\u662f\u56fd\u5185\u9996\u5bb6\u517c\u5bb9 MCP \u534f\u8bae\u7684\u5730\u56fe\u670d\u52a1\u5546\u3002\u767e\u5ea6\u5730\u56fe\u5df2\u7ecf\u5b8c\u6210\u4e86 8 \u4e2a\u6838\u5fc3 API \u63a5\u53e3\u548c MCP \u534f\u8bae\u7684\u5bf9\u63a5\uff0c \u6db5\u76d6\u9006\u5730\u7406\u7f16\u7801\u3001\u5730\u70b9\u68c0\u7d22\u3001\u8def\u7ebf\u89c4\u5212\u7b49\u3002"]}),"\n",(0,a.jsxs)(e.p,{children:["\u4f7f\u7528\u767e\u5ea6\u5730\u56fe\u7684 MCP\uff0c\u9700\u8981\u7533\u8bf7ak\uff1a",(0,a.jsx)(e.a,{href:"https://lbsyun.baidu.com/apiconsole/key%E3%80%82",children:"https://lbsyun.baidu.com/apiconsole/key\u3002"})]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "mcpServers": {\n "baidu-map": {\n "command": "npx",\n "args": [\n "-y",\n "@baidumap/mcp-server-baidu-map"\n ],\n "env": {\n "BAIDU_MAP_API_KEY": "your_baidu_AK"\n }\n }\n }\n}\n'})}),"\n",(0,a.jsxs)(e.p,{children:["\u5c06\u5176\u4e2d",(0,a.jsx)(e.code,{children:"BAIDU_MAP_API_KEY"}),"\u4fee\u6539\u4e3a\u7533\u8bf7\u7684ak\u3002"]}),"\n",(0,a.jsx)(e.h3,{id:"\u4f7f\u7528-mcp-\u5de5\u5177",children:"\u4f7f\u7528 MCP \u5de5\u5177"}),"\n",(0,a.jsxs)(e.p,{children:["\u4fee\u6539",(0,a.jsx)(e.code,{children:"LlmService"}),"\u7684\u6784\u9020\u65b9\u6cd5\u6e90\u7801\uff0c\u5728\u6784\u9020\u65f6\u76f4\u63a5\u901a\u8fc7 Spring \u5bb9\u5668\u83b7\u53d6",(0,a.jsx)(e.code,{children:"ToolCallbackProvider"}),"\u5e76\u52a0\u5165\u5230",(0,a.jsx)(e.code,{children:"ChatClient.builder"}),"\u4e2d\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-java",children:"public LlmService(ChatModel chatModel, ToolCallbackProvider toolCallbackProvider) {\n this.chatModel = chatModel;\n\n this.planningChatClient = ChatClient.builder(chatModel)\n .defaultSystem(PLANNING_SYSTEM_PROMPT)\n .defaultAdvisors(new MessageChatMemoryAdvisor(planningMemory))\n .defaultAdvisors(new SimpleLoggerAdvisor())\n .defaultTools(ToolBuilder.getPlanningAgentToolCallbacks())\n .defaultTools(toolCallbackProvider)\n .build();\n\n this.chatClient = ChatClient.builder(chatModel)\n .defaultSystem(MANUS_SYSTEM_PROMPT)\n .defaultAdvisors(new MessageChatMemoryAdvisor(memory))\n .defaultAdvisors(new SimpleLoggerAdvisor())\n .defaultTools(ToolBuilder.getManusAgentToolCalls())\n .defaultTools(toolCallbackProvider)\n .defaultOptions(OpenAiChatOptions.builder().internalToolExecutionEnabled(false).build())\n .build();\n\n this.finalizeChatClient = ChatClient.builder(chatModel)\n .defaultSystem(FINALIZE_SYSTEM_PROMPT)\n .defaultAdvisors(new MessageChatMemoryAdvisor(finalizeMemory))\n .defaultAdvisors(new SimpleLoggerAdvisor())\n .build();\n}\n"})}),"\n",(0,a.jsxs)(e.p,{children:["\u901a\u8fc7",(0,a.jsx)(e.code,{children:"defaultTools"}),"\u5c06 mcp \u670d\u52a1\u63d0\u4f9b\u7684 tool \u4ea4\u7ed9",(0,a.jsx)(e.code,{children:"ChatClient"}),"\u5904\u7406\u3002"]}),"\n",(0,a.jsx)(e.h3,{id:"\u6d4b\u8bd5\u6548\u679c",children:"\u6d4b\u8bd5\u6548\u679c"}),"\n",(0,a.jsx)(e.p,{children:"\u542f\u52a8 OpenManus\uff0c\u6267\u884c\u63d0\u793a\u8bcd\uff1a \u89c4\u5212\u4e0b\u4ece\u4e0a\u6d77\u5230\u5317\u4eac\u7684\u8def\u7ebf\u3002\u4f46\u662f\u5982\u679c\u8fd9\u6837\u5199\uff0c\u53ef\u80fd\u4f1a\u89e6\u53d1google search\uff0c\u6211\u4eec\u53ef\u4ee5\u4f18\u5316\u4e0b\u63d0\u793a\u8bcd\u4e3b\u52a8\u9009\u62e9\u767e\u5ea6\u5730\u56fe\u3002"}),"\n",(0,a.jsx)(e.p,{children:"\u4f7f\u7528\u767e\u5ea6\u5730\u56fe\u89c4\u5212\u4ece\u5317\u4eac\u5e02\u5230\u4e0a\u6d77\u5e02\u7684\u8def\u7ebf"}),"\n",(0,a.jsx)(e.p,{children:"\u6267\u884c\u7a0b\u5e8f\u4e4b\u540e\u53ef\u4ee5\u770b\u5230\u89c4\u5212\u4e4b\u540e\u7684\u8ba1\u5212\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"Steps:\n0. [ ] [MANUS] \u4f7f\u7528\u767e\u5ea6\u5730\u56fe\u7684\u5730\u7406\u7f16\u7801\u670d\u52a1\u83b7\u53d6\u5317\u4eac\u5e02\u548c\u4e0a\u6d77\u5e02\u7684\u7ecf\u7eac\u5ea6\u5750\u6807\n1. [ ] [MANUS] \u4f7f\u7528\u767e\u5ea6\u5730\u56fe\u7684\u8def\u7ebf\u89c4\u5212\u670d\u52a1\u8ba1\u7b97\u4ece\u5317\u4eac\u5e02\u5230\u4e0a\u6d77\u5e02\u7684\u9a7e\u8f66\u8def\u7ebf\n2. [ ] [MANUS] \u5206\u6790\u5e76\u63d0\u4f9b\u6700\u7ec8\u7684\u8def\u7ebf\u4fe1\u606f\uff0c\u5305\u62ec\u8ddd\u79bb\u3001\u9884\u8ba1\u8017\u65f6\u7b49\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u5f88\u663e\u7136\uff0c\u8fd9\u4e00\u6b21 OpenManus \u9009\u62e9\u4e86\u6211\u4eec\u96c6\u62
110\u7684\u767e\u5ea6\u5730\u56fe mcp server\uff0c\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u7ed3\u679c\u3002"}),"\n",(0,a.jsx)(e.p,{children:"\u83b7\u53d6\u5230\u4e86\u5317\u4eac\u5e02\u548c\u4e0a\u6d77\u5e02\u7684\u7ecf\u7eac\u5ea6\u5750\u6807\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"Here is a summary of what we accomplished in this step:\n- For Beijing, we received the coordinates: Longitude (lng): 116.4133836971231, Latitude (lat): 39.910924547299565.\n- For Shanghai, we received the coordinates: Longitude (lng): 121.48053886017651, Latitude (lat): 31.235929042252014.\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u8ba1\u7b97\u4ece\u5317\u4eac\u5e02\u5230\u4e0a\u6d77\u5e02\u7684\u9a7e\u8f66\u8def\u7ebf\uff1a"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"Distance: The total distance of the route is 1,223,200 meters (approximately 1,223 kilometers).\nDuration: The estimated travel time is 50,592 seconds (approximately 14 hours and 3 minutes).\n"})}),"\n",(0,a.jsx)(e.p,{children:"\u7ed3\u679c\uff1a\n\u603b\u8ddd\u79bb\uff1a\u7ea61223\u516c\u91cc\n\u9884\u8ba1\u8017\u65f6\uff1a\u7ea612\u5c0f\u65f645\u5206\u949f\n\u4e3b\u8981\u9014\u5f84\uff1a\u4eac\u6caa\u9ad8\u901f\u516c\u8def\uff08G2\uff09"}),"\n",(0,a.jsx)(e.h1,{id:"\u603b\u7ed3",children:"\u603b\u7ed3"}),"\n",(0,a.jsx)(e.p,{children:'\u4f5c\u4e3a AI \u5f00\u53d1\u9886\u57df\u7684\u9769\u547d\u6027\u7a81\u7834\uff0cModel Context Protocol\uff08MCP\uff09\u91cd\u65b0\u5b9a\u4e49\u4e86\u667a\u80fd\u4f53\u4e0e\u5de5\u5177\u751f\u6001\u7684\u4ea4\u4e92\u8303\u5f0f\u3002\u901a\u8fc7\u6807\u51c6\u5316\u534f\u8bae\u6253\u901a\u5730\u56fe\u670d\u52a1\u3001\u4ee3\u7801\u4ed3\u5e93\u3001\u6570\u636e\u5e93\u7b49\u6838\u5fc3\u5de5\u5177\u94fe\uff0cMCP \u4e0d\u4ec5\u89e3\u51b3\u4e86\u4f20\u7edf AI \u5f00\u53d1\u4e2d\u8de8\u5e73\u53f0\u5bf9\u63a5\u7684\u788e\u7247\u5316\u96be\u9898\uff0c\u66f4\u4ee5"\u5f00\u7bb1\u5373\u7528"\u7684\u8f7b\u91cf\u5316\u96c6\u6210\u6a21\u5f0f\uff0c\u8ba9\u5f00\u53d1\u8005\u80fd\u591f\u5feb\u901f\u6784\u5efa\u5177\u5907\u591a\u6a21\u6001\u80fd\u529b\u7684\u667a\u80fd\u5e94\u7528\u3002'}),"\n",(0,a.jsx)(e.p,{children:'\u672a\u6765\uff0c\u968f\u7740\u66f4\u591a\u5de5\u5177\u63a5\u5165 MCP \u751f\u6001\uff0c\u5f00\u53d1\u8005\u53ea\u9700\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u903b\u8f91\u521b\u65b0\uff0c\u800c\u590d\u6742\u7684\u5de5\u5177\u94fe\u6574\u5408\u5c06\u771f\u6b63\u6210\u4e3a"\u770b\u4e0d\u89c1\u7684\u5e95\u5c42\u80fd\u529b"\u2014\u2014\u8fd9\u6216\u8bb8\u6b63\u662f AI \u666e\u60e0\u5316\u8fdb\u7a0b\u4e2d\uff0c\u6700\u5177\u5b9e\u9645\u610f\u4e49\u7684\u6280\u672f\u8dc3\u8fc1\u3002'})]})}function p(n={}){const{wrapper:e}={...(0,l.R)(),...n.components};return e?(0,a.jsx)(e,{...n,children:(0,a.jsx)(d,{...n})}):d(n)}},53624:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/9-d84bc7694783ba4d0687a612630fbc94.png"},53995:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/2-68a0f908dd8e0c2cfc1f1a5c3c8cf6ff.png"},61174:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/13-266cea5f4674a8304f26efc218d7b1e0.jpeg"},66352:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/1-a83b984413e0a374b91a9ce825e21764.png"},69974:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/14-1a7f2f7ff0c3dd893da800eeb2ea6935.png"},74753:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/8-c0cedb923df48ad1393ab5987e4fc806.png"},78575:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/6-242db5cd0db1540d24faa112063ad1b5.png"},79090:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/10-df786dc22c3ee88e2d241b737a2365f8.png"},84823:n=>{n.exports=JSON.parse('{"permalink":"/blog/spring-ai-alibaba-mcp","editUrl":"https://github.com/spring-ai-alibaba/website/tree/main/blog/blog/spring-ai-alibaba-mcp.md","source":"@site/blog/spring-ai-alibaba-mcp.md","title":"Java\u5f00\u53d1\u57fa\u4e8eSpring AI Alibaba\u73a9\u8f6cMCP\uff1a\u4ece\u53d1\u5e03\u3001\u8c03\u7528\u5230 Claude \u96c6\u6210","description":"\u672c\u6587\u8ba8\u8bba\u4e86 2024 \u5e74 11 \u6708 Anthropic \u516c\u53f8\u63a8\u51fa\u7684 MCP \u534f\u8bae\uff0c\u4ecb\u7ecd\u4e86\u5176\u5728 Claude \u81ea\u52a8\u5316\u5230 Spring AI Alibaba \u751f\u6001\u6574\u5408\u4e2d\u7684\u5e94\u7528\uff0c\u5305\u62ec\u67b6\u6784\u3001\u642d\u5efa\u65b9\u6cd5\u53ca\u6d4b\u8bd5\u8fc7\u7a0b\u7b49\u3002","date":"2025-04-02T00:00:00.000Z","tags":[{"inline":true,"label":"Model Context Protocol","permalink":"/blog/tags/model-context-protocol"},{"inline":true,"label":"MCP","permalink":"/blog/tags/mcp"},{"inline":true,"label":"Spring Ai","permalink":"/blog/tags/spring-ai"},{"inline":true,"label":"Claude","permalink":"/blog/tags/claude"},{"inline":true,"label":"OpenManus","permalink":"/blog/tags/open-manus"}],"readingTime":20.55,"hasTruncateMarker":true,"authors":[{"name":"\u590f\u51ac","title":"Committer","url":"https://github.com/brianxiadong","imageURL":"https://github.com/brianxiadong.png","key":"brianxiadong","page":null}],"frontMatter":{"title":"Java\u5f00\u53d1\u57fa\u4e8eSpring AI Alibaba\u73a9\u8f6cMCP\uff1a\u4ece\u53d1\u5e03\u3001\u8c03\u7528\u5230 Claude \u96c6\u62
110","tags":["Model Context Protocol","MCP","Spring Ai","Claude","OpenManus"],"description":"\u672c\u6587\u8ba8\u8bba\u4e86 2024 \u5e74 11 \u6708 Anthropic \u516c\u53f8\u63a8\u51fa\u7684 MCP \u534f\u8bae\uff0c\u4ecb\u7ecd\u4e86\u5176\u5728 Claude \u81ea\u52a8\u5316\u5230 Spring AI Alibaba \u751f\u6001\u6574\u5408\u4e2d\u7684\u5e94\u7528\uff0c\u5305\u62ec\u67b6\u6784\u3001\u642d\u5efa\u65b9\u6cd5\u53ca\u6d4b\u8bd5\u8fc7\u7a0b\u7b49\u3002","authors":["brianxiadong"],"date":"2025-04-02","slug":"spring-ai-alibaba-mcp","category":"article"},"unlisted":false,"prevItem":{"title":"Spring AI Alibaba MCP \u5e02\u573a\u6b63\u5f0f\u4e0a\u7ebf\uff01","permalink":"/blog/spring-ai-mcp-marketplace"},"nextItem":{"title":"Spring AI \u6e90\u7801\u89e3\u6790\uff1aMCP\u94fe\u8def\u8c03\u7528\u6d41\u7a0b\u53ca\u793a\u4f8b","permalink":"/blog/spring-ai-mcp-desc"}}')},93307:(n,e,i)=>{i.d(e,{A:()=>r});const r=i.p+"assets/images/11-b6dc34f1648e2730fd6392af50890347.png"}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.