做推广什么网站好,seo优化人员,网站策划书主题,自助建站实验报告或者在企业级中#xff0c; 有多个智能应用#xff0c;想将通用的tools公共化怎么办#xff1f;可以把tools单独抽取出来#xff0c; 由应用程序读取外部的tools。 那关键是怎么读呢#xff1f; 怎么解析呢#xff1f; 如果每个提供商各用一种规则你能想象有多麻烦#…或者在企业级中 有多个智能应用想将通用的tools公共化怎么办可以把tools单独抽取出来 由应用程序读取外部的tools。 那关键是怎么读呢 怎么解析呢 如果每个提供商各用一种规则你能想象有多麻烦 所以MCP就诞生了 他指定了标准规则 以jsonrpc2.0的方式进行通讯。那问题又来了 以什么方式通讯呢 http? rpc? stdio? mcp提供了sse和stdio这2种方式。使用Streamable http目前springai1.0版本不支持因为Streamable http 是 spring ai 1.0 之后说明的 我们先掌握SSE和STDIO分别说下STDIO和SSE的方式STDIO更适合客户端桌面应用和辅助工具SSE更适合web应用 、业务有关的公共toolsMCP STDIO 输出配置实操MCP Server现成共用MCP Server现在有很多MCP 服务 给大家提供一个网站MCP ServerMCP 服务器那MCP有了 怎么调用呢 这里介绍2种使用方式MCP Client通过工具CherryStudio、Cursor 、Claude Desktop、Cline 等等很多 这里不一一演示 不会的话自己找个文章 工具使用都很简单!以Cline为例 他是Vscode的插件安装VSCode安装插件配置cline的模型配置cline的mcpserver{mcpServers: {baidu-map: {command: cmd,args: [/c,npx,-y,baidumap/mcp-server-baidu-map],env: {BAIDU_MAP_API_KEY: LEyBQxG9UzR9C1GZ6zDHsFDVKvBem2do}},filesystem: {command: cmd,args: [/c,npx,-y,modelcontextprotocol/server-filesystem,C:/Users/tuling/Desktop]},mcp-server-weather: {command: java,args: [-Dspring.ai.mcp.server.stdiotrue,-Dlogging.pattern.console,-jar,D:\\ideaworkspace\\git_pull\\tuling-flight-booking_all\\mcp-stdio-server\\target\\mcp-stdio-server-xs-1.0.jar]}}}开启cline权限6.测试通过 Spring AI 接入 第三方的 MCP Server依赖!--既支持sse\也支持Stdio--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-client-webflux/artifactId/dependency2 配置spring:ai:mcp:client:# 连接超时时间设置request-timeout: 60000stdio: # 设置 sse 输出方式# 配置Mcp 方式2 将 mcp的配置 单独放在一个 Json 文件当中读取推荐利用维护# classpath 是指:项目resourcesservers-configuration: classpath:/mcp-servers-config.json# 配置MCP 方式2 直接将 mcp 配置全局配置文件中mcp 配置太多不利于维护# connections:# server1:# command: /path/to/server# args:# - --port8080# - --modeproduction# env:# API_KEY: your-api-key# DEBUG: truemcp-servers-config.json获取Baidu地图key: 控制台 | 百度地图开放平台{mcpServers: {baidu-map: {command: cmd,args: [/c,npx,-y,baidumap/mcp-server-baidu-map],env: {BAIDU_MAP_API_KEY: xxxx}},filesystem: {command: cmd,args: [/c,npx,-y,modelcontextprotocol/server-filesystem,C:/Users/tuling/Desktop]},mcp-server-weather: {command: java,args: [-Dspring.ai.mcp.server.stdiotrue,-Dlogging.pattern.console,-jar,D:\\xxx\\target\\mcp-stdio-server-xs-1.0.jar]}}}{mcpServers: {// 外部第三方的baidu-map: {command: cmd,args: [/c,npx,-y,baidumap/mcp-server-baidu-map],env: {BAIDU_MAP_API_KEY: xxxx}},// 外部第三方的filesystem: {command: cmd, // 指明使用 cmd 命令执行args: [/c,npx,-y,modelcontextprotocol/server-filesystem,C:/Users/tuling/Desktop]},// 自定义的 mcp 服务mcp-server-weather: { // 对应的项目名 application的 namecommand: java, // 指明通过 java 命令执行java 解析可以直接识别到args: [-Dspring.ai.mcp.server.stdiotrue,-Dlogging.pattern.console, // 清空控制台,不然会输入很多信息-jar, // -jar 启动 Spring BootD:\\xxx\\target\\mcp-stdio-server-xs-1.0.jar // 自定义的mcp服务的jar路径]}}}绑定到Chatclient/*** description: 智能航空助手:*/RestControllerCrossOriginpublic class OpenAiController {private final ChatClient chatClient;public OpenAiController(DashScopeChatModel dashScopeChatModel,// 配置引入 外部 mcp toolsToolCallbackProvider mcpTools) {this.chatClient ChatClient.builder(dashScopeChatModel).defaultToolCallbacks(mcpTools) // 将外部的 mcop tools 对大模型进行绑定,这里是构造器的绑定不是单个对话的绑定.build();}CrossOriginGetMapping(value /ai/generateStreamAsString, produces MediaType.TEXT_EVENT_STREAM_VALUE)public FluxString generateStreamAsString(RequestParam(value message, defaultValue 讲个笑话) String message) {FluxString content chatClient.prompt().user(message).stream().content();return content;}# 调试日志logging:level:io:modelcontextprotocol:client: DEBUGspec: DEBUG使用 Spring AI 接入 自定义MCP Server创建一个spring ai项目依赖!--mcp-server --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server/artifactId/dependencydependencyManagementdependencies!--spring ai 包管理依赖 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion${spring-ai.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement!-- 打包 --buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdexecutionsexecutiongoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build添加工具Servicepublic class UserToolService {MapString,Double userScore Map.of(xushu,99.0,zhangsan,2.0,lisi,3.0);Tool(description 获取用户分数)public String getScore(String username) { // 也可以添加上 ToolParam(description“” )告诉大模型这个参数的描述是做什么的if(userScore.containsKey(userName)){return userScore.get(userName).toString();}return 未检索到当前用户userName;}}暴露工具Bean // 将我们编写的 tools 对外的UserToolService 绑定上去public ToolCallbackProvider weatherTools(UserToolService userToolService) {return MethodToolCallbackProvider.builder().toolObjects(userToolService).build();}配置spring:main:banner-mode: offai:mcp:server:name: my-weather-serverversion: 0.0.1# 注意您必须禁用横幅和控制台日志记录以允许 STDIO 传输!!工作 banner-mode: off打包 mvn package此时target/生成了jar则成功在我们需要的用到我们自定义的 mcp 的项目当中加上我们自行定义的 MCP 服务。如下我们是将其统一放到了一个配置的 json 文件当中。去了{mcpServers: {// 外部第三方的baidu-map: {command: cmd,args: [/c,npx,-y,baidumap/mcp-server-baidu-map],env: {BAIDU_MAP_API_KEY: xxxx}},// 外部第三方的filesystem: {command: cmd, // 指明使用 cmd 命令执行args: [/c,npx,-y,modelcontextprotocol/server-filesystem,C:/Users/tuling/Desktop]},// 自定义的 mcp 服务mcp-server-weather: { // 对应的项目名 application的 namecommand: java, // 指明通过 java 命令执行java 解析可以直接识别到args: [-Dspring.ai.mcp.server.stdiotrue,-Dlogging.pattern.console, // 清空控制台,不然会输入很多信息-jar, // -jar 启动 Spring BootD:\\xxx\\target\\mcp-stdio-server-xs-1.0.jar // 自定义的mcp服务的jar路径]}}}MCP SSE 输出配置实操推荐 WebMCP Server这种方式需要将部署为Web服务依赖!--mcp服务器核心依赖— 响应式--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server-webflux/artifactId/dependency!-- 这个 SSE 是需要 Web 的 --dependencygroupIdorg.springframework/groupIdartifactIdspring-boot-starter-web/artifactId/dependency定义外部工具Servicepublic class UserToolService {MapString,Double userScore Map.of(xushu,99.0,zhangsan,2.0,lisi,3.0);Tool(description 获取用户分数)public String getScore(String username) {if(userScore.containsKey(username)){return userScore.get(username).toString();}return 未检索到当前用户;}}暴露工具Beanpublic ToolCallbackProvider weatherToolCallbackProvider(WeatherService weatherService,UserToolService userToolService) {return MethodToolCallbackProvider.builder().toolObjects(userToolService).build();}配置需要用 web 启动server:port: 8088MCP Client将上面 通过 SSE 方式创建的自定义 MCP Server 配置进来添加依赖!--既支持sse\也支持Stdio--dependencygroupIdorg.springframework.ai/groupId