MCP 是什麼
**Model Context Protocol(MCP)**是讓 AI 用戶端(Claude、Cursor、GitHub Copilot 等)與應用程式以標準化協定通訊的規格。實作 MCP 伺服器後,AI 代理即可存取 Laravel 應用程式的資料,或執行某些動作。Laravel MCP 是 Laravel 13 新增的官方套件。以
laravel/mcp 提供,含構建 MCP 伺服器所需的一整套功能。安裝
以 Composer 安裝套件。vendor:publish 產生 routes/ai.php。
routes/ai.php,在此註冊 MCP 伺服器。
建立伺服器
以make:mcp-server Artisan 指令建立伺服器類別。
app/Mcp/Servers 目錄產生類別。
註冊伺服器
建立好伺服器後,在routes/ai.php 註冊。可分為 Web 伺服器 與 本機伺服器 兩種。
Web 伺服器
Web 伺服器透過 HTTP POST 請求存取。適合遠端 AI 用戶端或以 Web 為基礎的整合。本機伺服器
本機伺服器以 Artisan 指令運行,用於與 Claude Desktop 等本機 AI 用戶端整合。工具
工具是 AI 用戶端可呼叫的函式,可實作資料取得、外部 API 整合、資料庫操作等。建立工具
以make:mcp-tool 產生工具類別。
$tools:
工具的名稱與說明
Laravel 會從類別名稱自動產生名稱與標題。例如CurrentWeatherTool 名稱為 current-weather、標題為 Current Weather Tool。可透過 Name、Title 屬性自訂。
輸入 schema
在schema 方法中定義輸入參數的 schema,可用 Laravel 的 JSON schema builder 指定型別與限制。
輸出 schema
透過outputSchema 定義回應結構,能讓 AI 用戶端更容易解析回應。
驗證
可在handle 中使用 Laravel 標準驗證功能。
依賴注入
工具透過 Laravel 服務容器解析,可在建構子或handle 方法中以型別提示注入依賴。
註解
可為工具加上註解,向 AI 用戶端提供有關工具行為的額外資訊。有條件註冊
實作shouldRegister 可在執行期依條件註冊工具。
false 時,該工具便不會出現在 AI 用戶端可見範圍。
回應
工具必須回傳Laravel\Mcp\Response 實例。
文字回應
文字回應
錯誤回應
錯誤回應
圖片 / 音訊回應
圖片 / 音訊回應
多內容回應
多內容回應
結構化回應
結構化回應
回傳 AI 用戶端易於解析的結構化資料。
串流回應
串流回應
對於耗時處理,可即時送出進度。
提示(Prompts)
提示是可重複使用的提示樣板。當 AI 用戶端與語言模型互動時,可用標準化形式提供固定的查詢。建立提示
$prompts:
提示的引數
在arguments 方法中定義提示參數。
驗證
提示引數會依定義自動驗證,也能加入更複雜的驗證規則。 Laravel MCP 與 Laravel 驗證無縫整合。可在提示的handle 中驗證引數。
依賴注入
提示透過 Laravel 服務容器解析,可在建構子或handle 以型別提示注入依賴。
handle 中也能以型別提示注入。
有條件註冊
實作shouldRegister 可依執行期條件註冊提示。
false 時,該提示對 AI 用戶端不可見,也無法呼叫。
提示的回應
在提示的handle 可回傳使用者訊息或助理訊息。使用 asAssistant() 表示助理訊息。
資源(Resources)
資源是 AI 用戶端可作為脈絡讀取的資料或資訊,例如文件、設定資訊或動態資料等,提升 AI 回應品質。建立資源
$resources:
URI 與 MIME 類型
預設會依類別名稱自動產生 URI(例如weather://resources/weather-guidelines)。可用 Uri 與 MimeType 屬性自訂。
資源樣板
若要定義擁有 URI 變數的動態資源,可實作HasUriTemplate 介面。
get 取得。
資源的請求
與工具、提示不同,資源不能定義輸入 schema 或引數。但在handle 中仍可透過 request 存取請求資訊。
資源的依賴注入
資源透過 Laravel 服務容器解析,可在建構子或handle 以型別提示注入依賴。
handle 中亦可注入。
資源的註解
資源可加上受眾、優先度、最後修改時間等註解。資源的有條件註冊
實作shouldRegister 可依執行期條件註冊資源。
false 時,該資源對 AI 用戶端不可見亦不可存取。
資源的回應
資源必須回傳Laravel\Mcp\Response 實例。
以 text 回傳文字內容:
資源連結回應
以resourceLink 回傳資源連結。與內嵌資源不同,回傳的是 URI pointer,AI 用戶端會另行取得。
Blob 回應
以blob 回傳二進位內容,MIME 類型由資源的 #[MimeType] 屬性設定。
錯誤回應
以error 表示錯誤。
App
Laravel MCP 支援 MCP Apps。它是 Model Context Protocol 的延伸功能,可在支援的主機沙盒 iframe 中,讓工具渲染出互動式 HTML 應用程式。因此可打造超越純文字回應的儀表板、表單、視覺化等豐富體驗。 MCP app 由下列 2 部分協同運作:- App 資源 — 回傳應用程式獨立的 HTML。
- 工具 — 透過
#[RendersApp]屬性連結到 App 資源。工具被呼叫時,主機會取得連結的資源並渲染。
建立 App 資源
以make:mcp-app-resource Artisan 指令建立 App 資源。
app/Mcp/Resources 的 PHP 類別,以及 resources/views/mcp 的 Blade 視圖。視圖名稱依類別自動推測,例如 WeatherDashboardApp 對應到 mcp.weather-dashboard-app。
AppResource 繼承基底 Resource,自動設定 MCP Apps 規格所要求的 ui:// URI scheme 與 text/html;profile=mcp-app MIME 類型。與其他資源一樣,需要註冊到伺服器的 $resources。
產生的 Blade 視圖使用 <x-mcp::app> 元件。此元件會渲染一份包裝了用戶端 MCP SDK 的完整 HTML 文件。
createMcpApp 由捆綁的 SDK 提供,會處理 iframe 對伺服器的連線、套用主機主題、公開 callServerTool、sendMessage、openLink 等輔助方法與事件回呼。完整用戶端 API 請參閱 MCP Apps 規格。
從工具渲染 App
要顯示 App 資源,透過#[RendersApp] 屬性將工具連結到資源。當工具被呼叫時,Laravel MCP 會將資源的 URI 附加到工具中繼資料,讓主機能於沙盒 iframe 內渲染此 app。
當
AppResource 已註冊,Laravel MCP 會自動宣告 io.modelcontextprotocol/ui 能力,無需額外伺服器設定。App 工具的可見性
每個#[RendersApp] 工具可用 visibility 引數限制呼叫者。這對於 UI 用來載入 / 更新資料、但不希望被模型看見的私有 app 專用工具很有用。
Visibility enum 有 Model 與 App 兩個值,預設兩者皆有。若工具只供 UI 直接呼叫請用 [Visibility::App];若要讓 UI 無法使用該工具則用 [Visibility::Model]。
App 設定
在 App 資源的#[AppMeta] 屬性中,可設定 iframe 的 Content Security Policy、瀏覽器權限,以及要放入視圖 <head> 的函式庫腳本。
Library enum 預先設定了 Library::Tailwind、Library::Alpine 等常見前端函式庫 CDN 腳本,其 CDN 來源會自動加入 CSP。Permission enum 涵蓋 Camera、Microphone、Geolocation、ClipboardWrite 等瀏覽器權限。
用 Boost 開發 App
Laravel MCP 附有專供構建 MCP Apps 的Boost 技能參考。若已安裝 Laravel Boost,AI 編碼代理可呼叫mcp-development 技能,自動產生 App 資源、Blade 視圖與連結的工具。
完整協定參考(含用戶端 API 與 schema 細節)請參閱官方 MCP Apps 文件。
Meta 資料
可將 MCP 規格的_meta 欄位附加到工具、資源、提示的回應上。
Response::make:
$meta 屬性:
圖示
MCP 用戶端可為伺服器與其原語顯示圖示。以Icon 屬性可為伺服器、工具、資源、提示宣告圖示。
Icon 屬性可重複使用,可宣告不同大小或明暗主題的變體。
或者,覆寫 icons 方法以程式化定義圖示,適合圖示依執行期條件時。
icons 方法定義的圖示會自動合併。圖示路徑解析規則如下:
- 具有
https:或data:等 URI scheme 的路徑會原樣使用。 - 相對路徑會透過 Laravel 的
asset輔助函式解析為 URL。
認證
Web 伺服器可用 Laravel 的標準中介軟體進行認證。Sanctum
使用 Laravel Sanctum 的 token 認證。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 自訂請求逾時:
命名用戶端
不必每次都重新建構,可註冊可重用的命名用戶端。通常在 service provider 的boot 中透過 Mcp Facade 進行。
用戶端認證
若要連線至受 Bearer token 保護的 Web MCP 伺服器,使用withToken。可傳入 token 字串或延遲解析的閉包。
withOAuth:
若 MCP 伺服器支援動態用戶端註冊,可省略
clientId 與 clientSecret,用戶端會自動註冊。routes/ai.php 中,用 oAuthRoutesFor 為命名用戶端註冊 OAuth 路由。傳入的閉包會在授權碼與 access token 交換完成後收到用戶端名稱與 TokenSet。
mcp.oauth.{client}.connect),以及交換授權碼並呼叫 handler 的 callback 路由(mcp.oauth.{client}.callback)。兩者皆使用 web 中介軟體群組(可透過 middleware 引數覆寫)。
開始授權流程時,將使用者導向 connect 路由:
工具
透過tools 取得 MCP 伺服器公開的工具,回傳以名稱為 key 的集合。
limit 限制數量。
callTool 傳入工具名稱與引數陣列。回傳的 ToolResult 實例可取得回應。
提示
透過prompts 取得 MCP 伺服器公開的提示,回傳以名稱為 key 的集合。
limit 限制數量。
getPrompt 傳入名稱與引數陣列,回傳的 PromptResult 可取得產生的訊息。
資源
透過resources 取得 MCP 伺服器公開的資源,回傳以 URI 為 key 的集合。
limit 限制。
readResource 傳入 URI,回傳 ResourceReadResult 可取得內容。
測試
MCP Inspector
用互動式除錯工具「MCP Inspector」確認 MCP 伺服器行為。單元測試
可為工具、資源、提示撰寫單元測試。actingAs。
assertHasErrors / assertHasNoErrors:
assertSentNotification 與 assertNotificationCount。
dd 或 dump。