跳到主要内容

限流与预算

对于 MCP 流量,调用方 API Key 仍然是流量控制边界。MCP 工具调用与模型流量共用该 Key 的请求限制、并发限制和预算,但不会消耗模型 Token。

MCP 没有单独的限流或预算资源。请在调用方 API Key 上配置这些控制项,然后在 MCP 路径上验证行为。

控制项作用位置

网关只会对 tools/call 请求执行限流和预算检查。MCP 握手(包括 initialize)和通过 tools/list 进行的工具发现不会被限流。即使调用方已触发限流,也仍然可以连接并列出其 Key 允许访问的工具,但要等窗口重置后才能继续调用工具。

当某个工具调用因限流或预算被拒绝时,AISIX 会在联系上游 MCP 服务器之前返回错误,并且仍会把这次被拒绝的调用记录为用量事件

适用的限流

调用方 API Key 的 rate_limit 对象可以定义请求速率、Token 速率和并发限制。在 MCP 路径上,只有请求速率和并发限制会直接计量工具调用:

限制是否作用于 MCP 工具调用说明
rpsrpmrphrpd每个 tools/call 会在对应窗口中计为一次请求。
concurrency每个进行中的工具调用会占用一个并发许可,直到调用返回。
tpmtpd间接作用MCP 工具调用没有模型 Token,因此不会增加 Token 窗口计数。如果调用方 Key 的模型流量已经耗尽某个 Token 窗口,该 Key 的工具调用仍会在窗口重置前被 HTTP 429 拒绝。

每个字段都是可选的。字段省略时,AISIX 不会执行该限制。

请使用请求速率限制或 concurrency 直接限制 MCP 调用量。只配置 Token 限制并不能限制 MCP 工具调用数量。

完整的限流字段和计数器存储选项请参见限流

设置调用方限流

在调用方 API Key 上配置 rate_limit。下面的自托管示例会保留该 Key 仅用于 MCP,并将它限制为每分钟 1 次工具调用。请包含所有需要保留的现有 Key 字段;Admin API 的 PUT 会替换整个 Key 资源。

# Replace with your values
export AISIX_ADMIN_KEY="YOUR_ADMIN_KEY"

curl -sS -X PUT "http://127.0.0.1:3001/admin/v1/apikeys/YOUR_API_KEY_ID" \
-H "Authorization: Bearer ${AISIX_ADMIN_KEY}" \
-H "Content-Type: application/json" \
-d '{
"key_hash": "'"${AISIX_API_KEY_HASH}"'",
"allowed_models": [],
"allowed_tools": ["github__*"],
"rate_limit": {
"rpm": 1
}
}'

❶ 当该 Key 只用于 MCP 流量时,可使用空模型允许列表。如果同一个 Key 还需要调用模型,请保留现有模型访问权限。

rpm: 1 会把该调用方 API Key 限制为每分钟 1 个请求。

要验证该限制,请使用该调用方 API Key 连接 MCP 客户端,并在同一分钟内调用两次允许访问的工具。第一次 tools/call 成功;第二次 tools/call 会在 AISIX 联系上游 MCP 服务器之前被 HTTP 429 拒绝。即使调用方被限流,握手和 tools/list 仍然可用。

在托管部署中,请在 AISIX 托管控制面中配置相同的调用方 API Key 限制。

在托管部署中应用预算

预算在 AISIX 托管控制面中配置,并由托管网关执行。当覆盖某个调用方 API Key 的预算已耗尽时,网关会在联系上游 MCP 服务器之前,以 budget_exceeded 错误拒绝该 Key 的 tools/call 请求。这个检查与模型路径使用相同的预算机制。

MCP 工具调用没有 Token 成本,因此本身不会增加基于 Token 的花费。但如果该调用方的模型流量已经耗尽预算,同一个调用方 API Key 的 MCP 工具调用也会被阻断,因为二者共用同一个 Key 和预算边界。预算目标、拒绝响应和缓存行为请参见预算

在自托管部署中,请使用调用方 API Key 的限流来治理 MCP 工具调用量。预算配置详情请参见预算

下一步

你现在已经把调用方 API Key 控制项应用到 MCP 流量。使用下面的指南观察结果,或继续细化共享的限流和预算设置:

  • 可观测性:查看 MCP 工具调用产生的用量事件和指标。
  • 限流:查看完整的限流字段和计数器存储选项。
  • 预算:配置预算目标、拒绝行为和缓存设置。