摘要
1) 一句话总结
Laravel 官方推出的 laravel/mcp 扩展包允许开发者通过编写 PHP 类快速构建 MCP(模型上下文协议)服务器,使 AI 助手能够直接、安全地调用和操作 Laravel 应用的底层功能。
2) 关键要点
- 开发效率:无需设计 REST API 或维护 SDK,开发者仅需约 20 分钟即可构建一个包含 5 个工具的博客管理 MCP 服务器。
- 传输协议支持:开箱即用支持 stdio(用于 Claude Code 等本地工具)和 HTTP(用于远程访问,受 Bearer Token 认证保护)两种传输方式。
- 路由与注册:通过自动生成的
routes/ai.php文件,使用Mcp::local()和Mcp::web()注册服务器。 - 服务器与工具结构:服务器类通过
#[Instructions]注解为 AI 提供系统指令;工具类通过schema()定义输入,通过handle()执行逻辑。 - 复用 Laravel 特性:工具内部直接使用标准 Laravel 验证(
$request->validate()),验证失败时会向 AI 返回结构化错误以便其自我修复。 - 安全与状态注解:使用
#[IsIdempotent]注解标记可安全重试的工具(如发布文章),使用#[IsReadOnly]标记无副作用的只读工具(如获取列表)。 - 测试支持:提供 Pest 测试辅助方法
BlogServer::tool(),可完全模拟 AI 助手调用工具时的行为和响应格式。
3) 风险与不足
- AI 意外发布内容的风险:AI 可能会在未授权的情况下意外将内容直接公开发布。文中明确指出,通过在创建文章工具中强制将
published_at设为null(默认存为草稿),并将“发布”设计为独立的工具操作来规避此风险。
正文
目前你能找到的 MCP 服务器教程几乎都是用 Python 或 TypeScript 编写的。如果你是一名 Laravel 开发者,在此之前你可能一直被排除在外——但现在情况不同了。
Laravel 官方的 laravel/mcp 扩展包让你能够构建 MCP 服务器,将应用的功能直接暴露给像 Claude 这样的 AI 助手。不需要设计 REST API,不需要管理认证令牌,也不需要维护 SDK。你只需要编写描述应用功能的 PHP 类即可。
我花了大约 20 分钟为这个博客构建了一个 MCP 服务器。然后,我用它编写、修改并发布了你现在正在阅读的这篇文章。
什么是 MCP?
模型上下文协议(Model Context Protocol,简称 MCP)是一个开放标准,它允许 AI 助手通过“工具”(具有明确输入和输出的结构化操作)与外部系统进行交互。可以把它想象成给 AI 装上了“手”,而不仅仅是“嘴”。
没有 MCP,AI 只能告诉你如何创建一篇博客文章;有了 MCP,它就能真正地去创建一篇。
该协议通过两种传输方式工作:stdio(用于像 Claude Code 这样的本地工具)和 HTTP(用于远程访问)。Laravel 开箱即用地支持这两种方式。
我们要构建什么
我们要构建一个包含五个工具的博客管理 MCP 服务器。完成后,Claude Code 将能够在你不接触浏览器的情况下管理你的博客。
第一步:安装 laravel/mcp
安装该扩展包后会生成 routes/ai.php 文件,你将在这里注册你的 MCP 服务器。Laravel 会自动处理该文件的加载,无需额外配置。
第二步:创建服务器
服务器类只是一个容器,用于命名你的服务器、描述它的功能并列出它的工具。
其中 #[Instructions] 注解非常重要——它告诉 AI 助手这个服务器的用途以及如何使用它。可以把它看作是针对你的工具的系统提示词(System Prompt)。
第三步:构建工具
每个工具都是一个包含两个方法的类:schema() 定义输入,handle() 执行具体工作。你可以通过 Artisan 命令生成它们:
CreatePostTool(创建文章工具) 这是最有趣的一个工具。它接收标题、Markdown 正文和作者 ID,然后创建一个文章草稿。需要注意以下几点:
- 验证机制:使用的就是标准的 Laravel 验证。
$request->validate()的调用方式与表单请求完全相同。如果验证失败,MCP 会向 AI 返回一个结构化的错误——AI 会知道自己哪里做错了并进行修复。 - Schema(模式):它为 AI 描述了输入内容。
description()的调用不是普通的注释,而是 AI 用来理解每个字段作用的指令。 - 默认草稿:文章始终作为草稿创建,
published_at被明确设置为null。发布是一个独立的、有意的操作。你肯定不希望 AI 意外地将内容直接公开发布。
PublishPostTool(发布文章工具)
这是一个产生实际结果的工具。它很简单,但带有安全防护:
#[IsIdempotent] 注解告诉 AI 这个工具可以安全地重试——发布一篇已经发布的文章只会返回一条提示信息,而不是报错。
ListPostsTool(获取文章列表工具)
只读工具会使用 #[IsReadOnly] 注解,向 AI 表明调用它们不会产生副作用。
至于 GetPostTool 和 UpdatePostTool,它们遵循相同的模式——验证输入、查询模型、返回 JSON。没有任何出人意料的地方,而这正是其优势所在。
第四步:注册与连接
在 routes/ai.php 中,为本地和远程访问注册服务器:
Mcp::local()为 stdio 传输注册服务器——这是 Claude Code 通过php artisan mcp:serve blog在本地运行时使用的。Mcp::web()将其暴露为用于远程访问的 HTTP 端点,受 Bearer Token 认证保护。
要连接 Claude Code,请将服务器添加到你的 .mcp.json 文件中。重启 Claude Code 后,你的博客工具就会与它的内置工具一起出现。
第五步:测试
laravel/mcp 提供了一个测试辅助工具,让你可以在 Pest 中直接调用工具。
BlogServer::tool() 完全模拟了 AI 助手调用你的工具时的行为——相同的验证,相同的响应格式。你的测试验证的是 AI 的体验,而不仅仅是你的代码。
关于这篇文章
这篇文章就是使用上述构建的 MCP 服务器起草、修改和发布的。
我打开 Claude Code 并说:“起草一篇关于我们如何构建博客 MCP 服务器的博客文章。”Claude 使用 CreatePostTool 直接将草稿保存到了数据库中。我们进行了多次交互——我提供反馈,Claude 调用 UpdatePostTool 进行修改。当准备就绪时,我说:“发布它”,Claude 就调用 PublishPostTool 将 published_at 设置为当前时间。
没有使用浏览器,没有后台管理面板,也不需要在聊天窗口和 CMS 之间复制粘贴 Markdown。AI 对博客拥有直接的、结构化的访问权限,同时博客也设有安全防护(默认草稿、数据验证、幂等发布)以确保安全。
这就是 MCP 的真正价值所在。它不仅仅是为了构建聊天机器人,而是为了让你现有的 Laravel 应用成为 AI 助手的“一等公民”工具。你的 Eloquent 模型、验证规则、业务逻辑——它们都能直接发挥作用。
开始使用
- GitHub 上的
laravel/mcp项目 - MCP 官方规范
- Claude Code —— 我们用来构建和测试此项目的 AI 助手
整个服务器只包含五个工具类、一个服务器类和两行路由注册代码。如果你曾经构建过 Laravel 控制器,你就能构建 MCP 服务器。