MCP 란
Model Context Protocol(MCP) 은 AI 클라이언트(Claude, Cursor, GitHub Copilot 등)와 애플리케이션이 표준화된 프로토콜로 통신하기 위한 사양입니다. MCP 서버를 구현함으로써 AI 에이전트는 여러분의 Laravel 애플리케이션의 데이터에 접근하거나 액션을 실행할 수 있게 됩니다.Laravel MCP는 Laravel 13에서 추가된 공식 패키지입니다.
laravel/mcp로 제공되며, MCP 서버의 구축에 필요한 일련의 기능을 제공합니다.설치
Composer로 패키지를 설치합니다.vendor:publish Artisan 명령어를 실행해 routes/ai.php 파일을 생성합니다.
routes/ai.php 파일이 작성됩니다. 여기에 MCP 서버의 등록을 기술합니다.
서버의 작성
make:mcp-server Artisan 명령어로 서버 클래스를 생성합니다.
app/Mcp/Servers 디렉터리에 서버 클래스가 생성됩니다.
서버의 등록
서버를 작성했다면routes/ai.php에서 등록합니다. 등록 방법에는 Web 서버와 로컬 서버의 2종류가 있습니다.
Web 서버
Web 서버는 HTTP POST 요청으로 접근할 수 있습니다. 원격 AI 클라이언트나 Web 기반의 연계에 최적입니다.로컬 서버
로컬 서버는 Artisan 명령어로서 동작합니다. Claude Desktop 등의 로컬 AI 클라이언트와의 연계에 사용합니다.도구
도구는 AI 클라이언트가 호출할 수 있는 함수입니다. 데이터의 취득, 외부 API와의 연계, 데이터베이스의 조작 등을 구현할 수 있습니다.도구의 작성
make:mcp-tool Artisan 명령어로 도구 클래스를 생성합니다.
$tools 프로퍼티에 등록합니다.
도구의 이름과 설명
클래스 이름에서 기본 이름과 타이틀이 자동 생성됩니다.CurrentWeatherTool이라면 이름은 current-weather, 타이틀은 Current Weather Tool이 됩니다. Name과 Title 속성으로 커스터마이즈할 수 있습니다.
입력 스키마
schema 메서드로 입력 파라미터의 스키마를 정의합니다. Laravel의 JSON 스키마 빌더를 사용해 타입이나 제약을 지정할 수 있습니다.
출력 스키마
outputSchema 메서드로 응답의 구조를 정의할 수 있습니다. AI 클라이언트가 응답을 해석하기 쉬워집니다.
밸리데이션
handle 메서드 내에서 Laravel의 표준 밸리데이션 기능을 사용할 수 있습니다.
의존성 주입
Laravel의 서비스 컨테이너를 통해 도구가 해결되므로, 생성자나handle 메서드에서 의존 관계를 타입 힌트할 수 있습니다.
어노테이션
도구에 어노테이션을 추가함으로써 AI 클라이언트에 도구의 거동에 관한 추가 정보를 제공할 수 있습니다.조건부 등록
shouldRegister 메서드를 구현함으로써 실행 시에 도구를 조건부로 등록할 수 있습니다.
false를 반환하면 그 도구는 AI 클라이언트로부터 보이지 않게 됩니다.
응답
도구는Laravel\Mcp\Response의 인스턴스를 반환해야 합니다.
텍스트 응답
텍스트 응답
에러 응답
에러 응답
이미지·음성 응답
이미지·음성 응답
여러 콘텐츠의 응답
여러 콘텐츠의 응답
구조화 응답
구조화 응답
AI 클라이언트가 해석하기 쉬운 구조화 데이터를 반환합니다.
스트리밍 응답
스트리밍 응답
장시간 걸리는 처리로 도중 경과를 실시간 전송합니다.
프롬프트
프롬프트는 재사용 가능한 프롬프트 템플릿입니다. AI 클라이언트가 언어 모델과 대화할 때 사용하는 정형적인 쿼리를 표준화된 형태로 제공할 수 있습니다.프롬프트의 작성
$prompts 프로퍼티에 등록합니다.
프롬프트의 인수
arguments 메서드로 프롬프트의 파라미터를 정의합니다.
밸리데이션
프롬프트의 인수는 정의에 기반해 자동으로 밸리데이션되지만, 더 복잡한 밸리데이션 룰을 적용할 수도 있습니다. Laravel MCP는 Laravel의 밸리데이션 기능과 매끄럽게 연계합니다. 프롬프트의handle 메서드 내에서 인수를 밸리데이션할 수 있습니다.
의존성 주입
Laravel의 서비스 컨테이너를 통해 프롬프트가 해결되므로, 생성자나handle 메서드에서 의존 관계를 타입 힌트할 수 있습니다.
handle 메서드에서도 타입 힌트할 수 있으며, 서비스 컨테이너가 자동으로 해결·주입합니다.
조건부 등록
shouldRegister 메서드를 구현함으로써 실행 시에 프롬프트를 조건부로 등록할 수 있습니다.
false를 반환하면 그 프롬프트는 AI 클라이언트로부터 보이지 않게 되며, 호출도 할 수 없게 됩니다.
프롬프트의 응답
프롬프트의handle 메서드에서는 사용자 메시지와 어시스턴트 메시지를 반환할 수 있습니다. asAssistant()로 어시스턴트 측 메시지로서 취급합니다.
리소스
리소스는 AI 클라이언트가 컨텍스트로서 읽어 들일 수 있는 데이터나 정보입니다. 문서, 설정 정보, 동적 데이터 등, AI의 응답 품질을 향상시키는 정보를 제공할 수 있습니다.리소스의 작성
$resources 프로퍼티에 등록합니다.
URI 와 MIME 타입
기본적으로 클래스 이름에서 URI가 자동 생성됩니다(예:weather://resources/weather-guidelines). Uri와 MimeType 속성으로 커스터마이즈할 수 있습니다.
리소스 템플릿
URI 변수를 가진 동적 리소스를 정의하려면HasUriTemplate 인터페이스를 구현합니다.
get 메서드로 취득할 수 있습니다.
리소스의 요청
도구나 프롬프트와 달리 리소스는 입력 스키마나 인수를 정의할 수 없습니다. 다만handle 메서드 내에서 요청 객체를 통해 요청 정보에 접근할 수 있습니다.
리소스의 의존성 주입
Laravel의 서비스 컨테이너를 통해 리소스가 해결되므로, 생성자나handle 메서드에서 의존 관계를 타입 힌트할 수 있습니다.
handle 메서드에서도 타입 힌트할 수 있으며, 서비스 컨테이너가 자동으로 해결·주입합니다.
리소스의 어노테이션
리소스에는 오디언스, 우선도, 최종 업데이트일 등의 어노테이션을 붙일 수 있습니다.리소스의 조건부 등록
shouldRegister 메서드를 구현함으로써 실행 시에 리소스를 조건부로 등록할 수 있습니다.
false를 반환하면 그 리소스는 AI 클라이언트로부터 보이지 않게 되며, 접근도 할 수 없게 됩니다.
리소스의 응답
리소스는Laravel\Mcp\Response의 인스턴스를 반환해야 합니다.
텍스트 콘텐츠에는 text 메서드를 사용합니다.
리소스 링크 응답
resourceLink 메서드로 리소스 링크를 반환할 수 있습니다. 매입 리소스와 달리 AI 클라이언트가 독립적으로 취득하는 URI 포인터를 반환합니다.
Blob 응답
바이너리 콘텐츠를 반환하려면blob 메서드를 사용합니다. MIME 타입은 리소스의 #[MimeType] 속성으로 설정합니다.
에러 응답
에러를 나타내는 경우error 메서드를 사용합니다.
앱
Laravel MCP는 MCP Apps를 지원합니다. 이것은 Model Context Protocol의 확장 기능으로, 도구가 지원된 호스트 내의 샌드박스 iframe 상에서 인터랙티브한 HTML 애플리케이션을 렌더링할 수 있게 합니다. 이에 따라 플레인 텍스트 응답을 넘어선 대시보드, 폼, 시각화, 그 외의 리치한 경험을 구축할 수 있습니다. MCP 앱은 다음 2개의 파트가 연계되어 동작합니다.- 앱 리소스 — 애플리케이션의 자기 완결형 HTML을 반환합니다.
- 도구 —
#[RendersApp]어트리뷰트를 사용해 앱 리소스에 링크됩니다. 도구가 호출되면 호스트가 링크된 리소스를 취득해 렌더링합니다.
앱 리소스의 작성
make:mcp-app-resource Artisan 명령어로 앱 리소스를 작성할 수 있습니다.
app/Mcp/Resources 내의 PHP 클래스와 resources/views/mcp 내의 Blade 뷰입니다. 뷰 이름은 클래스 이름에서 자동으로 추측됩니다. 예를 들어 WeatherDashboardApp은 mcp.weather-dashboard-app으로 매핑됩니다.
AppResource는 베이스의 Resource 클래스를 상속하며, MCP Apps 사양에서 요구되는 ui:// URI 스킴과 text/html;profile=mcp-app MIME 타입을 자동으로 설정합니다. 다른 리소스와 마찬가지로 서버의 $resources 배열에 등록해야 합니다.
생성된 Blade 뷰는 <x-mcp::app> 컴포넌트를 사용합니다. 이 컴포넌트는 클라이언트 사이드의 MCP SDK가 번들된 완전한 HTML 문서를 렌더링합니다.
createMcpApp 글로벌 함수는 번들된 SDK가 제공합니다. iframe의 서버에의 접속, 호스트 테마의 적용, callServerTool·sendMessage·openLink 등의 헬퍼나 이벤트 콜백의 공개를 처리합니다. 완전한 클라이언트 사이드 API에 대해서는 MCP Apps 사양을 참조해 주십시오.
도구에서 앱을 렌더링
앱 리소스를 표시하려면#[RendersApp] 어트리뷰트를 사용해 도구에 링크합니다. 도구가 호출되면 Laravel MCP는 리소스의 URI를 도구의 메타데이터에 포함시켜, 호스트가 샌드박스 iframe 내에서 앱을 렌더링할 수 있게 합니다.
AppResource가 등록되면 Laravel MCP는 자동으로 io.modelcontextprotocol/ui 케이퍼빌리티를 어드버타이즈합니다. 추가의 서버 설정은 불필요합니다.앱 도구의 가시성
각#[RendersApp] 도구는 visibility 인수로 호출자를 제한할 수 있습니다. 이것은 UI가 데이터를 읽어 들이거나 업데이트하기 위해 호출하는 프라이빗한 앱 전용 도구를 모델로부터 보이지 않게 하는 경우에 편리합니다.
Visibility enum에는 Model과 App의 2개의 케이스가 있으며, 기본은 양쪽입니다. UI가 직접 호출하는 백엔드 액션에는 [Visibility::App]을, UI에서 도구를 이용 불가능하게 하려면 [Visibility::Model]을 사용합니다.
앱의 설정
앱 리소스의#[AppMeta] 어트리뷰트로 iframe의 Content Security Policy, 브라우저 권한, 뷰의 <head>에 포함시킬 라이브러리 스크립트를 설정합니다.
Library enum에는 Library::Tailwind나 Library::Alpine 등 일반적인 프런트엔드 라이브러리의 CDN 스크립트가 사전 설정되어 있으며, CDN 오리진은 자동으로 CSP에 머지됩니다. Permission enum은 Camera·Microphone·Geolocation·ClipboardWrite 등의 브라우저 권한을 커버합니다.
Boost 를 사용한 앱 개발
Laravel MCP에는 MCP Apps를 구축하기 위한 전용 Boost 스킬 레퍼런스가 포함되어 있습니다. Laravel Boost가 설치되어 있다면, AI 코딩 에이전트가mcp-development 스킬을 호출해 앱 리소스, Blade 뷰, 링크된 도구를 자동 생성할 수 있습니다.
프로토콜의 완전한 레퍼런스(클라이언트 사이드 API나 스키마의 상세 포함)에 대해서는 공식의 MCP Apps 문서를 참조해 주십시오.
메타데이터
MCP 사양의_meta 필드를 도구, 리소스, 프롬프트의 응답에 부가할 수 있습니다.
Response::make를 사용합니다.
$meta 프로퍼티를 정의합니다.
아이콘
MCP 클라이언트는 서버와 그 프리미티브의 아이콘을 표시할 수 있습니다.Icon 속성을 사용해 서버, 도구, 리소스, 프롬프트에 아이콘을 선언할 수 있습니다.
Icon 속성은 반복 사용 가능하므로, 서로 다른 사이즈나 라이트·다크 테마의 배리언트를 제공하기 위해 여러 아이콘을 선언할 수 있습니다.
또는 icons 메서드를 오버라이드해 프로그램으로 아이콘을 정의할 수도 있습니다. 이것은 아이콘이 런타임의 조건에 의존하는 경우에 편리합니다.
icons 메서드로 정의된 아이콘은 자동으로 결합됩니다. 아이콘 경로는 다음과 같이 해결됩니다.
https:나data:등의 URI 스킴을 갖는 경로는 그대로 사용됩니다.- 상대 경로는 Laravel의
asset헬퍼를 사용해 URL로 해결됩니다.
인증
Web 서버는 Laravel의 표준적인 미들웨어로 인증할 수 있습니다.Sanctum
Laravel Sanctum을 사용한 토큰 인증입니다. MCP 클라이언트는Authorization: Bearer <token> 헤더를 전송합니다.
OAuth 2.1
Laravel Passport를 사용한 OAuth 인증입니다. 더 견고한 보안이 필요한 경우에 적합합니다.인가
$request->user()로 인증된 사용자를 취득해, 도구나 리소스 내에서 인가 체크를 할 수 있습니다.
MCP 클라이언트
Laravel MCP는 서버의 구축뿐 아니라, 다른 MCP 서버로 접속하기 위한 클라이언트도 제공하고 있습니다. 클라이언트를 사용함으로써 외부 MCP 서버가 공개하는 도구를 발견·호출할 수 있습니다. AI 에이전트에 외부 MCP 서버의 기능을 제공할 때 특히 유용합니다.서버에의 접속
HTTP로 접근할 수 있는 MCP 서버에는Client::web 메서드를 사용하고, 서버의 URL을 전달합니다.
Client::local 메서드를 사용하고, 명령어와 인수를 전달합니다.
connect, connected, ping, disconnect 메서드를 사용합니다.
withTimeout 메서드로 요청 타임아웃을 커스터마이즈할 수 있습니다.
이름 있는 클라이언트
클라이언트를 매번 구축하는 대신, 재사용 가능한 이름 있는 클라이언트를 등록할 수 있습니다. 통상은Mcp 파사드를 사용하고, 서비스 프로바이더의 boot 메서드 내에서 수행합니다.
클라이언트 인증
Bearer 토큰으로 보호되어 있는 Web MCP 서버로 접속하려면withToken 메서드를 사용합니다. 토큰 문자열 또는 지연 해결하는 클로저를 전달할 수 있습니다.
withOAuth 메서드를 사용합니다.
MCP 서버가 동적 클라이언트 등록을 지원하고 있는 경우,
clientId와 clientSecret은 생략할 수 있습니다. 클라이언트가 자동 등록합니다.routes/ai.php 파일에서 이름 있는 클라이언트의 OAuth 라우트를 oAuthRoutesFor 메서드를 사용해 등록합니다. 전달하는 클로저는 인가 코드와 액세스 토큰이 교환된 후에 클라이언트 이름과 TokenSet을 받습니다.
mcp.oauth.{client}.connect)와, 인가 코드를 교환해 핸들러를 호출하는 callback 라우트(mcp.oauth.{client}.callback)입니다. 어느 쪽도 web 미들웨어 그룹을 사용합니다(middleware 인수로 덮어쓰기 가능).
인가 플로우를 개시하려면 사용자를 connect 라우트로 리다이렉트합니다.
도구
tools 메서드로 MCP 서버가 공개하는 도구를 취득합니다. 이름을 키로 한 컬렉션으로서 반환됩니다.
limit 인수로 취득 수를 제한할 수 있습니다.
callTool 메서드를 사용하고, 도구 이름과 인수의 배열을 전달합니다. 반환되는 ToolResult 인스턴스로 응답을 취득합니다.
프롬프트
prompts 메서드로 MCP 서버가 공개하는 프롬프트를 취득합니다. 이름을 키로 한 컬렉션으로서 반환됩니다.
limit 인수로 취득 수를 제한할 수 있습니다.
getPrompt 메서드를 사용하고, 프롬프트 이름과 인수의 배열을 전달합니다. 반환되는 PromptResult 인스턴스로 생성된 메시지를 취득할 수 있습니다.
리소스
resources 메서드로 MCP 서버가 공개하는 리소스를 취득합니다. URI를 키로 한 컬렉션으로서 반환됩니다.
limit 인수로 취득 수를 제한할 수 있습니다.
readResource 메서드를 사용하고, 리소스의 URI를 전달합니다. 반환되는 ResourceReadResult 인스턴스로 리소스의 콘텐츠를 취득할 수 있습니다.
테스트
MCP Inspector
MCP 서버의 동작 확인에는 인터랙티브한 디버그 도구 “MCP Inspector”를 사용합니다.유닛 테스트
도구·리소스·프롬프트에 대해 유닛 테스트를 쓸 수 있습니다.actingAs를 사용합니다.
assertHasErrors / assertHasNoErrors를 사용합니다.
assertSentNotification과 assertNotificationCount를 사용합니다.
dd 또는 dump 메서드를 사용합니다.