실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
practice-mcp-client-development-for-weather-service
✅ 1. 파이썬 설치 및 mcp_weather_server 설치
💁♀️
파이썬이 설치되지 않으신 분들은 파이썬을 설치하고 진행해주시길 바랍니다.
pip3 install mcp
pip3 install mcp_weather_server
python -m mcp_weather_server
✅ 2. application.yaml 수정
spring:
application:
name: tool # 애플리케이션 이름
ai:
mcp:
client:
enabled: true # MCP Client 활성화
type: SYNC # MCP Client 타입
stdio:
connections:
weather-mcp-server:
# MCP 서버 실행 Python 경로
command: /Users/siyeon/Downloads/tool/venv/bin/python
args:
- -m
- mcp_weather_server # MCP 서버 실행 인자
✅ 3. Service 구현
package com.jscode.tool.service;
@Slf4j
@Service
public class McpService {
private final ChatClient chatClient;
public McpService(ChatClient.Builder chatClientBuilder,
Advisor[] advisors,
@Value("${app.chat.default-system-prompt:}") String systemPrompt,
ToolCallbackProvider[] toolCallbackProviders) {
// 1. ToolCallback 추출 및 로깅
List<ToolCallback> callbackList = new ArrayList<>(); // 툴 콜백들을 임시로 담아둘 리스트 생성
for (ToolCallbackProvider provider : toolCallbackProviders) { // 주입받은 프로바이더 배열 순회
for (ToolCallback callback : provider.getToolCallbacks()) { // 각 프로바이더가 가지고 있는 콜백(기능)들을 다시 순회
// 각 툴의 이름과 설명을 로그로 출력 (어떤 툴들이 로드되었는지 확인용)
log.info("Tool loaded – name: {}, description: {}",
callback.getToolDefinition().name(),
callback.getToolDefinition().description());
callbackList.add(callback); // 확인된 콜백을 리스트에 추가
}
}
// 리스트에 모인 콜백들을 ChatClient 설정에 넣기 위해 배열 형태로 변환
ToolCallback[] toolCallbacks = callbackList.toArray(new ToolCallback[0]);
// 2. ChatClient 설정
this.chatClient = chatClientBuilder
.defaultSystem(systemPrompt)
.defaultOptions(ToolCallingChatOptions.builder().temperature(0.2).build().mutate())
.defaultAdvisors(advisors)
.defaultToolCallbacks(toolCallbacks)
.build();
}
private ChatClient.ChatClientRequestSpec createRequest(String conversationId, Prompt prompt) {
return chatClient.prompt(prompt)
.advisors(advisors -> advisors.param(ChatMemory.CONVERSATION_ID, conversationId));
}
public Flux<String> stream(String conversationId, Prompt prompt) {
return createRequest(conversationId, prompt).stream().content();
}
public ChatResponse call(String conversationId, Prompt prompt) {
return createRequest(conversationId, prompt).call().chatResponse();
}
}