MCP(Model Context Protocol) 맛보기 with Spring AI

Aryumka·2025년 3월 16일

MCP란?

  • Model Context Protocol의 약자
    - Model: AI 모델들이
    • Context: 일을 처리할 때 컨텍스트에 대해
    • Protocol: 합의된 방식!

MCP의 목적

  • AI 모델들이 컨텍스트를 공유할 때 표준화된 프로토콜을 제공하는 것
    • 마치 USB-C 포트 - USB-C가 주변 장치들을 연결할 수 있는 표준화된 방법을 제공하듯이 다양한 AI 모델들을 외부 데이터 소스나 툴에 연결할 수 있게 한다.
  • 다양한 데이터 소스를 이용해서 복잡한 워크플로우를 가진 통합 AI agent를 구축할 수 있다.
    • 로컬 파일시스템, 다양한 DB, 외부 web까지 다양한 데이터소스를 연결할 수 있다.
    • 다양한 AI 벤더들을 이용할 수 있다.

MCP 아키텍쳐와 구성요소

  • Server: 표준화된 Model Context Protocol을 통해 특정 기능을 제공하는 경량 프로그램. 오늘 우리가 만들어 볼 예제다.
  • Host: Claude Desktop, IDE, 또는 AI 도구와 같이 MCP를 통해 데이터를 액세스하려는 프로그램. 직접 AI모델과 통신하는 챗봇같은 클라이언트를 만들어볼 수도 있다.
  • 로컬 데이터 소스(Local Data Sources): MCP 서버가 안전하게 접근할 수 있는 사용자의 컴퓨터 파일, 데이터베이스 및 서비스
  • 원격 서비스(Remote Services): MCP 서버가 연결할 수 있는 인터넷상의 외부 시스템(예: API 기반 서비스)

MCP의 특징

  • Data Privacy: AI 모델이 작업을 위해 데이터 접근 시 허가를 받아야 하므로 보안성이 좋다.
  • Stateful - Spring MCP transport STDIO나 SSE로 구현
  • JSON-RPC 2.0 베이스의 메시지 포맷을 사용
  • sampling: 단순한 요청-응답 방식이 아니라, AI 에이전트처럼 스스로 판단하여 데이터를 검색하고, 필요한 경우 대형 언어 모델과 재귀적으로 상호작용하여 최적의 결과를 도출하는 방식으로 동작

Spring MCP

Server 구현

실제 MCP 서버를 구현해보자.
MCP는 파이썬, 타입스크립트, 자바, 코틀린 4개 언어의 SDK를 제공하고 있다. 예시 코드는 Model Context Protocol 공식 홈페이지 를 참고해 만들었다.
스프링 AI 의존성을 이용, 코틀린으로 간단하게 구현했다.

서비스를 만들고 아래와 같이 툴을 구현해준다. 툴은 AI 모델이 실제 사용할 수 있는 함수라 볼 수 있다.
MCP는 AI 모델을 이용한 워크플로우 통합을 도와주는 툴일 뿐 툴은 직접 구현해야 한다.
는 점을 명심하자.
전체 코드는 https://github.com/aryumka/mcp-server-demo
미국 날씨 예측 정보를 가져오는 툴으로 단순한 api 요청을 보내는 코드이다.
전체 코드는 깃헙 저장소에서 참고할 수 있다.

@Tool 애너테이션을 사용, AI Model이 사용할 수 있도록 알려준다.

@Service
class WeatherService(private val objectMapper: ObjectMapper) {
  private val restClient: RestClient = RestClient.builder()
    .baseUrl("https://api.weather.gov")
    .defaultHeader("Accept", "application/geo+json")
    .defaultHeader("User-Agent", "weather-app/1.0")
    .build()

  @Tool(description = "Get weather forecast for a specific latitude/longitude")
  fun getWeatherForecastByLocation(
    @ToolParam(description = "Latitude of the location")
    latitude: Double,
    @ToolParam(description = "Longitude of the location")
    longitude: Double
  ): String {
    try {      
      /*중략*/
      return forecasts.joinToString("\n---\n")
    } catch (e: Exception) {
      return "Error fetching forecast: ${e.message}"
    }
  }
}

그리고 ToolCallbackProvider를 빈으로 등록해준다.

@SpringBootApplication
class McpServerDemoApplication {
  @Bean
  fun weatherTools(weatherService: WeatherService): ToolCallbackProvider {
    return MethodToolCallbackProvider.builder().toolObjects(weatherService).build()
  }
}

fun main(args: Array<String>) {
  runApplication<McpServerDemoApplication>(*args)
}

테스트

이렇게 서버를 만들면 Claud Desktop App으로 실행이 가능하다. 앱을 다운로드 받은 후 설정 > 개발자 설정을 통해

claude_desktop_config.json을 수정, MCP 서버를 설정한다.

이후 앱을 껐다가 다시 켜면 설정이 완료된다.

정상적으로 서버 설정이 완료되면 앱의 채팅창에 아래와 같은 해머 아이콘이 표시되고

누르면 사용 가능한 툴 목록이 표시된다.

실제 테스트를 진행해보자.

업로드중..

텍사스의 날씨를 물어보니 위처럼 도구를 허용할지 물어보는 창이 나온다. 위에서 언급한 MCP의 특징 중 하나인 Data Privacy를 잘 지키는 모습이다.

무슨 일이 일어난걸까?

  • Claud Desktop앱을 통해 질문을 하면
  • 클라이언트가 Claud에게 질문을 보내고
  • Claud가 적절한 툴을 찾아 어떤 것을 이용할지 선택 후 MCP 서버를 통해 실행한다.
  • 결과가 Claud에게 돌아오면
  • Claud가 자연어로 응답을 잘 처리하여
  • 응답 완료!

결론

사실 요즘 굉장히 핫한 주제라서 한번 찍먹을 해봤을 뿐이지만 매우 흥미롭다.
아직 초기 단계라 많은 기능을 기대할 순 없다. 로컬에서 생산성을 올리는 느낌 정도? 하지만 AI 앱이 다양한 데이터소스를 이용해 모듈처럼 교체되고 확장될 수 있다는 것. 확실히 강력한 잠재력이 있다고 느껴진다.
마치 스마트폰 생태계 발전과 함께 모바일 앱이 보편화되고 발전한 것처럼 AI 생태계 발전에 따라 AI 앱이 본격적으로 주류가 될 수 있는 발판이 될 것 같은 느낌도 든다. 현재도 개발자들이 자발적으로 MCP 서버나 클라이언트를 만들어 공유하고 있다
이 기술을 이용해서 어떻게 더 큰 가치를 제공할 수 있을지 고민해봐야겠다.

profile
아륨까라고 읽습니다.

0개의 댓글