跳转到主要内容

什么是 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 中注册 Tool、Resource、Prompt。
4

注册服务器

routes/ai.php 中将服务器注册到路由。
Web 服务器通过 HTTP POST 访问。本地服务器则作为 Artisan 命令运行,用于与 CLI 型 AI 客户端集成。

Tool 的实现

Tool 是 AI 客户端可调用的函数。可以直接使用 Laravel 的服务容器、验证、Eloquent。

创建 Tool

在生成的类中实现 handleschema 方法。

参数定义(Schema)

schema 方法中使用 Illuminate\Contracts\JsonSchema\JsonSchema builder 定义接受的参数。

Tool 注解

使用 MCP 协议提供的注解可以让 AI 客户端判断工具的安全性。

结构化响应

若希望返回易于 AI 客户端解析的 JSON 响应,使用 Response::structured

流式响应

对耗时较长的处理,返回 Generator 可以实现进度流式推送。
在 Web 服务器上,流式响应会自动作为 SSE(Server-Sent Events)流发送。

条件注册

可以仅向满足特定条件的用户暴露工具。

Resource 的实现

Resource 是 AI 客户端作为上下文加载的数据,如文档、配置、动态数据。

静态资源

动态资源(URI 模板)

使用 URI 模板可以根据 URL 参数提供动态资源。
AI 客户端会请求 app://users/42/profile 这样的 URI,{userId} 的值可以通过 $request->get('userId') 获得。

Resource 注解

可以显式声明资源的优先级与受众。

Prompt 的实现

Prompt 是 AI 客户端可使用的可复用模板。用于将常用查询或复杂工作流标准化。

创建 Prompt

使用 asAssistant() 后消息会被视作 AI 助手的发言。将系统提示与用户消息组合,可以细致控制 AI 的行为。

认证与授权

使用 Sanctum 的令牌认证

这是最简单的认证方式。MCP 客户端需带上 Authorization: Bearer <token> 头。

基于 OAuth 2.1 的认证

若需要更稳固的认证,使用 Laravel Passport。
采用 OAuth 认证时,请发布 MCP 提供的授权视图,并在 AppServiceProvider 中做设置。

使用自定义中间件的认证

若使用自定义 API 令牌,可通过中间件校验 Authorization 头。

Tool 内部的授权

在 Tool 或 Resource 的 handle 中可以通过 $request->user() 做细粒度授权检查。
shouldRegister 只是将工具从列表中隐藏。调用工具时的授权检查必须在 handle 方法内进行。

实战示例:数据库操作工具

以下是使用 Eloquent 检索与创建数据的完整示例。

服务器类

检索工具(只读)

创建工具(写入)

实战示例:文件系统操作工具

使用 Storage Facade 操作文件的示例。
文件操作工具必须对路径做规范化处理,避免访问允许目录以外的位置。含 .. 的路径应当拒绝。

测试

MCP 服务器、Tool、Resource、Prompt 都可以用 Laravel 标准测试机制编写单元测试。

测试 Tool

通过 Server::tool() 方法直接调用工具进行测试。

Resource 与 Prompt 的测试

主要断言方法

使用 MCP Inspector 调试

对于交互式调试,使用 MCP Inspector。

部署要点

HTTP 流式与 SSE

在 Web 服务器上使用流式响应(Generator)时,请检查 Web 服务器配置。

与 Laravel Octane 组合

对高并发的 MCP 服务器,可考虑使用 Laravel Octane(FrankenPHP 或 Swoole),能显著减少每次请求的开销。
使用 Octane 时请求间会共享状态。请注意不要在 Tool 中使用静态属性或全局状态。

限流

throttle 中间件限制对 MCP 服务器的请求。

缓存

对频繁调用的只读 Tool 建议使用缓存。

日志与监控

对 MCP Tool 调用记录日志,可以掌握 AI 客户端的使用情况。
生产环境推荐使用 Laravel Telescope 或 Sentry 监控 MCP 服务器的性能与异常。
最后修改于 2026年7月18日