Skip to main content

MCP 서버란(고급 해설)

Model Context Protocol(MCP) 은 AI 클라이언트(Claude, Cursor, GitHub Copilot 등)와 애플리케이션이 표준화된 프로토콜로 통신하기 위한 사양입니다. MCP에는 3가지 주요 프리미티브가 있습니다. Laravel에서 MCP 서버를 구축하는 이점은 Eloquent, 캐시, 인증, 유효성 검증과 같은 Laravel 생태계를 그대로 활용할 수 있다는 점입니다.
이 고급 가이드에서는 실전 구현에 초점을 맞춥니다. MCP의 기본 개념은 중급: Laravel MCP를 참조하세요.

설치와 초기 설정

1

패키지 설치

Composer로 패키지를 설치합니다.
2

라우트 파일 공개

vendor:publish로 MCP 서버 등록 위치가 되는 routes/ai.php를 생성합니다.
3

서버 클래스 생성

Artisan 명령어로 서버 클래스를 생성합니다.
생성된 app/Mcp/Servers/DatabaseServer.php에 도구, 리소스, 프롬프트를 등록합니다.
4

서버 등록

routes/ai.php에서 서버를 라우트에 등록합니다.
Web 서버는 HTTP POST를 통해 접근합니다. 로컬 서버는 Artisan 명령어로 동작하며 CLI 기반 AI 클라이언트와의 연동에 사용됩니다.

도구 구현

도구는 AI 클라이언트가 호출할 수 있는 함수입니다. Laravel의 서비스 컨테이너, 유효성 검증, Eloquent를 그대로 사용할 수 있습니다.

도구 생성

생성된 클래스에 handle 메서드와 schema 메서드를 구현합니다.

파라미터 정의(스키마)

schema 메서드에서 Illuminate\Contracts\JsonSchema\JsonSchema 빌더를 사용해 받아들일 파라미터를 정의합니다.

도구 어노테이션

MCP 프로토콜의 어노테이션을 사용하면 AI 클라이언트가 도구의 안전성을 판단할 수 있습니다.

구조화된 응답

AI 클라이언트가 파싱하기 쉬운 JSON 형식의 응답을 반환하려면 Response::structured를 사용합니다.

스트리밍 응답

장시간이 걸리는 처리에서는 Generator를 반환하여 도중 진행 상황을 스트리밍할 수 있습니다.
Web 서버에서는 스트리밍 응답이 자동으로 SSE(Server-Sent Events) 스트림으로 전송됩니다.

조건부 등록

특정 조건을 충족하는 사용자에게만 도구를 공개할 수 있습니다.

리소스 구현

리소스는 AI 클라이언트가 컨텍스트로 읽어 오는 데이터입니다. 문서, 설정 정보, 동적 데이터를 제공합니다.

정적 리소스

동적 리소스(URI 템플릿)

URI 템플릿을 사용하면 URL의 파라미터를 기반으로 동적인 리소스를 제공할 수 있습니다.
AI 클라이언트는 app://users/42/profile과 같은 URI로 리소스를 요청하며, {userId}의 값은 $request->get('userId')로 가져올 수 있습니다.

리소스 어노테이션

리소스의 우선순위나 대상 오디언스를 명시할 수 있습니다.

프롬프트 구현

프롬프트는 AI 클라이언트가 사용할 수 있는 재사용 가능한 템플릿입니다. 정형적인 쿼리나 복잡한 워크플로를 표준화합니다.

프롬프트 생성

asAssistant()를 사용하면 메시지가 AI 어시스턴트의 발언으로 취급됩니다. 시스템 프롬프트와 사용자 메시지를 조합하여 AI의 동작을 세밀하게 제어할 수 있습니다.

인증과 인가

Sanctum을 이용한 토큰 인증

가장 간단한 인증 방식입니다. MCP 클라이언트는 Authorization: Bearer <token> 헤더를 부여합니다.

OAuth 2.1을 이용한 인증

보다 견고한 인증을 위해서는 Laravel Passport를 사용합니다.
OAuth 인증을 사용할 경우, MCP에서 제공하는 인가 뷰를 공개하고 AppServiceProvider에 설정합니다.

커스텀 미들웨어를 이용한 인증

자체 API 토큰을 사용하는 경우, 커스텀 미들웨어로 Authorization 헤더를 검증합니다.

도구 내부에서의 인가

도구나 리소스의 handle 메서드 내부에서 $request->user()를 사용하여 세밀한 인가 검사를 할 수 있습니다.
shouldRegister는 도구를 목록에서 숨기기만 합니다. 도구가 호출될 때의 인가 검사는 반드시 handle 메서드 내부에서 수행하세요.

실전 예제: 데이터베이스 조작 도구

Eloquent를 사용해 데이터를 검색·생성하는 도구의 전체 구현 예제입니다.

서버 클래스

검색 도구(읽기 전용)

생성 도구(쓰기)

실전 예제: 파일 시스템 조작 도구

Storage 파사드를 사용하여 파일을 조작하는 도구의 구현 예제입니다.
파일 조작 도구에서는 반드시 경로 새니타이즈를 수행하여, 허용된 디렉터리 이외로의 접근을 차단하세요. ..를 포함하는 경로는 거부하는 것이 중요합니다.

테스트

MCP 서버, 도구, 리소스, 프롬프트는 Laravel 표준 테스트 기능으로 유닛 테스트를 작성할 수 있습니다.

도구 테스트

Server::tool() 메서드로 도구를 직접 호출하여 테스트합니다.

리소스와 프롬프트 테스트

주요 어설션 메서드

MCP Inspector를 이용한 디버깅

인터랙티브한 디버깅에는 MCP Inspector를 사용합니다.

배포 시 고려 사항

HTTP 스트리밍과 SSE

Web 서버에서 스트리밍 응답(Generator)을 사용하는 경우, 서버 설정을 확인하세요.

Laravel Octane과의 조합

트래픽이 많은 MCP 서버에서는 Laravel Octane(FrankenPHP 또는 Swoole) 사용을 검토하세요. 요청당 오버헤드가 크게 줄어듭니다.
Octane을 사용할 때는 요청 간에 상태가 공유됩니다. 도구 내부에서 정적 프로퍼티나 전역 상태를 사용하지 않도록 주의하세요.

레이트 리밋

throttle 미들웨어로 MCP 서버에 대한 요청을 제한합니다.

캐시

자주 호출되는 읽기 전용 도구에는 캐시를 활용합니다.

로그와 모니터링

MCP 도구 호출을 로그에 기록하면 AI 클라이언트의 이용 상황을 파악할 수 있습니다.
프로덕션 환경에서는 Laravel Telescope나 Sentry를 사용하여 MCP 서버의 성능과 예외를 모니터링하는 것을 권장합니다.
마지막 수정일 2026년 7월 13일