PageSourceSearch

https://java2ai.com/assets/js/375bb192.d92d0afb.js

js java2ai.com collected 2026-10-03 21:32:26 UTC 12,857 bytes, 1 lines download raw bytes

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.