실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
practice-testing-mcp-integration-cli-and-rest-api
✅ 1. CLI 설정
✅ 2. McpController McpController.java
package com.jscode.tool.rest;
@RestController
@RequestMapping("/mcp")
public class McpController {
private final McpService mcpService;
public McpController(McpService mcpService) {
this.mcpService = mcpService;
}
public record PromptBody(
@NotEmpty @Schema(description = "대화 식별자", example = "jscode") String conversationId,
@NotEmpty @Schema(description = "사용자 입력 프롬프트", example = "안녕하세요, 제주도 날씨 어떤지 알려주세요!") String userPrompt,
@Nullable @Schema(description = "시스템 프롬프트(선택)", example = "당신은 유능한 어시스턴트입니다.") String systemPrompt,
@Nullable @Schema(description = "채팅 옵션(선택)", implementation = DefaultChatOptions.class) DefaultChatOptions chatOptions
) {}
@PostMapping(value = "/call", produces = MediaType.APPLICATION_JSON_VALUE)
public ChatResponse call(@RequestBody @Valid PromptBody promptBody) {
Prompt prompt = createPrompt(promptBody);
// 완성된 프롬프트와 conversationID를 가지고 서비스 메서드 호출
return mcpService.call(promptBody.conversationId, prompt);
}
@PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream(@RequestBody @Valid PromptBody promptBody){
Prompt prompt = createPrompt(promptBody);
return mcpService.stream(promptBody.conversationId, prompt);
}
private static Prompt createPrompt(PromptBody promptBody) {
List<Message> messages = new ArrayList<>();
if(promptBody.systemPrompt() != null && !promptBody.systemPrompt().isBlank()){
messages.add(new SystemMessage(promptBody.systemPrompt()));
}
messages.add(new UserMessage(promptBody.userPrompt()));
Prompt.Builder promptBuilder = Prompt.builder().messages(messages);
if(promptBody.chatOptions() != null){
promptBuilder.chatOptions(promptBody.chatOptions());
}
return promptBuilder.build();
}
}
✅ 3. RestAPI 테스트 - 외부 MCP spring:
application:
name: tool # 애플리케이션 이름
ai:
mcp:
client:
stdio:
type: ASYNC
enabled: true #MCP Client 활성화
initialized: true
request-timeout: 5s
startup-timeout: 60s
connections:
weather-mcp-server:
command: /Users/siyeon/Downloads/tool/.venv/bin/python # MCP 서버 실행 Python 경로
args:
- -m
- mcp_weather_server # MCP 서버 실행 인자
# local-mcp-server:
# command: java
# args:
# - "-jar"
# - "/Users/siyeon/Downloads/mcp-server/build/libs/mcp-server-0.0.1-SNAPSHOT.jar"
# - "--spring.main.banner-mode=off" # Spring Boot 배너 비활성화 (JSON 파싱 에러 방지)
# - "--logging.pattern.console=" # 콘솔 로그 패턴 비우기 (JSON 프로토콜 오염 방지)
# - "--spring.main.web-application-type=none" # 톰캣(Tomcat)을 끄고 비웹(STDIO) 모드로 구동
# sse:
# connections:
# local-mcp-server:
# url: http://localhost:8081
✅ 4. RestAPI 테스트 - 우리가 작성한 MCP spring:
application:
name: chat # 어플리케이션 이름
ai:
mcp:
client:
enabled: true # MCP Client 활성화
type: SYNC # MCP Client 타입
stdio:
connections:
# weather-mcp-server:
# command: /Users/jm/myenv/bin/python # MCP 서버 실행 Python 경로
# args:
# - -m
# - mcp_weather_server # MCP 서버 실행 인자
local-mcp-server:
command: /usr/bin/java
args:
- -jar
- /Users/siyeon/Downloads/mcp-server/build/libs/mcp-server-0.0.1-SNAPSHOT.jar
- --spring.main.banner-mode=off # Spring Boot 배너 비활성화
- --logging.pattern.console= # 콘솔 로그 패턴 비우기
- --spring.ai.mcp.server.stdio=true # STDIO 기반 MCP 서버 활성화
- --spring.main.web-application-type=none # 웹 서버 기능 생략 (비웹 모드)
✅ 5. CLI 테스트 - SSE 방식 app:
cli:
enabled: true # CLI 모드 활성화 여부
chat:
default-system-prompt: "한국어를 사용하는 tool 지원 AI 입니다." # 기본 system prompt
... 중략
sse:
connections:
local-mcp-server:
url: http://localhost:8081