Rails 앱에 MCP 서버 임베딩 및 LLM 연동 심층 탐구

Building an MCP server in a Rails app

작성자
thoughtbot Youtube
발행일
2025년 11월 07일

핵심 요약

  • 1 Rails 애플리케이션에 MCP(Model Context Protocol) 서버를 임베드하여 LLM(대규모 언어 모델)과 연동하는 과정을 시연했습니다.
  • 2 `fast_mcp` Ruby Gem을 활용하여 Rails 앱 내에서 리소스(데이터) 및 도구(액션)를 정의하고, 이를 Cursor AI 에이전트와 연동하여 사용자의 질의에 응답하는 기능을 구현했습니다.
  • 3 OpenAI 연동 시 메타데이터 버그와 클라이언트-서버 간의 간헐적인 통신 문제 등 여러 기술적 난관에 직면했으나, MCP의 활용 가능성과 아키텍처를 탐구했습니다.

도입

본 세션은 지난 AI and Focus 방송에서 다루었던 Rails 애플리케이션에 MCP(Model Context Protocol) 서버를 임베드하여 OpenAI와 같은 LLM에 연결하려는 시도의 연장선입니다. 지난번 OpenAI 연동 시 발생했던 문제를 해결하고, Rails 앱의 모델과 기능을 LLM 인터페이스를 통해 활용할 수 있도록 하는 것이 목표입니다. 이를 통해 사용자가 자연어를 사용하여 애플리케이션과 상호작용하고, 복잡한 작업을 수행할 수 있는 기반을 마련하고자 합니다.

MCP 서버 설정 및 fast_mcp Gem 활용

  • fast_mcp Ruby Gem을 Rails 애플리케이션에 추가하여 MCP 서버 기능을 임베드했습니다. 이 Gem은 개발 모드에서 에디터의 개발 지원을 위해 사용되거나, 프로덕션 환경에서 제품 사용자가 LLM을 통해 제품과 상호작용할 수 있도록 설계되었습니다.

  • 리소스(Resources) 정의: app/resources 디렉토리에서 ApplicationResource를 상속받아 PersonResource와 같은 리소스를 정의했습니다. 리소스는 LLM에 제공될 정적 또는 캐시 가능한 데이터를 의미하며, 예를 들어 시스템 내 모든 사용자 목록을 JSON 형태로 제공할 수 있습니다.

  • 도구(Tools) 정의: app/tools 디렉토리에서 ApplicationTool을 상속받아 AgendaToolWeekTool과 같은 도구를 정의했습니다. 도구는 LLM이 특정 작업을 수행할 수 있도록 하는 액션을 의미합니다. 예를 들어, AgendaTool은 특정 사용자의 주간 일정을 조회하고, WeekTool은 자연어 날짜 문자열(예: ‘next week’)을 ISO 8601 형식의 시작 날짜로 변환하는 기능을 제공합니다.

LLM 연동 및 상호작용 시연

  • Cursor AI 에이전트를 MCP 클라이언트로 사용하여 Rails 앱에 연결했습니다. Cursor는 MCP 서버에 연결된 도구와 리소스를 활용하여 사용자 질의에 응답할 수 있습니다.

  • 사용자 질의 처리: “greet user 1”과 같은 질의를 통해 SampleTool이 사용자 ID를 기반으로 이름을 조회하고 인사하는 과정을 시연했습니다. 또한, “what is person one’s agenda for next week”와 같은 질의를 통해 WeekToolAgendaTool이 연동되어 동적으로 사용자 일정을 조회하는 시나리오를 구현했습니다.

직면한 기술적 난관

  • OpenAI 연동 문제: 지난 세션에서 OpenAI가 MCP 서버의 메타데이터를 올바르게 처리하지 못하는 버그로 인해 직접적인 연동에 실패했습니다. 이는 fast_mcp Gem의 알려진 이슈로 확인되었습니다.

  • Rails 서버 재시작 필요성: ApplicationTool 또는 ApplicationResource 파일을 변경할 경우, Rails initializer가 이를 다시 로드하도록 서버를 재시작해야 하는 번거로움이 있었습니다.

  • 날짜 파싱 및 도구 연동 문제: 초기에는 LLM이 ‘next week’와 같은 자연어 날짜 표현을 AgendaTool에 직접 전달하는 데 어려움을 겪었습니다. 이를 해결하기 위해 Chronic Gem을 활용하여 자연어 날짜를 파싱하고 특정 주차의 시작 날짜를 반환하는 WeekTool을 별도로 구현했습니다.

  • 간헐적인 클라이언트-서버 통신 오류: Cursor AI 에이전트와 Rails 앱 간의 MCP 연결이 불안정하여, 첫 번째 도구 호출은 성공하지만 이후 호출에서 타임아웃, 알 수 없는 메시지 ID 응답, Zod 에러 등 다양한 통신 문제가 발생했습니다. 이는 웹소켓(SSE) 연결의 안정성 또는 Gem 내부 처리 방식과 관련된 문제로 추정됩니다.

MCP의 활용 가능성

  • MCP는 LLM이 애플리케이션의 데이터와 기능을 직접적으로 활용할 수 있는 강력한 인터페이스를 제공합니다. 예를 들어, LLM이 사용자의 캘린더와 프로젝트 관리 시스템(Hub)에 연결되어 “Chad의 다음 빈 시간에 프로젝트 업데이트 회의를 잡아줘”와 같은 복합적인 요청을 처리할 수 있습니다.

  • 이는 프로그래머가 아닌 일반 사용자도 자연어 프롬프트를 통해 여러 서비스의 기능을 통합하여 작업을 수행할 수 있는 가능성을 열어줍니다.

결론

이번 세션은 Rails 애플리케이션에 MCP 서버를 임베드하여 LLM과 연동하는 과정에서 발생할 수 있는 실제적인 도전 과제들을 명확히 보여주었습니다. 비록 클라이언트-서버 간 통신 문제와 같은 난관에 직면하여 완벽한 시연에는 이르지 못했지만, `fast_mcp` Gem을 통한 리소스 및 도구 정의 방식과 LLM이 애플리케이션의 기능을 활용하는 아키텍처에 대한 깊이 있는 이해를 얻을 수 있었습니다. 이러한 경험은 향후 유사한 LLM 통합 프로젝트에서 발생할 수 있는 문제들을 예측하고 대비하는 데 중요한 통찰력을 제공할 것입니다. 커뮤니티의 피드백을 통해 문제 해결 방안을 모색하고, 궁극적으로 LLM 기반의 혁신적인 애플리케이션 개발에 기여할 수 있기를 기대합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!