springAI实现一个MCP-Server

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)

添加引用

    <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"             }         },         // 其他服务配置...     } }  

springAI实现一个MCP-Server

发表评论

评论已关闭。

相关文章