AI 에이전트를 GitLab에 연결하는 방법: GitLab Core에 MCP 리소스를 구현한 과정
요약
본 글은 AI 에이전트의 표준 통신 프로토콜인 MCP(Model Context Protocol)를 GitLab Core에 직접 통합하는 과정을 다룹니다. 이를 통해 외부 AI 코딩 어시스턴트가 프로젝트, 이슈 등 GitLab 내부 리소스와 상호작용할 수 있게 됩니다. 구체적으로 `resources/list` 및 관련 엔드포인트 구현과 JSON-RPC 핸들링 방법을 설명합니다.
핵심 포인트
- MCP는 LLM이 외부 시스템과 통신하는 개방형 산업 표준입니다.
- GitLab Core에 MCP 리소스를 추가하여 AI 에이전트의 컨텍스트 인식을 개선했습니다.
- JSON-RPC를 통해 GitLab 내부 리소스(이슈, MR 등)를 AI 클라이언트에 노출합니다.
AI 에이전트를 GitLab에 연결하는 방법: GitLab Core에 MCP 리소스를 구현한 과정
자율적인 AI 코딩 어시스턴트(예: Cline, Claude Desktop, Cursor, 그리고 Antigravity)가 단순 채팅 인터페이스에서 에이전트 워크플로우로 빠르게 발전함에 따라, **모델 컨텍스트 프로토콜 (Model Context Protocol, MCP)**은 LLM이 외부 시스템과 상호 작용할 수 있도록 하는 개방형 산업 표준으로 부상했습니다.
MCP는 모든 도구마다 취약한 맞춤 플러그인을 작성하는 대신, GitLab과 같은 애플리케이션이 자신의 프로젝트, 이슈, 머지 리퀘스트(merge requests), 및 텔레메트리를 깨끗한 JSON-RPC 인터페이스를 통해 모든 AI 클라이언트에 직접 노출할 수 있게 합니다.
최근 저는 GitLab Core에 두 가지 주요 머지 리퀘스트(merge request)를 기여했습니다:
- !260212 — MCP 리소스 및 리소스 템플릿 목록 엔드포인트 추가 (이슈 #584258 해결,
community-bonus::100태그) - !259119 — MCP 서버 JSON 스키마의 검색 범위 파라미터에 열거형 제약 추가 (이슈 #595159 해결).
본 글에서는 다음 내용을 단계별로 안내해 드립니다:
- 연결이 실패했던 이유 (
404 Method not found). - MCP 핸드셰이크 및 JSON-RPC 기능이 내부적으로 어떻게 작동하는지.
- GitLab의 모놀리식 Ruby on Rails 코드베이스에서 핸들러를 구현하고 검증한 방법.
- GitLab의 엔터프라이즈급 CI 파이프라인(Danger Bot, RuboCop, Predictive RSpec)을 탐색하며 배운 교훈.
1. 문제점: 핸드셰이크 연결 끊김 (The Handshake Disconnect)
MCP 클라이언트가 MCP 서버와 세션을 초기화할 때, initialize JSON-RPC 핸드셰이크로 시작합니다. 양쪽 모두 지원하는 기능을 선언합니다.
{
최신 MCP 클라이언트(예: Cline)가 GitLab의 MCP 서버에 연결할 때, 사용 가능한 컨텍스트를 즉시 확인하기 위해 다음 엔드포인트로 요청을 보냈습니다:
- `resources/list`
- `resources/templates/list`
하지만 GitLab 서버는 이 엔드포인트를 구현하거나 광고하지 않았기 때문에, 서버는 다음과 같이 응답했습니다:
{
"jsonrpc": "2.0",
"id": 2,
...
이 오류로 인해 AI 클라이언트는 GitLab 저장소를 탐색할 때 컨텍스트 인식 기능을 로드하지 못하거나 완전히 비활성화해야 했습니다.
## 2. 아키텍처 심층 분석: GitLab Core에서 MCP 작동 방식
GitLab의 MCP 서버 구현은 GitLab Core(`gitlab-org/gitlab`) 내에서 실행됩니다. 들어오는 JSON-RPC 요청은 파싱되어 전용 서비스 핸들러로 라우팅됩니다.
이 문제를 제대로 해결하려면 두 가지가 필요했습니다:
1. **기능 광고 (Advertise the Capability)**: `initialize` 핸드셰이크 중에 클라이언트에게 `resources`와 `resource templates`가 지원됨을 알려야 합니다.
2. **RPC 핸들러 구현**: `resources/list` 및 `resources/templates/list`를 라우팅하여 에이전트가 검사할 수 있는 구조화된 스키마와 URI를 반환하도록 해야 합니다.
### 단계 A: 초기화 핸드셰이크 업데이트
서버의 핸드셰이크 응답기에서, 우리는 `resources` 기능을 등록했습니다:
def server_capabilities
{
tools: { listChanged: false },
...
`resources: { ... }`를 광고함으로써, 연결하는 에이전트는 GitLab이 컨텍스트적 리소스(프로젝트 파일, 이슈 또는 파이프라인 로그 등)를 제공할 수 있음을 알게 됩니다.
### 단계 B: `resources/list` 및 `resources/templates/list` 구현
다음으로, 우리는 리소스 엔드포인트에 대한 요청 디스패처를 추가했습니다:
module Mcp
module Handlers
class ResourcesListHandler < BaseHandler
...
## 3. 스키마 강화: 에이전트 환각 방지 (!259119)
에이전트 상호 작용을 테스트하는 동안, 검색 도구와 관련된 또 다른 중요한 문제가 발생했습니다.
AI 에이전트는 도구 호출 인수를 생성하기 위해 JSON 스키마에 크게 의존합니다. GitLab 검색의 MCP 스키마에서 `scope` 매개변수는 단순히 `type: string`으로 정의되어 있었습니다.
### 취약점
LLM은 다음과 같은 유효하지 않은 스코프를 자주 환각(hallucinate)합니다:
- `"scope": "all"`
- `"scope": "code_and_issues"`
- `"scope": "mr"`
이러한 유효하지 않은 입력값은 서버 측에서 500 또는 400 오류를 발생시켰습니다.
### 해결 방법 (The Fix)
**Merge Request !259119**에서, 우리는 JSON Schema에 명시적인 `enum` 제약 조건을 도입했습니다:
{
"scope": {
"type": "string",
...
스키마를 제한함으로써, 구조화된 함수 호출(structured function calling)을 지원하는 최신 LLM(Claude 3.7 / 3.5 Sonnet, Gemini 2.0 / 1.5 Pro, GPT-4o)은 100%의 확률로 구문적으로 유효한 검색 매개변수를 생성하도록 보장됩니다.
## 4. GitLab 엔터프라이즈 CI 및 코드 리뷰 탐색하기
GitLab Core에 기여하는 것은 단순히 코드를 작성하는 것 이상의 의미를 가집니다. 이는 오픈 소스 세계에서 가장 엄격한 CI/CD 테스트 파이프라인 중 하나를 통과해야 함을 의미합니다.
`gitlab-org/gitlab`에 Merge Request를 제출하면, 다음과 같은 파이프라인이 실행됩니다:
1. **Danger Bot**: 변경 로그 항목, 커밋 메시지 형식, 문서 업데이트 및 라이선스 준수 여부를 확인합니다.
2. **RuboCop**: GitLab의 엄격한 Ruby 스타일 가이드와 AST 규칙을 강제합니다.
3. **Predictive RSpec**: 수만 개의 단위 테스트 중 관련성이 있는 테스트 스위트만을 동적으로 선택하고 실행합니다.
### RSpec 테스트 작성하기
회귀(regressions)가 없음을 보장하기 위해, 우리는 성공 사례와 엣지 케이스를 모두 포괄하는 종합적인 단위 명세(unit specs)를 추가했습니다:
spec/lib/mcp/handlers/resources_list_handler_spec.rb
RSpec.describe Mcp::Handlers::ResourcesListHandler, feature_category: :ai_abstraction do
subject(:handler) { described_class.new(params) }
...
두 Merge Request 모두 다음을 통과했습니다:
- `danger-review`
- `rubocop`
- `rspec:predictive`
- `rspec-ee:predictive`
두 MR은 GitLab 유지 관리자들로부터 승인되어 메인 릴리스에 병합되었습니다!
## 5. 엔드투엔드 검증: AI 에이전트로 테스트하기
이러한 변경 사항들이 병합되면서, AI 에이전트(예: VS Code의 Cline 또는 Claude Desktop)를 구성하는 것이 매우 쉬워졌습니다.
### `claude_desktop_config.json` 설정:
{
"mcpServers": {
"gitlab": {
...
이제 다음과 같이 프롬프트를 입력하면:
> _"프로젝트 #123456의 열려 있는 보안 이슈 목록을 나열하고 현재 브랜치를 기반으로 패치를 제안해 주세요."
AI 에이전트는:
1. GitLab MCP 서버에 연결합니다.
2. 핸드셰이크 실패 없이 `resources`와 `tools`를 발견합니다.
3. 컨텍스트를 프롬프트 창으로 직접 가져옵니다.
4. 엄격하고 검증된 열거형(enum) 범위를 사용하여 검색을 실행합니다.
## 6. GitLab에 기여하는 방법 시작하기
오픈 소스 분야에 진출하거나 엔터프라이즈 개발자 도구에 기여하려는 엔지니어라면 다음 방법을 활용할 수 있습니다:
1. **GitLab 이슈 보드 확인**: `community-bonus` 또는 `quick win`으로 필터링된 이슈를 확인하세요. GitLab은 [GitLab Contributor Platform](https://contributors.gitlab.com)을 통해 기여자들에게 적극적으로 보상합니다.
2. **GitLab Development Kit (GDK) 활용**: 제출하기 전에 로컬에서 변경 사항을 테스트해 보세요.
3. **작업 내용 문서화**: 자신이 만든 것을 공유하세요! 개발자 커뮤니티는 실제 엔지니어링 워크스루를 통해 성장합니다.
_MCP에 대한 질문이나 GitLab Core 기여 방법에 대해 궁금한 점이 있나요? 아래에 댓글을 남겨주세요!_
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기