JSCODE Logo
블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 외부 MCP Server와 연동한 실시간 날씨 조회 - MCP Client 개발

JSCODE 시니
JSCODE 시니
2026. 06. 13.
author
JSCODE 시니
category
Spring AI
createdAt
Jun 13, 2026 09:55 AM
isPublic
isPublic
series
실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
slug
practice-mcp-client-development-for-weather-service
type
post
updatedAt

✅ 1. 파이썬 설치 및 mcp_weather_server 설치

💁‍♀️
파이썬이 설치되지 않으신 분들은 파이썬을 설치하고 진행해주시길 바랍니다.
mcp-weather-server
An MCP server for weather information
mcp-weather-server
https://pypi.org/project/mcp-weather-server/
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(); } }