MCP 代码模式:长尾需求的逃生舱而非正门
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
想象一下,您的 MCP (Model Context Protocol) 服务器运行良好,拥有 12 个高质量工具。业务用户正通过它获取价值。突然,一位高级用户提出了一个复杂的需求:“找出连续三个月支出下降的前 20 名客户,将他们与支持工单量进行对比,并仅向我提供过去 14 天内未联系过的账户。”
这个看似简单的请求背后隐藏着多表连接 (Join)、窗口函数 (Window Function)、复杂的过滤条件和排名逻辑。如果您尝试通过标准工具解决此问题,您的大语言模型(例如通过 n1n.ai 访问的 Claude 3.5 Sonnet 或 DeepSeek-V3 等高性能模型)可能会尝试链接五个不同的工具,在中间 JSON 结果上消耗数万个 Token,且最终仍可能算错。另一种错误的做法是不断添加更多特定的工具,直到您的 MCP 表面变得臃肿且难以管理。
专业的解决方案是 代码模式 (Code Mode)。然而,代码模式应被视为一个受控的“长尾逃生舱”,而不是系统的“正门”。通过使用来自 n1n.ai 的高速 LLM API,开发者可以利用顶级模型的推理能力生成精确的查询,并在其所属的地方——数据库引擎本身——运行这些查询。
工具膨胀的代价
当团队首次采用 MCP 时,本能反应是为每个 API 端点和数据库表封装一个工具。这会导致以下几种失败模式:
- LLM 混淆:随着工具数量的增加,模型选择正确工具的能力会下降(即工具的“大海捞针”问题)。
- Token 浪费:链接多个工具需要将中间数据反复发送,显著增加了延迟和成本。
- 安全性脆弱:臃肿的表面积更难进行审计和安全加固。
代码模式通过允许 LLM 编写单个优化的程序(SQL、JavaScript 或 GraphQL)来解决此问题,MCP 服务器随后对该程序进行验证和执行。在复杂工作流中,这可以将 Token 使用量从 150,000 个减少到 2,000 个,同时提高准确率。
能力五角模型:全新的治理架构
在之前的讨论中,我们介绍了“能力四方模型”(业务分析师、业务用户、LLM 和 MCP 服务器)。对于代码模式,我们必须将其扩展为 能力五角模型,加入 IT 管理员 这一角色。
代码模式赋予了 LLM 比任何单个工具都强大的权力。因此,IT 管理员成为架构中承重的一角,负责管理策略表面和安全杠杆。当使用像 n1n.ai 这样可靠的供应商来驱动您的 AI 代理时,确保这个五角模型的平衡对于企业安全至关重要。
| 五角模型角色 | 在代码模式中的职责 |
|---|---|
| 业务分析师 | 定义暴露的操作并设置风险等级。 |
| 业务用户 | 提供具体的业务上下文和长尾请求。 |
| LLM / MCP 客户端 | 将意图转化为受限的 SQL、JS 或 GraphQL 代码。 |
| MCP 服务器 | 验证代码、签署批准令牌并在限制范围内执行。 |
| IT 管理员 | 拥有 Cedar/AVP 策略、签名密钥和审计审查权。 |
设计栈:代码模式的位置
为了保持架构整洁,请遵循以下层次结构:
- 精选工具 (Curated Tools):用于常见的、高频的、确定性的任务。
- 提示词与资源 (Prompts & Resources):用于已知的工作流并提供受控的上下文。
- 代码模式 (Code Mode):用于不可预测的、长尾的分析请求。
实现细节:PMCP SDK 的方法
PMCP SDK 通过一个狭窄的两步接口实现代码模式:validate_code (验证代码) 和 execute_code (执行代码)。这种分离是主要的安全性边界。
1. 验证与动作分类
当 LLM 生成代码时,它必须首先调用 validate_code。服务器不仅检查语法,还进行深度分析:
- 分类:这是读取 (Read)、写入 (Write)、删除 (Delete) 还是管理 (Admin) 动作?
- 策略检查:根据 Cedar 策略引擎,当前用户是否有权执行此动作?
- 风险评估:复杂度是否 < 100?是否排除了敏感字段(如
ssn或password)?
2. 批准令牌 (Approval Token)
如果验证通过,服务器会签发一个经过 HMAC 签名的 批准令牌。该令牌将代码的标准哈希值与用户 ID、会话 ID 和风险等级进行绑定。
// 验证后的代码执行流程示例
const validation = await mcp.callTool('validate_code', {
language: 'sql',
code: 'SELECT name, revenue FROM customers WHERE spend_change < 0 ORDER BY revenue DESC LIMIT 20',
})
if (validation.risk_level === 'low') {
const result = await mcp.callTool('execute_code', {
code: validation.code_hash,
token: validation.approval_token,
})
}
超越沙箱的安全防护
一个常见的误解是,JavaScript 沙箱(如 v8 或 WASM 运行时)是主要的安全性边界。事实并非如此。如果代码被允许执行 DELETE FROM users,沙箱无法救你。真正的安全性存在于 策略表面 (Policy Surface)。
使用 Cedar(Amazon Verified Permissions 背后的策略语言),您可以定义细粒度的规则:
// 允许标准用户执行读取动作
permit (
principal in CodeMode::Group::"StandardUsers",
action == CodeMode::Action::"Read",
resource
);
// 禁止访问敏感字段
forbid (
principal,
action,
resource
) when {
context.script.outputFields.containsAny(["ssn", "salary"])
};
性能提升:对比示例
考虑一个请求:“获取超出目标的前 10 个预算并找出其所有者。”
不使用代码模式(工具链式调用):
- 调用
list_budgets(返回 500 行数据,消耗 50KB Token)。 - LLM 在本地过滤前 10 名。
- LLM 在循环中调用
get_user_details10 次。 - 总 Token 消耗:约 20,000+。延迟:15 秒。
使用代码模式(JavaScript/OpenAPI):
- LLM 编写一个在服务器端获取预算和所有者的脚本。
- 服务器在一次往返中执行脚本。
- 总 Token 消耗:约 1,500。延迟:2 秒。
通过利用 n1n.ai 的高速基础设施,这些性能增益被进一步放大,从而实现近乎瞬时的复杂数据分析。
推广最佳实践
- 从只读开始:默认禁用写入、删除和管理动作。
- 绑定身份:确保
execute_code调用在加密层面与通过身份验证的用户会话绑定。 - 审计一切:记录执行的确切代码、授权的主体以及策略决策结果。
- 使用受限模式:不要暴露整个数据库模式。为 LLM 提供一个仅包含必要表和字段的“代码模式资源”。
代码模式是 MCP 最终的灵活性工具。当它被实现为一个受控的、有策略支持的逃生舱时,它能让您的 LLM 像真正的分析专家一样工作,同时不损害企业系统的安全性。
在 n1n.ai 获取免费 API 密钥。