在 Laravel 应用中集成 MCP Server
AI Agent 不仅仅需要抓取的 UI。它们还需要一种能够以适当权限调用特定工具的方式。这正是 Model Context Protocol (MCP) 所做的事情。
我最近直接在 Laravel 应用中集成了一个 MCP server。我想分享一下为了确保安全性而在构建过程中所做的架构决策。
接待员比喻
把你的应用想象成一栋办公楼。
- Web UI 是供人类使用的门厅。
- REST API 是供系统使用的员工通道。
- MCP server 是供 AI Agent 使用的接待台。
Agent 出示 ID 并请求执行特定任务。接待员不会把大楼的钥匙交给它们。接待员会检查权限,执行一项任务,然后返回一个结构化的答案。
关键设计决策
1. 使用单一端点
不要为不同的工具创建许多路由。使用一个 /mcp 端点。该协议会自动处理工具发现。单一的接口更容易进行安全防护和文档编写。
2. 支持双重身份验证
不同的调用者需要不同的安全方法:
- 第一方调用者(如 CLI 工具)使用 Sanctum personal access tokens。
- 第三方 Agent(代表用户操作)使用 OAuth 2.1。
使用驱动模式的解析器(driver-style resolver)来处理两者。工具代码应该只关心已认证的用户,而不关心他们是如何登录的。
3. 强制执行现有的 RBAC
身份验证只能证明调用者是谁。你仍然必须检查他们能做什么。每个工具都应该映射到一个现有的能力(ability)。如果用户无法在 Web UI 中查看参与者,他们也不应该能通过 MCP 进行查看。
4. 限制数据输出
永远不要返回完整的数据库模型。将 MCP 输出视为公共 API。仅返回 Agent 需要的特定字段。这可以防止意外的数据泄露。
安全性测试
你的测试必须证明系统在出错时能正确处理。测试以下内容:
- 未经授权的用户收到 403 Forbidden 错误。
- 获得授权的用户仅收到允许的字段。
在使用自主 Agent 时,完善的测试套件是防止数据泄露的最佳防御。
总结
要构建一个负责任的 MCP server,请遵循以下三条规则:
- 使用正确的方案对每个调用者进行身份验证。
- 使用现有的权限模型对每个工具进行授权。
- 将每个工具的输出视为受限的公共资源。
