目录一、为什么需要 MCP二、MCP 的两种通信方式三、STDIO 方式详解1. MCP Server服务端① 使用现成的公共 MCP Server② 自定义 STDIO MCP Server2. MCP Client客户端调用 STDIO3. STDIO 方式鉴权四、SSE 方式详解1. MCP Server服务端2. MCP Client客户端3. SSE 方式鉴权OAuth2一、为什么需要 MCP在 AI 应用爆发式增长的今天我们常常面临两个痛点服务商想开放工具比如高德地图提供位置查询、百度提供联网搜索但每个服务商都有自己的 API 格式调用方式千差万别。企业内部多应用共享工具多个智能应用都想使用同一套内部工具如订单查询、用户画像如果每个应用各自接入重复造轮子且维护成本极高。解决方案很简单把 Tools 单独抽取出来由应用程序统一读取外部 Tools。但问题随之而来——怎么读怎么解析如果每个提供商各用一套规则想象一下对接几十个不同 API 的混乱场面……于是MCPModel Context Protocol应运而生。MCP 指定了 标准通信规则以JSON‑RPC 2.0格式进行交互彻底统一了 Tools 的暴露与调用方式。二、MCP 的两种通信方式MCP 官方提供了两种主流传输方式三、STDIO 方式详解1. MCP Server服务端① 使用现成的公共 MCP Server网上已有大量现成的 MCP 服务例如MCP Server 聚合站 提供了百度地图、文件系统、天气查询等众多 MCP Server。② 自定义 STDIO MCP Server下面我们用 Spring AI 创建一个自定义的 STDIO MCP Server。第一步添加依赖pom.xml!--MCP Server 依赖--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server/artifactId/dependency!--Spring AI BOM 管理--dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion${spring-ai.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement!--打包插件用于生成可执行 jar--buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdexecutionsexecutiongoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build第二步编写 Tool 服务ServicepublicclassUserToolService{MapString,DoubleuserScoreMap.of(xushu,99.0,zhangsan,2.0,lisi,3.0);Tool(description获取用户分数)publicStringgetScore(Stringusername){if(userScore.containsKey(username)){returnuserScore.get(username).toString();}return未检索到当前用户 username;}}第三步暴露 ToolBeanpublicToolCallbackProviderweatherTools(UserToolServiceuserToolService){returnMethodToolCallbackProvider.builder().toolObjects(userToolService).build();}第四步配置文件application.ymlspring:main:banner-mode:off# 必须关闭横幅否则影响 STDIO 通信ai:mcp:server:name:my-weather-serverversion:0.0.1⚠️ 注意必须禁用横幅和控制台日志否则会污染标准输入输出流导致 MCP 通信失败。第五步打包执行 mvn package在 target/ 下生成可执行 jar 包。2. MCP Client客户端调用 STDIO第一步依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-client-webflux/artifactId/dependency第二步配置 application.ymlspring:ai:mcp:client:request-timeout:60000stdio:servers-configuration:classpath:/mcp-servers-config.jsonconnections:server1:command:/path/to/serverargs:---port8080---modeproductionenv:API_KEY:your-api-keyDEBUG:true第三步mcp-servers-config.json放在 resources 下{mcpServers:{baidu-map:{command:cmd,args:[/c,npx,-y,baidumap/mcp-server-baidu-map],env:{BAIDU_MAP_API_KEY:你的百度地图Key}},mcp-server-weather:{command:java,args:[-Dspring.ai.mcp.server.stdiotrue,-Dlogging.pattern.console,-jar,D:\\xxx\\target\\mcp-stdio-server.jar]}}}第四步绑定到 ChatClientRestControllerpublicclassOpenAiController{privatefinalChatClientchatClient;publicOpenAiController(DashScopeChatModeldashScopeChatModel,ToolCallbackProvidermcpTools){this.chatClientChatClient.builder(dashScopeChatModel).defaultToolCallbacks(mcpTools).build();}GetMapping(value/ai/generateStream,producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxStringgenerateStream(RequestParamStringmessage){returnchatClient.prompt().user(message).stream().content();}}3. STDIO 方式鉴权STDIO 通过环境变量传递凭证。在客户端配置中通过 env 字段注入{mcpServers:{baidu-map:{command:cmd,args:[/c,npx,-y,baidumap/mcp-server-baidu-map],env:{BAIDU_MAP_API_KEY:your-valid-key}}}}服务端获取环境变量进行校验Tool(description获取用户余额)publicStringgetScore(){StringapiKeySystem.getenv(BAIDU_MAP_API_KEY);// 校验 apiKey 合法性...return用户信息;}⚠️ 局限STDIO 环境下环境变量在子进程启动时固定不支持动态切换用户凭证。多用户场景下会产生争抢只适合单租户或本地工具。四、SSE 方式详解1. MCP Server服务端第一步依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server-webmvc/artifactId/dependency注意如果用 webflux 版本可能需要设置 spring.main.web-application-typereactive建议根据官方说明选择。第二步定义 Tool同 STDIOServicepublicclassUserToolService{MapString,DoubleuserScoreMap.of(xushu,99.0,zhangsan,2.0,lisi,3.0);Tool(description获取用户分数)publicStringgetScore(Stringusername){if(userScore.containsKey(username)){returnuserScore.get(username).toString();}return未检索到当前用户 username;}}第三步暴露 ToolBeanpublicToolCallbackProvidertoolProvider(UserToolServiceuserToolService){returnMethodToolCallbackProvider.builder().toolObjects(userToolService).build();}第四步配置文件 application.ymlserver:port:8088启动后MCP Server 会暴露 SSE 端点通常是 /sse。2. MCP Client客户端第一步依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-client-webflux/artifactId/dependency第二步配置spring:ai:mcp:client:enabled:truename:my-mcp-clientversion:1.0.0request-timeout:30stype:ASYNCsse:connections:server1:url:http://localhost:8088第三步代码绑定将 ToolCallbackProvider 注入 ChatClient 即可RestControllerpublicclassOpenAiController{privatefinalChatClientchatClient;publicOpenAiController(DashScopeChatModeldashScopeChatModel,ToolCallbackProvidermcpTools){this.chatClientChatClient.builder(dashScopeChatModel).defaultToolCallbacks(mcpTools).build();}GetMapping(value/ai/generateStream,producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxStringgenerateStream(RequestParamStringmessage){returnchatClient.prompt().user(message).stream().content();}}3. SSE 方式鉴权OAuth2SSE 基于 HTTP天然适合使用 OAuth2 标准。MCP 规范2025 年 3 月版明确支持 OAuth2MCP Server 同时充当 资源服务器 和 授权服务器。资源服务器校验每个请求的 Authorization: Bearer 头。授权服务器颁发 access_token通常使用 client_credentials 模式。