Spring AI에서 SSE를 사용한 MCP 서버 구현

Spring MVC 기반의 SSE (Server-Sent Events) 서버 전송 및 선택적 STDIO 전송 지원

의존성 추가

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>

서비스 클래스

이 클래스는 외부 호출을 위한 메소드를 정의합니다. 본 예제에서는 테스트 목적으로 작성되었습니다.

package com.example.springaimcp.mcpserver;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class NameMcpServer {

    @Tool(description = "아이의 생년월일과 성별에 따른 이름 생성")
    public String generateChildName(@ToolParam(description = "생년월일") String birth,
                                    @ToolParam(description = "성별") String gender) {
        log.info("Birth: {}, Gender: {}", birth, gender);
        return "예시 이름";
    }
}

@Tool은 메소드의 역할을 설명하고, @ToolParam은 매개변수의 역할을 설명합니다. 이러한 설명이 자세할수록 대형 모델이 해당 도구를 선택할 가능성이 높아집니다.

설정 클래스

MCP 클라이언트에게 함수 도구를 공개하기 위한 설정

package com.example.springaimcp.config;

import com.example.springaimcp.mcpserver.NameMcpServer;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyServerConfig {
    @Bean
    public ToolCallbackProvider nameTool(NameMcpServer nameMcpServer) {
        return MethodToolCallbackProvider.builder().toolObjects(nameMcpServer).build();
    }
}

MCP 서버는 다음 네 가지 주요 기능 유형을 지원하며, 각각을 개별적으로 활성화하거나 비활성화할 수 있습니다:

  • 도구 - spring.ai.mcp.server.capabilities.tool=true|false
  • 리소스 - spring.ai.mcp.server.capabilities.resource=true|false
  • 프롬프트 - spring.ai.mcp.server.capabilities.prompt=true|false
  • 완료 - spring.ai.mcp.server.capabilities.completion=true|false

기본적으로 모든 기능이 활성화되어 있습니다. 특정 기능을 비활성화하면 해당 기능이 클라이언트에게 공개되지 않습니다.

이 예제에서는 함수 도구만 구성하였습니다.

yml 설정

spring:
  ai:
    mcp:
      server:
        name: name-mcp-server
        version: 1.0.0
        type: SYNC

server:
  port: 8088

서버 시작

MCP 클라이언트 연결

MCP 클라이언트 사용 방법은 Spring AI (9) —— MCP 클라이언트 참조

의존성 추가

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>

클라이언트 yml 설정

spring:
  ai:
    zhipuai:
      api-key: XXXXXXXXX
      chat:
        options:
          model: glm-4-flash
          temperature: 0.7

    mcp:
      client:
        name: my-mcp-client
        version: 1.0.0
        request-timeout: 10s
        type: sync
        sse:
          connections:
            server2:
              url: http://localhost:8088
              sse-endpoint: /sse

클라이언트 시작 및 테스트

WebFlux 기반의 SSE (Server-Sent Events) 서버 전송 및 선택적 STDIO 전송 지원

의존성 추가

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>

WebFlux를 사용하므로, spring-boot-starter-web 의존성을 제거해야 합니다.

yml 설정

spring:
  ai:
    mcp:
      server:
        name: name-mcp-server
        version: 1.0.0
        type: SYNC

server:
  port: 8088

서버 시작

pom.xml에서 spring-boot-starter-web 의존성을 반드시 제거해야 합니다. 시작 로그에서 WebFlux가 Netty를 사용하는 것을 확인할 수 있습니다.

MCP 클라이언트 연결

의존성 추가

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>

yml 설정

spring:
  ai:
    zhipuai:
      api-key: XXXXXXXXX
      chat:
        options:
          model: glm-4-flash
          temperature: 0.7

    mcp:
      client:
        name: my-mcp-client
        version: 1.0.0
        request-timeout: 10s
        type: sync
        sse:
          connections:
            server2:
              url: http://localhost:8088
              sse-endpoint: /sse

클라이언트 시작 및 테스트

테스트 결과는 WebMvc 서버와 동일하므로, 여기서는 생략합니다.

태그: Spring AI Server-Sent Events Spring MVC Spring WebFlux MCP

8월 28일 21:07에 게시됨