mcp
Model Context Protocol(MCP)模型上下文协议(如下图所示)是 Anthropic 发布的一种标准化协议,使得 Agent 智能体应用可以更快捷地与下游异构的数据或者工具进行交互
sequenceDiagram participant Client as MCP Client (HTTP) participant WebServer as Web服务层 (Express) participant MCPCore as MCP 核心逻辑 participant web应用 Client->>WebServer: HTTP 请求 (POST /mcp) WebServer->>MCPCore: 转换协议格式 MCPCore->>web应用: 执行 MCP 操作 web应用-->>MCPCore: 返回结果 MCPCore-->>WebServer: 格式处理 WebServer-->>Client: HTTP 响应 (JSON)
- https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html
- https://blog.csdn.net/sufu1065/article/details/146554118
- https://medium.com/@nivedita.sood/how-to-build-a-redis-mcp-server-in-cursor-ebb88fbb75e7
- https://www.51cto.com/aigc/4906.html
添加引用
<properties> <java.version>17</java.version> <spring-ai.version>1.0.0-M6</spring-ai.version> <spring-boot.version>3.4.3</spring-boot.version> </properties> <dependencies> <!-- <dependency>--> <!-- <groupId>org.springframework.ai</groupId>--> <!-- <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.36</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>${spring-ai.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
application.yml配置
- stdio 标准输入,mcp client进程到mcp server进程之间进行通讯
- sse 通过Server-Sent Events(SSE) 技术向客户端进行消息推送,标准请求方式是GET
spring: application: name: mcp-server-weather server: port: 8080 # MCP Server 配置(STDIO 传输) ai: mcp: server: enabled: true type: ASYNC sse-message-endpoint: mcp/messages stdio: enabled: false sse: enabled: true
添加测试代码
@Component public class WeatherService { @Tool(description = "根据城市名称获取天气预报") public String getWeatherByCity(String city) { Map<String, String> mockData = Map.of( "西安", "晴天", "北京", "小雨", "上海", "大雨" ); return mockData.getOrDefault(city, "抱歉:未查询到对应城市!"); } } @Component public class HelloWorldTool { @Bean public ToolCallbackProvider weatherTools(WeatherService weatherService) { return MethodToolCallbackProvider.builder().toolObjects(weatherService).build(); } }
添加Dockerfile
使用性能更好的graalvm这个jdk工具
FROM findepi/graalvm:java17 MAINTAINER lind RUN mkdir -p /mcp-weather-server WORKDIR /mcp-weather-server ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" TZ=Asia/Shanghai WEATHER_API_KEY="" EXPOSE 8080 ADD ./target/mcp-server-weather-0.0.1-SNAPSHOT.jar ./app.jar ENTRYPOINT ["java", "-jar", "app.jar"]
部署到k8s
apiVersion: apps/v1 kind: Deployment metadata: name: mcp-weather namespace: default labels: app: mcp-weather spec: replicas: 1 selector: matchLabels: app: mcp-weather template: metadata: labels: app: mcp-weather spec: containers: - name: mcp-weather image: harbor.xxx.xx:8443/library/mcp-weather:1.0 ports: - name: http containerPort: 8080 protocol: TCP resources: requests: cpu: 250m memory: 512Mi strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% --- apiVersion: v1 kind: Service metadata: name: mcp-weather namespace: default status: loadBalancer: {} spec: ports: - name: http protocol: TCP port: 8080 targetPort: 8080 selector: app: mcp-weather type: ClusterIP sessionAffinity: None
cursor中配置mcp-server信息,测试mcp-server
{ "mcpServers": { "weather": { "url": "https://test-xxx.com/weather/v1/sse", "headers": { "Authorization": "Bearer WSO2_DEV_PORTAL_APP_OAUTH_TOKEN" } }, // 其他服务配置... } }
