1"use strict";(self.webpackChunkspring_ai_alibaba_website=self.webpackChunkspring_ai_alibaba_website||[]).push([[386],{28453:(e,n,a)=>{a.d(n,{R:()=>c,x:()=>l});var t=a(96540);const r={},s=t.createContext(r);function c(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(s.Provider,{value:n},e.children)}},53714:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"assistantagent/features/mcp/advanced","title":"MCP \u5de5\u5177\u6a21\u5757 - \u9ad8\u7ea7\u7279\u6027","description":"1. \u81ea\u5b9a\u4e49\u5de5\u5177\u7c7b\u540d\u548c\u63cf\u8ff0","source":"@site/agents-docs/assistantagent/features/mcp/advanced.md","sourceDirName":"assistantagent/features/mcp","slug":"/assistantagent/features/mcp/advanced","permalink":"/agents/assistantagent/features/mcp/advanced","draft":false,"unlisted":false,"editUrl":"https://github.com/spring-ai-alibaba/website/tree/main/agents-docs/assistantagent/features/mcp/advanced.md","tags":[],"version":"current","lastUpdatedBy":"canfuu","lastUpdatedAt":1767918666000,"frontMatter":{},"sidebar":"agentsSidebar","previous":{"title":"\u5feb\u901f\u5f00\u59cb","permalink":"/agents/assistantagent/features/mcp/quickstart"},"next":{"title":"\u5feb\u901f\u5f00\u59cb","permalink":"/agents/assistantagent/features/dynamic-http/quickstart"}}');var r=a(74848),s=a(28453);const c={},l="MCP \u5de5\u5177\u6a21\u5757 - \u9ad8\u7ea7\u7279\u6027",i={},o=[{value:"1. \u81ea\u5b9a\u4e49\u5de5\u5177\u7c7b\u540d\u548c\u63cf\u8ff0",id:"1-\u81ea\u5b9a\u4e49\u5de5\u5177\u7c7b\u540d\u548c\u63cf\u8ff0",level:2},{value:"2. \u591a MCP \u670d\u52a1\u7ba1\u7406",id:"2-\u591a-mcp-\u670d\u52a1\u7ba1\u7406",level:2},{value:"3. \u5de5\u5177\u53c2\u6570 Schema \u81ea\u52a8\u89e3\u6790",id:"3-\u5de5\u5177\u53c2\u6570-schema-\u81ea\u52a8\u89e3\u6790",level:2},{value:"4. \u5f02\u6b65 MCP \u5ba2\u6237\u7aef",id:"4-\u5f02\u6b65-mcp-\u5ba2\u6237\u7aef",level:2},{value:"5. MCP \u670d\u52a1\u8ba4\u8bc1",id:"5-mcp-\u670d\u52a1\u8ba4\u8bc1",level:2},{value:"Bearer Token",id:"bearer-token",level:3},{value:"\u73af\u5883\u53d8\u91cf\u6ce8\u5165",id:"\u73af\u5883\u53d8\u91cf\u6ce8\u5165",level:3},{value:"6. \u5de5\u5177\u8fc7\u6ee4\u4e0e\u9009\u62e9",id:"6-\u5de5\u5177\u8fc7\u6ee4\u4e0e\u9009\u62e9",level:2},{value:"7. \u9519\u8bef\u5904\u7406",id:"7-\u9519\u8bef\u5904\u7406",level:2},{value:"8. \u8c03\u8bd5 MCP \u5de5\u5177",id:"8-\u8c03\u8bd5-mcp-\u5de5\u5177",level:2},{value:"9. \u4e0e Streamable HTTP \u96c6\u6210",id:"9-\u4e0e-streamable-http-\u96c6\u6210",level:2},{value:"10. \u5de5\u5177\u5143\u6570\u636e\u6269\u5c55",id:"10-\u5de5\u5177\u5143\u6570\u636e\u6269\u5c55",level:2}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"mcp-\u5de5\u5177\u6a21\u5757---\u9ad8\u7ea7\u7279\u6027",children:"MCP \u5de5\u5177\u6a21\u5757 - \u9ad8\u7ea7\u7279\u6027"})}),"\n",(0,r.jsx)(n.h2,{id:"1-\u81ea\u5b9a\u4e49\u5de5\u5177\u7c7b\u540d\u548c\u63cf\u8ff0",children:"1. \u81ea\u5b9a\u4e49\u5de5\u5177\u7c7b\u540d\u548c\u63cf\u8ff0"}),"\n",(0,r.jsxs)(n.p,{children:["\u901a\u8fc7 ",(0,r.jsx)(n.code,{children:"McpServerSpec"})," \u81ea\u5b9a\u4e49 MCP \u5de5\u5177\u7684\u7c7b\u540d\u548c\u63cf\u8ff0\uff1a"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'import com.alibaba.assistant.agent.extension.dynamic.mcp.McpDynamicToolFactory;\nimport com.alibaba.assistant.agent.extension.dynamic.mcp.McpServerSpec;\n\n@Bean\npublic McpDynamicToolFactory mcpToolFactory(ToolCallbackProvider provider) {\n return McpDynamicToolFactory.builder()\n .toolCallbackProvider(provider)\n .addServerSpec(McpServerSpec.builder()\n .connectionName("weather-service")\n .targetClassName("weather") // \u751f\u6210 weather.xxx() \u8c03\u7528\n .targetClassDescription("\u5929\u6c14\u67e5\u8be2\u670d\u52a1")\n .build())\n .addServerSpec(McpServerSpec.builder()\n .connectionName("database-service")\n .targetClassName("db") // \u751f\u6210 db.xxx() \u8c03\u7528\n .targetClassDescription("\u6570\u636e\u5e93\u67e5\u8be2\u670d\u52a1")\n .build())\n .build();\n}\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"2-\u591a-mcp-\u670d\u52a1\u7ba1\u7406",children:"2. \u591a MCP \u670d\u52a1\u7ba1\u7406"}),"\n",(0,r.jsx)(n.p,{children:"\u914d\u7f6e\u591a\u4e2a MCP \u670d\u52a1\uff0c\u6bcf\u4e2a\u670d\u52a1\u7684\u5de5\u5177\u4f1a\u81ea\u52a8\u6309\u7c7b\u540d\u5206\u7ec4\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "mcpServers": {\n "search": {\n "command": "node",\n "args": ["search-mcp.js"]\n },\n "storage": {\n "command": "node", \n "args": ["storage-mcp.js"]\n },\n "analytics": {\n "command": "python",\n "args": ["analytics_mcp.py"]\n }\n }\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Agent \u4ee3\u7801\u4e2d\u6309\u
1670d\u52a1\u5206\u7ec4\u8c03\u7528\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# \u641c\u7d22\u670d\u52a1\nresult = search.query(keyword="test")\n\n# \u5b58\u50a8\u670d\u52a1\nstorage.save(key="my_key", value="my_value")\n\n# \u5206\u6790\u670d\u52a1\nreport = analytics.generate_report(start_date="2024-01-01")\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"3-\u5de5\u5177\u53c2\u6570-schema-\u81ea\u52a8\u89e3\u6790",children:"3. \u5de5\u5177\u53c2\u6570 Schema \u81ea\u52a8\u89e3\u6790"}),"\n",(0,r.jsx)(n.p,{children:"MCP \u5de5\u5177\u7684 inputSchema \u4f1a\u81ea\u52a8\u89e3\u6790\u4e3a CodeactTool \u7684\u53c2\u6570\u5b9a\u4e49\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'// MCP \u5de5\u5177\u5b9a\u4e49\n{\n "name": "search_documents",\n "description": "\u641c\u7d22\u6587\u6863",\n "inputSchema": {\n "type": "object",\n "properties": {\n "query": {\n "type": "string",\n "description": "\u641c\u7d22\u5173\u952e\u8bcd"\n },\n "limit": {\n "type": "integer",\n "description": "\u8fd4\u56de\u6570\u91cf",\n "default": 10\n }\n },\n "required": ["query"]\n }\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u751f\u6210\u7684 Python \u8c03\u7528\u4ee3\u7801\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# \u81ea\u52a8\u751f\u6210\u7684\u5de5\u5177\u8c03\u7528\u7b7e\u540d\nresult = mcp.search_documents(query="\u5173\u952e\u8bcd", limit=10)\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"4-\u5f02\u6b65-mcp-\u5ba2\u6237\u7aef",children:"4. \u5f02\u6b65 MCP \u5ba2\u6237\u7aef"}),"\n",(0,r.jsx)(n.p,{children:"\u5bf9\u4e8e\u957f\u65f6\u95f4\u8fd0\u884c\u7684 MCP \u5de5\u5177\uff0c\u4f7f\u7528\u5f02\u6b65\u6a21\u5f0f\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"spring:\n ai:\n mcp:\n client:\n type: ASYNC # \u5f02\u6b65\u6a21\u5f0f\n request-timeout: 120s # \u589e\u52a0\u8d85\u65f6\u65f6\u95f4\n"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"5-mcp-\u670d\u52a1\u8ba4\u8bc1",children:"5. MCP \u670d\u52a1\u8ba4\u8bc1"}),"\n",(0,r.jsx)(n.h3,{id:"bearer-token",children:"Bearer Token"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "mcpServers": {\n "secure-service": {\n "command": "npx",\n "args": [\n "mcp-remote",\n "https://api.example.com/mcp",\n "--header",\n "Authorization: Bearer ${API_TOKEN}"\n ]\n }\n }\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"\u73af\u5883\u53d8\u91cf\u6ce8\u5165",children:"\u73af\u5883\u53d8\u91cf\u6ce8\u5165"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "mcpServers": {\n "env-auth": {\n "command": "python",\n "args": ["mcp_server.py"],\n "env": {\n "API_KEY": "${MY_API_KEY}",\n "SECRET": "${MY_SECRET}"\n }\n }\n }\n}\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"6-\u5de5\u5177\u8fc7\u6ee4\u4e0e\u9009\u62e9",children:"6. \u5de5\u5177\u8fc7\u6ee4\u4e0e\u9009\u62e9"}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u4ee3\u7801\u4e2d\u8fc7\u6ee4\u53ef\u7528\u7684 MCP \u5de5\u5177\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Component\npublic class McpToolFilter {\n\n private final CodeactToolRegistry toolRegistry;\n\n public McpToolFilter(CodeactToolRegistry toolRegistry) {\n this.toolRegistry = toolRegistry;\n }\n\n public List<CodeactTool> getMcpToolsForUser(String userId) {\n return toolRegistry.getAllTools().stream()\n .filter(tool -> tool.getMetadata().getFactoryId().equals("mcp"))\n .filter(tool -> hasPermission(userId, tool.getName()))\n .collect(Collectors.toList());\n }\n}\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"7-\u9519\u8bef\u5904\u7406",children:"7. \u9519\u8bef\u5904\u7406"}),"\n",(0,r.jsx)(n.p,{children:"MCP \u5de5\u5177\u8c03\u7528\u5931\u8d25\u65f6\u7684\u5904\u7406\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# Agent \u751f\u6210\u7684\u4ee3\u7801\u5e94\u5305\u542b\u9519\u8bef\u5904\u7406\ntry:\n result = mcp.risky_operation(param="value")\n if result.get("error"):\n print(f"\u64cd\u4f5c\u5931\u8d25: {result[\'error\']}")\nexcept Exception as e:\n print(f"MCP \u8c03\u7528\u5f02\u5e38: {e}")\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"8-\u8c03\u8bd5-mcp-\u5de5\u5177",children:"8. \u8c03\u8bd5 MCP \u5de5\u5177"}),"\n",(0,r.jsx)(n.p,{children:"\u542f\u7528\u8be6\u7ec6\u65e5\u5fd7\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"logging:\n level:\n com.alibaba.assistant.agent.extension.dynamic.mcp: DEBUG\n io.modelcontextprotocol: DEBUG\n"})}
1),"\n",(0,r.jsx)(n.p,{children:"\u67e5\u770b\u5de5\u5177\u6ce8\u518c\u4fe1\u606f\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Component\npublic class McpToolDiagnostics {\n\n private final CodeactToolRegistry registry;\n\n @PostConstruct\n public void printMcpTools() {\n registry.getAllTools().stream()\n .filter(t -> t.getMetadata().getFactoryId().equals("mcp"))\n .forEach(tool -> {\n System.out.println("MCP Tool: " + tool.getName());\n System.out.println(" Class: " + tool.getMetadata().getTargetClassName());\n System.out.println(" Description: " + tool.getDescription());\n });\n }\n}\n'})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"9-\u4e0e-streamable-http-\u96c6\u6210",children:"9. \u4e0e Streamable HTTP \u96c6\u6210"}),"\n",(0,r.jsx)(n.p,{children:"\u4f7f\u7528 HTTP \u534f\u8bae\u8fde\u63a5\u8fdc\u7a0b MCP \u670d\u52a1\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"spring:\n ai:\n mcp:\n client:\n streamable-http:\n connections:\n remote-api:\n url: https://mcp.example.com\n endpoint: /api/mcp\n headers:\n Authorization: Bearer ${TOKEN}\n X-Custom-Header: custom-value\n"})}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h2,{id:"10-\u5de5\u5177\u5143\u6570\u636e\u6269\u5c55",children:"10. \u5de5\u5177\u5143\u6570\u636e\u6269\u5c55"}),"\n",(0,r.jsx)(n.p,{children:"\u4e3a MCP \u5de5\u5177\u6dfb\u52a0\u81ea\u5b9a\u4e49\u5143\u6570\u636e\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Bean\npublic McpDynamicToolFactory mcpToolFactory(ToolCallbackProvider provider) {\n return McpDynamicToolFactory.builder()\n .toolCallbackProvider(provider)\n .defaultTargetClassNamePrefix("mcp")\n .defaultTargetClassDescription("MCP \u8fdc\u7a0b\u5de5\u5177")\n // \u540e\u5904\u7406\u5668\uff1a\u4e3a\u6240\u6709 MCP \u5de5\u5177\u6dfb\u52a0\u6807\u7b7e\n .postProcessor(tool -> {\n tool.getMetadata().getTags().add("mcp");\n tool.getMetadata().getTags().add("remote");\n return tool;\n })\n .build();\n}\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]);
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.