Erlo

springAI实现一个MCP-Server

2025-05-13 16:30:16 发布   42 浏览  
页面报错/反馈
收藏 点赞

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)

添加引用

    
        17
        1.0.0-M6
        3.4.3
    
    
        
        
        
        
        
            org.springframework.ai
            spring-ai-mcp-server-webmvc-spring-boot-starter
        
        
            org.springframework
            spring-web
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            cn.hutool
            hutool-all
            5.8.36
        
    
    
        
            
                org.springframework.ai
                spring-ai-bom
                ${spring-ai.version}
                pom
                import
            
        
    

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

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认