什么是 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 服务器 和 本地服务器 两种注册方式。
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
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() 标记为助手侧消息。
资源
资源是 AI 客户端可以作为上下文读取的数据或信息。可以提供文档、配置、动态数据等,帮助提升 AI 回答的质量。创建资源
$resources 属性中。
URI 与 MIME 类型
默认会根据类名生成 URI(例如weather://resources/weather-guidelines)。可通过 Uri 与 MimeType 属性自定义。
资源模板
要定义带 URI 变量的动态资源,可实现HasUriTemplate 接口。
get 方法取出。
资源请求
与工具或提示不同,资源不能定义输入 schema 或参数。但在handle 方法中依然可以通过请求对象访问请求信息。
资源的依赖注入
资源同样通过 Laravel 服务容器解析,构造函数或handle 方法都可以类型提示。
资源注解
资源可以带上受众、优先级、最后修改时间等注解。资源的条件注册
通过实现shouldRegister 可以在运行时按条件注册资源。
false 时资源对 AI 客户端不可见,也无法访问。
资源响应
资源同样需要返回Laravel\Mcp\Response 实例。
文本内容用 text 方法。
资源链接响应
resourceLink 方法可以返回一个资源链接。与嵌入式资源不同,它返回的是 AI 客户端可独立获取的 URI 指针。
Blob 响应
返回二进制内容用blob 方法。MIME 类型通过资源的 #[MimeType] 属性设置。
错误响应
要返回错误,使用error 方法。
应用(Apps)
Laravel MCP 支持 MCP Apps。这是 Model Context Protocol 的一个扩展,允许工具在受支持的宿主中,通过沙箱 iframe 渲染交互式的 HTML 应用。你可以基于此构建仪表盘、表单、可视化和其他富交互体验,而不局限于纯文本响应。 MCP 应用由两个协作的部分组成:- 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 资源,需要在工具上使用#[RendersApp] 属性把它们关联起来。工具被调用时,Laravel MCP 会把资源 URI 放到工具的元数据中,让宿主在沙箱 iframe 内渲染应用。
AppResource 注册后,Laravel MCP 会自动通告 io.modelcontextprotocol/ui 能力,无需额外的服务器配置。应用工具的可见性
每个#[RendersApp] 工具都可以通过 visibility 参数限制调用方。当你有专供 UI 使用的、模型不需要看到的私有工具时非常有用。
Visibility 枚举有 Model 和 App 两个成员,默认二者都启用。给 UI 直接调用的后端 action 用 [Visibility::App];如果不希望 UI 调用工具,就用 [Visibility::Model]。
应用的配置
App 资源上的#[AppMeta] 属性用于设置 iframe 的内容安全策略、浏览器权限,以及要注入到视图 <head> 中的库脚本。
Library 枚举预置了 Library::Tailwind、Library::Alpine 等常用前端库的 CDN 脚本,其 CDN 源会自动合并到 CSP 中。Permission 枚举覆盖 Camera、Microphone、Geolocation、ClipboardWrite 等浏览器权限。
使用 Boost 开发应用
Laravel MCP 提供了专门用于构建 MCP Apps 的 Boost skill 参考。安装 Laravel Boost 后,AI 编码代理可以调用mcp-development skill,自动生成 App 资源、Blade 视图以及关联的工具。
关于协议的完整参考(包括客户端 API 与 schema 细节),请查看官方的 MCP Apps 文档。
元数据
可以给工具、资源、提示的响应附加 MCP 规范中的_meta 字段。
Response::make。
$meta 属性即可。
图标
MCP 客户端可以显示服务器及其原语的图标。可以通过Icon 属性为 Server、Tool、Resource、Prompt 声明图标。
Icon 属性可以重复使用,从而为不同尺寸或浅色 / 深色主题提供多个变体。
也可以重写 icons 方法,通过编程方式定义图标,适合图标依赖运行时条件的情况。
icons 方法定义的图标会自动合并。图标路径按下列规则解析:
- 带
https:、data:等 URI scheme 的路径原样使用。 - 相对路径通过 Laravel 的
assethelper 解析成 URL。
认证
Web 服务器可以使用 Laravel 标准的中间件来认证。Sanctum
使用 Laravel Sanctum 的 token 认证。MCP 客户端会发送Authorization: Bearer <token> 头。
OAuth 2.1
使用 Laravel Passport 的 OAuth 认证,适合需要更强安全性的场景。授权
通过$request->user() 获取当前已认证用户,就可以在工具或资源中进行授权检查。
MCP 客户端
Laravel MCP 不只能构建服务器,也提供了连接其他 MCP 服务器的客户端。借助客户端,你可以发现并调用外部 MCP 服务器暴露的工具,特别适合把外部 MCP 服务器的能力提供给 AI 代理。连接到服务器
对于可以通过 HTTP 访问的 MCP 服务器,使用Client::web 方法并传入服务器 URL。
Client::local 方法并传入命令和参数。
connect、connected、ping、disconnect 方法。
withTimeout 方法可以自定义请求超时。
命名客户端
除了每次都构建客户端,也可以注册可复用的命名客户端。通常在服务提供者的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),以及交换授权码并调用处理器的 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 Inspector” 可以验证 MCP 服务器的行为。单元测试
你可以为工具、资源、提示编写单元测试。actingAs。
assertHasErrors / assertHasNoErrors。
assertSentNotification 与 assertNotificationCount。
dd 或 dump。