Rails 애플리케이션에 MCP(Model Context Protocol) 서버 구축하기: 대화형 시간 추적기 사례

MCP on Rails | SINAPTIA

작성자
발행일
2025년 08월 26일

핵심 요약

  • 1 MCP(Model Context Protocol)는 LLM에 데이터 소스와 도구를 표준화된 방식으로 제공하여 애플리케이션을 대화형 인터페이스로 전환하는 개방형 프로토콜입니다.
  • 2 Ruby용 `fast-mcp` 젬을 활용하면 Rails 애플리케이션에 MCP 서버를 쉽게 통합하여 기존 시간 추적기 앱에 자연어 처리 기반의 대화형 기능을 추가할 수 있습니다.
  • 3 MCP 서버는 리소스(정보 접근)와 도구(액션 수행)를 통해 AI 모델과 상호작용하며, 토큰 기반 인증과 사용자별 MCP 토큰을 통해 보안 및 사용자 식별을 강화합니다.

도입

SINAPTIA는 AI 탐구의 일환으로 AI 모델에 도구와 컨텍스트를 제공하는 방안에 주목하고 있습니다. 본 글에서는 Model Context Protocol(MCP)이라는 개방형 프로토콜을 소개하며, 이는 애플리케이션이 LLM에 데이터 소스와 도구를 표준화된 방식으로 제공하는 역할을 합니다. MCP를 통해 AI 에이전트가 Google Calendar와 같은 서비스와 연동하여 자연어 질의에 응답하는 예시를 통해 MCP의 강력한 잠재력을 강조합니다. 이러한 기술을 자사의 Ruby 기반 시간 추적기 애플리케이션에 적용하여 대화형 인터페이스를 구현하려는 목표를 제시합니다.

시간 추적기 애플리케이션의 대화형 전환

기존의 Slack 알림 기반 시간 추적기를 “오늘 Test 프로젝트에 8시간 기록해줘”와 같은 자연어 명령으로 제어할 수 있는 대화형 인터페이스로 발전시키고자 했습니다. 이는 사용자 경험을 혁신할 잠재력을 가집니다.

fast-mcp를 활용한 Rails 통합

Ruby용 MCP 구현체인 fast-mcp 젬을 사용하여 Rails 애플리케이션에 MCP 서버를 구축하는 과정은 다음과 같이 간단합니다. * Gemfile에 fast-mcp를 추가하고 bundle install을 실행합니다. * rails generate fast_mcp:install 명령을 통해 서버 설정 파일, 샘플 리소스 및 도구를 생성합니다. * 생성된 MCP 서버는 Rails 앱 시작 시 함께 실행되며, MCP 클라이언트(AI 모델)는 해당 서버에 연결하여 리소스와 도구를 활용할 수 있습니다. npx @modelcontextprotocol/inspector를 통해 서버를 테스트하고 디버깅할 수 있습니다.

리소스 정의

MCP 리소스는 AI 모델에 구조화된 정보를 제공합니다. 예를 들어, 시간 추적기 MCP 서버는 timetracker://projects라는 리소스를 정의하여 활성 프로젝트 목록을 반환합니다. ruby class ProjectsResource < ApplicationResource uri "timetracker://projects" resource_name "Projects" description "Active projects" mime_type "application/json" def content JSON.generate(Project.active.as_json) end end 이 리소스는 시간 기록 항목을 생성하기 전에 필요한 프로젝트 정보를 AI가 얻을 수 있도록 합니다.

인증 구현

MCP 서버의 보안을 위해 토큰 기반 인증이 필수적입니다. * fast-mcp는 베어러 토큰(bearer token)을 통한 서버 연결 인증을 지원합니다. * 사용자 식별을 위해 User 모델에 mcp_token 필드를 추가하고, ApplicationToolcurrent_user 메서드에서 X-MCP-Token 헤더를 사용하여 사용자를 인증합니다. ruby class ApplicationTool < ActionTool::Base private def current_user user = User.active.find_by mcp_token: headers["x-mcp-token"] raise "MCP Token is invalid" unless user.present? user end end 이를 통해 도구 호출 시 항상 인증된 사용자 컨텍스트를 확보할 수 있습니다.

도구 정의

도구는 AI 모델이 실제 작업을 수행하도록 하는 서버 측 함수입니다. CreateEntryTool은 시간 기록을 생성하는 예시 도구입니다. ruby class CreateEntryTool < ApplicationTool description "Create an entry" arguments do required(:project_id).filled(:integer).description("ID of the project, use the projects resource if it's unknown") optional(:date).maybe(:date).description("Date of the entry") required(:duration).filled(:string).description("Duration of the entry, always a float (eg. 2.0)") optional(:comments).maybe(:string).description("Comments, leave empty if it hasn't been provided") end def call(project_id:, duration:, comments: nil, date: Date.current) Entry.create(date: date, duration: duration.to_f, project_id: project_id, user: current_user, comments: comments) "Entry was successfully created." end end * arguments 블록은 dry-schema를 사용하여 도구의 입력 인자를 정의하며, 각 인자의 description은 LLM이 도구를 호출하는 방식을 결정하는 데 매우 중요합니다. * call 메서드는 LLM이 전송한 인자를 받아 실제 로직(시간 기록 생성)을 수행하고, 결과를 문자열로 반환합니다.

LLM과의 상호작용

“어제 Test 프로젝트에 4시간 기록해줘”와 같은 사용자 프롬프트에 대해 AI 에이전트는 다음과 같이 반응합니다. 1. 프롬프트에서 durationdate를 추출합니다. 2. project_id가 명시되지 않았으므로, timetracker://projects 리소스를 호출하여 “Test” 프로젝트의 ID를 찾습니다. 3. 찾아낸 정보(project_id, duration, date)를 바탕으로 CreateEntryTool을 호출하여 시간 기록을 생성합니다.

이 과정은 AI 모델이 사용자의 의도를 이해하고 필요한 도구와 리소스를 자율적으로 활용하여 작업을 완료하는 능력을 보여줍니다.

결론

MCP는 복잡한 사용자 인터페이스를 대화형 인터페이스로 대체하여 CRM, 재고 관리, 프로젝트 관리 도구와 같은 애플리케이션의 사용자 경험을 혁신할 수 있는 강력한 프로토콜입니다. Ruby와 `fast-mcp` 젬 덕분에 Rails 애플리케이션에 MCP 서버를 제공하는 것은 매우 간단하며, 핵심은 사용자 인증 및 권한 부여, 그리고 도구/리소스 필터링에 있습니다. 궁극적으로 도구와 리소스를 일반적인 Rails 액션으로 간주하고 동일한 수준의 보안 조치를 적용해야 함을 강조합니다. SINAPTIA는 AI 솔루션 구현을 돕는 전문가로서, 대화형 UI가 비즈니스 워크플로우에 가져올 이점을 논의할 수 있기를 기대합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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