2026/1/28 9:30:17
网站建设
项目流程
网站建设东北,百度经验官网首页,医院做网站定位,商丘市建立网站公司MCP#xff08;Model Context Protocol#xff09;本质是标准化的 LLM 工具调用交互规范#xff0c;核心目标是让 AI 工具#xff08;如 Claude Desktop、IDE 插件#xff09;安全、高效地调用封装了本地 / 远程资源的 “能力服务”#xff0c;其实现逻辑与 Function Cal…MCPModel Context Protocol本质是标准化的 LLM 工具调用交互规范核心目标是让 AI 工具如 Claude Desktop、IDE 插件安全、高效地调用封装了本地 / 远程资源的 “能力服务”其实现逻辑与 Function Call 一致但更强调 “通信协议标准化” 和 “多场景适配本地 / 远程”。MCP 是一个开放协议它标准化了应用程序如何向大语言模型LLMs提供上下文。MCP 核心角色MCP 的实现依赖 5 个核心角色各角色分工明确共同完成 “工具调用” 闭环角色核心职责示例MCP 主机Host发起工具调用需求的 “业务方”即 MCP 能力的使用者Trae、Claude Desktop、IDE 插件、AI 问答工具MCP 客户端Client遵循 MCP 协议的 “通信代理”负责与 MCP 服务器建立连接、传递调用请求、接收结果基于 stdio/SSE 的 Spring AI 客户端MCP 服务器Server封装 “工具能力” 的 “服务提供方”暴露可调用的工具如天气查询、数据库访问本地嵌入式服务、远程 HTTP 服务本地数据源MCP 服务器可安全访问的本地资源避免 Host 直接操作本地文件、MySQL 数据库、本地 API远程服务MCP 服务器可调用的外部互联网服务天气 APIOpenMeteo、支付接口MCP 两种实现方式基于 stdio标准输入输出适用场景嵌入式、单机部署客户端直接启动服务端子进程。特点轻量、无网络依赖适合本地工具如文件读取、系统命令。实现关键服务端需设置spring.main.web-application-typenone启动参数包含-Dspring.ai.mcp.server.stdiotrue客户端通过StdioClientTransport管理子进程 。基于 SSEServer-Sent Events适用场景远程服务、多客户端共享、云原生部署。特点基于 HTTP/HTTPS可跨网络调用支持负载均衡。实现关键服务端作为 WebFlux 应用运行在指定端口如 8080客户端通过WebFluxSseClientTransport连接两种方式在业务逻辑层完全一致——都通过Tool注解暴露方法MCP 客户端实现客户端的核心是 “按协议与服务器通信”分为本地 stdio 模式同一机器子进程交互和远程 SSE 模式跨机器HTTP 交互两者实现差异集中在 “连接方式” 和 “配置”。本地 stdio 模式适合嵌入式场景核心特点客户端与服务器在同一台机器客户端通过 “启动服务器子进程”用标准输入输出流stdio通信无需网络延迟低。实现步骤添加依赖Spring AI MCP 客户端 starter!-- 本地stdio模式依赖 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-client-spring-boot-starter/artifactId /dependency配置服务器application.yml JSON 配置文件application.yml指定服务器配置文件路径或直接配置启动命令spring: ai: dashscope: # 若调用远程LLM如通义千问配置API密钥 api-key: ${DASH_SCOPE_API_KEY} mcp: client: stdio: # 方式1指定服务器配置文件推荐分离配置 servers-configuration: classpath:/mcp-servers-config.json # 方式2直接配置适合简单场景 # connections: # server1: # command: java # args: [-jar, /path/to/mcp-server.jar]mcp-servers-config.json定义服务器启动参数如命令、JVM 参数{ mcpServers: { weather-server: { # 服务器名称自定义 command: java, # 启动命令 args: [ -Dspring.ai.mcp.server.stdiotrue, # 启用stdio模式 -Dspring.main.web-application-typenone, # 禁用Web服务本地子进程 -jar, /path/to/weather-mcp-server.jar # 服务器Jar包路径 ], env: {} # 可选环境变量如数据库密码 } } }代码实现构建 ChatClient注入 MCP 工具SpringBootApplication public class McpStdioClientApplication { public static void main(String[] args) { SpringApplication.run(McpStdioClientApplication.class, args); } // 注入工具和ChatClient执行查询 Bean public CommandLineRunner runTool( ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools, // MCP工具自动注入 ConfigurableApplicationContext context) { return args - { // 1. 构建支持MCP工具的ChatClient ChatClient chatClient chatClientBuilder .defaultTools(tools) // 注入MCP服务器的工具如天气查询 .build(); // 2. 调用工具查询北京天气触发MCP客户端向服务器发请求 String userQuery 北京的天气如何; System.out.println( 问题 userQuery); String result chatClient.prompt(userQuery).call().content(); System.out.println( 结果 result); context.close(); }; } }远程 SSE 模式适合多客户端共享场景核心特点服务器独立部署如远程服务器、云服务客户端通过Server-Sent EventsSSE协议HTTP 长连接与服务器通信支持多客户端同时调用。实现步骤添加依赖支持 SSE 的 MCP 客户端 starter!-- 远程SSE模式依赖 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-client/artifactId /dependency配置服务器仅需指定远程 URLspring: ai: dashscope: api-key: ${DASH_SCOPE_API_KEY} mcp: client: sse: connections: weather-server: # 服务器名称 url: http://localhost:8080 # 远程MCP服务器地址SSE服务端口代码实现与 stdio 模式完全一致协议透明化SpringBootApplication public class McpSseClientApplication { public static void main(String[] args) { SpringApplication.run(McpSseClientApplication.class, args); } Bean public CommandLineRunner runTool( ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools, ConfigurableApplicationContext context) { return args - { // 代码与stdio模式完全相同Spring AI自动处理SSE通信 ChatClient chatClient chatClientBuilder.defaultTools(tools).build(); String result chatClient.prompt(北京天气).call().content(); System.out.println( SSE模式结果 result); context.close(); }; } }MCP 服务器实现服务器的核心是 “将能力封装为可调用的工具”通过Tool注解标记方法让客户端自动发现并调用同样支持 stdio 和 SSE 两种部署模式。本地 stdio 模式嵌入式服务器核心特点作为客户端的 “子进程” 启动无独立端口禁用 Web 服务适合本地资源访问如本地文件、数据库。实现步骤添加依赖stdio 模式服务器 starterdependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-server-webflux/artifactId /dependency配置服务器禁用 Web启用 stdiospring: main: web-application-type: none # 关键禁用Web服务嵌入式子进程 banner-mode: off # 关闭启动日志减少干扰 ai: mcp: server: stdio: true # 启用stdio模式 name: weather-stdio-server # 服务器名称客户端需匹配 version: 0.0.1 # 版本号用于兼容性判断封装工具用Tool标记可调用方法// 服务类封装天气查询能力调用远程天气API Service public class WeatherToolService { private final WebClient webClient; // 注入WebClient用于调用远程天气API public WeatherToolService(WebClient.Builder webClientBuilder) { this.webClient webClientBuilder.baseUrl(https://api.open-meteo.com/v1).build(); } /** * 工具1根据经纬度查天气预报 * Tool标记为MCP工具description供客户端识别功能 * ToolParameter描述参数帮助客户端传递正确值 */ Tool(description 根据经纬度获取实时天气预报温度、风速) public String getWeather( ToolParameter(description 纬度示例39.9042北京) String latitude, ToolParameter(description 经度示例116.4074北京) String longitude) { try { // 调用远程天气API String apiResult webClient.get() .uri(uri - uri.path(/forecast) .queryParam(latitude, latitude) .queryParam(longitude, longitude) .queryParam(current, temperature_2m,wind_speed_10m) .build()) .retrieve() .bodyToMono(String.class) .block(); // 格式化结果实际项目需解析JSON return 北京天气\n apiResult; } catch (Exception e) { return 查询失败 e.getMessage(); } } /** 工具2根据经纬度查空气质量模拟数据 */ Tool(description 根据经纬度获取空气质量PM2.5、AQI) public String getAirQuality( ToolParameter(description 纬度) String latitude, ToolParameter(description 经度) String longitude) { return 北京空气质量\nPM2.5: 15 μg/m³优\nAQI: 42; } }注册工具让服务器识别并暴露工具SpringBootApplication public class McpStdioServerApplication { public static void main(String[] args) { SpringApplication.run(McpStdioServerApplication.class, args); } // 注册工具将WeatherToolService中的Tool方法暴露给客户端 Bean public ToolCallbackProvider weatherTools(WeatherToolService weatherToolService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherToolService) // 传入工具类实例 .build(); } }远程 SSE 模式独立服务器核心特点作为独立 Web 服务启动有端口支持多客户端远程调用适合共享能力如团队内共用的数据库查询工具。实现步骤添加依赖同 stdio 模式需 WebFlux 支持 SSEdependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-server-webflux/artifactId /dependency配置服务器指定端口启用 SSEserver: port: 8080 # 独立服务端口客户端需配置此地址 spring: ai: mcp: server: name: weather-sse-server # 服务器名称 version: 0.0.1 # 无需配置stdiotrue默认启用SSE工具封装与注册与 stdio 模式完全一致工具类WeatherToolService和注册代码ToolCallbackProvider与 stdio 模式相同Spring AI 自动通过 SSE 协议暴露工具。启动服务器独立运行# 打包 mvn clean package -DskipTests # 启动独立进程 java -jar target/weather-sse-server.jarMCP 客户端与服务器交互流程两种模式的交互逻辑差异集中在 “连接建立方式”核心工具调用流程一致请求→处理→响应。stdio 模式交互本地子进程客户端启动时读取mcp-servers-config.json执行java -jar命令启动服务器子进程客户端通过 “标准输入流” 向服务器发送工具调用请求如getWeather(latitude39.9042, longitude116.4074)服务器执行Tool方法通过 “标准输出流” 将结果返回给客户端客户端将结果传递给 Host如 AI 工具生成最终回答。SSE 模式交互远程 HTTP客户端启动时通过配置的http://localhost:8080建立 SSE 长连接客户端通过 HTTP 请求发送工具调用参数服务器接收后执行Tool方法服务器通过 SSE 流将结果推送给客户端无需客户端轮询客户端接收结果传递给 Host。MCP 的本质MCP 与 LLM 的 Function Call 核心目标一致让 AI 调用外部工具但 MCP 是更具象的 “交互协议规范”两者差异如下维度Function Call如 OpenAI 函数调用MCP模型上下文协议核心定位工具调用能力LLM 侧定义工具调用的 “通信 封装” 标准化规范通信方式依赖 LLM API如 OpenAI API支持 stdio本地、SSE远程两种模式能力封装需手动定义函数 Schema用Tool注解自动封装无需手动写 Schema部署场景多为远程 API 调用支持本地嵌入式、远程共享两种场景安全隔离无明确隔离Host 直接调用工具服务器隔离 Host 与数据源Host 不直接操作本地资源结论MCP 是 Function Call 的 “工业化实现”—— 它将 Function Call 的 “工具调用逻辑”通过标准化协议stdio/SSE、注解式工具封装、多场景部署变成可落地的工程方案。Function Calling 是‘模型自己会用的工具’MCP 是‘让模型安全、标准地连接万物的协议’MCP 核心价值标准化终结了各家 Function Calling 的碎片化提供统一接口。解耦LLM 应用与工具服务完全分离便于独立开发、部署、升级。安全可控通过独立服务进程隔离敏感操作如数据库访问。生态友好任何人可开发 MCP Server形成“AI 工具市场”。MCP 落地最佳实践工具设计每个Tool方法仅做一件事如 “查天气”“查空气质量” 分开避免参数过多用ToolParameter详细描述参数含示例帮助 LLM 生成正确参数。错误处理服务器工具方法必须捕获异常返回 “用户可理解的错误信息”如 “纬度格式错误示例39.9042”。部署选择本地资源访问如本地文件、数据库→ 选 stdio 模式低延迟、安全多客户端共享能力如团队共用工具→ 选 SSE 模式方便部署、可扩展