宿遘稠 发表于 2025-6-2 23:34:57

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)

[*]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>
            spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
      </dependency>
      <dependency>
            <groupId>org.springframework</groupId>
            spring-web</artifactId>
      </dependency>
      <dependency>
            <groupId>org.projectlombok</groupId>
            lombok</artifactId>
            <optional>true</optional>
      </dependency>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            spring-boot-starter-test</artifactId>
            <scope>test</scope>
      </dependency>
      <dependency>
            <groupId>cn.hutool</groupId>
            hutool-all</artifactId>
            <version>5.8.36</version>
      </dependency>
    </dependencies>
    <dependencyManagement>
      <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                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: Nonecursor中配置mcp-server信息,测试mcp-server

{
    "mcpServers": {
      "weather": {
            "url": "https://test-xxx.com/weather/v1/sse",
            "headers": {
                "Authorization": "Bearer WSO2_DEV_PORTAL_APP_OAUTH_TOKEN"
            }
      },
      // 其他服务配置...
    }
}

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: springAI实现一个MCP-Server