灵渠 LingQu

工具执行与治理

MCP 工具调用的执行流程(建议与执行分离)、三级工具过滤规则,以及按密钥的工具会话与凭据生命周期管理

本页把 MCP 工具调用的"执行—过滤—会话"三件事合在一处:模型建议调用工具后如何受控执行、如何按三级规则约束哪些工具可用、以及按密钥的工具会话凭据如何随访问关系自动收敛。三者共同构成灵渠对工具调用的统一治理,与普通查询请求复用同一套额度、安全与计量口径。

工具执行经数据平面 /v1/*,工具会话管理经控制平面 /api/v1/mcp/*。下文示例中的 https://<平台入口地址> 请替换为你的平台实例统一入口地址。

1. 执行流程:建议与执行分离

当上游模型在响应中返回工具调用时,灵渠默认不自动执行它,而是把工具调用建议原样回给应用,由应用显式发起执行。这条"建议与执行分离"的设计,给应用留出了校验参数、按权限把关、必要时请用户确认的空间。

一次完整的工具调用按四步推进:

参数校验 权限把关 用户确认 不予执行 发起查询请求 模型返回工具调用建议 应用研判 显式发起执行 直接续接对话 灵渠经管道执行工具 返回结构化工具结果 携工具结果续接对话 模型生成最终答复

1.1 第一步:发起查询请求

应用以普通查询的形态发起请求,请求中可附带可用工具清单。模型若判断需要调用工具,会在响应中给出工具调用建议,而非自然语言答复:

{
  "id": "<响应标识>",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "<工具调用标识>",
            "type": "function",
            "function": {
              "name": "business_search-fetch_record",
              "arguments": "{\"id\": \"<记录标识>\"}"
            }
          }
        ]
      },
      "finish_reason": "tool_calls"
    }
  ]
}

工具名采用"连接名 + 工具名"前缀(如 business_search-fetch_record),确保多个连接间工具唯一可辨。finish_reasontool_calls 即表示这是一次工具调用建议,尚未执行

1.2 第二步:应用研判

应用拿到建议后,按自身策略决定是否执行:校验参数是否合法、调用方是否有权限、敏感操作是否需用户确认。这一步完全由应用掌控,平台不越俎代庖。

1.3 第三步:显式发起执行

确认放行后,应用把工具调用对象原样提交给工具执行入口。平台在此环节让工具调用流经中间件管道——安全护栏先校验参数与权限,路由中间件把调用代理至对应工具服务器:

curl https://<平台入口地>/v1/mcp/tool/execute \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer tsxt-************************" \
  -d '{
    "id": "<工具调用标识>",
    "type": "function",
    "function": {
      "name": "business_search-fetch_record",
      "arguments": "{\"id\": \"<记录标识>\"}"
    }
  }'

工具执行结果以可直接拼接进对话历史的形态返回:

{
  "role": "tool",
  "content": "<工具返回的结构化结果>",
  "tool_call_id": "<工具调用标识>"
}

工具执行入口的鉴权与数据平面查询入口一致(Authorization: Bearer <API 密钥>),逐次鉴权并归属到对应子账户。返回结构带有正确的 roletool)与对应的 tool_call_id,可直接追加到对话历史,无需二次加工。

1.4 第四步:续接对话

应用把"原始问题 + 模型的工具调用建议 + 工具执行结果"组装为完整对话历史,再发起一次查询,模型据此生成最终答复。一次请求中模型可能建议多个工具调用,应用可按需串行或并行执行,结果各自拼回历史。

1.5 执行失败处置

工具执行可能因多种原因失败,平台以结构化错误返回,便于应用本地化处理:

情形错误语义
工具执行超时超出工具调用超时上限
工具不存在工具名拼写错误,或所属连接已中断
工具被过滤该工具不在当前请求的可用范围内(见 §2)
{
  "error": {
    "code": "tool_not_allowed",
    "message": "工具 business_search-delete_record 不在本次请求的可用范围内",
    "request_id": "<请求追踪标识>"
  }
}

2. 三级工具过滤

灵渠以三级过滤约束"哪些工具可用",三级逐层收窄,一个工具须通过全部适用层级方可对模型可见、可执行:

级别过滤面说明
第一级 · 连接级tools_to_execute每个 MCP 连接的工具准入基线(默认拒绝),见 接入 MCP 服务器 §3
第二级 · 请求级请求头声明单次请求临时收窄到指定连接 / 指定工具
第三级 · 密钥级子账户配置按 API 密钥(子账户)配置可访问工具,优先级最高
全部已发现工具 连接级 准入基线 请求级 临时收窄 密钥级 子账户配置 本次可用工具

三级过滤以交集叠加:连接级是基线,请求级在其上进一步收窄,密钥级在配置存在时覆盖请求级声明。

2.1 请求级过滤

在单次请求头中临时收窄可用工具,不改动连接配置:

# 仅包含指定连接的工具
curl https://<平台入口地>/v1/chat/completions \
  -H "Authorization: Bearer tsxt-************************" \
  -H "x-mcp-include-clients: business_search,knowledge_base" \
  -d '{ "model": "<模型中性名>", "messages": [ ... ] }'

# 仅包含指定工具(连接名-工具名;支持 连接名-* 通配该连接全部工具)
curl https://<平台入口地>/v1/chat/completions \
  -H "Authorization: Bearer tsxt-************************" \
  -H "x-mcp-include-tools: business_search-search,knowledge_base-*" \
  -d '{ "model": "<模型中性名>", "messages": [ ... ] }'

请求级过滤头取空值即屏蔽全部工具(默认拒绝),可用于显式关闭某次请求的工具能力。通配符仅支持 连接名-*(该连接全部工具)与独立的 *(全部连接),不支持 连接名-前缀* 之类的局部前缀匹配。

2.2 密钥级过滤

为某个 API 密钥(子账户)配置可访问的工具集,按业务线 / 角色实施最小权限:

curl https://<平台入口地>/api/v1/mcp/keys/<子账户标>/tools \
  -X PUT \
  -H "Content-Type: application/json" \
  -H "Cookie: <控制台会话凭证>" \
  -d '{
    "mcp_configs": [
      { "client": "knowledge_base", "tools_to_execute": ["search", "get_article"] },
      { "client": "ticketing", "tools_to_execute": ["*"] }
    ]
  }'

密钥级过滤的取值语义与连接级一致(["*"] 全部 / [] 无 / 指定列表);未在密钥配置中列出的连接,其工具一律被屏蔽(默认拒绝)。当密钥配有 MCP 工具配置时,它覆盖请求级过滤头——即便请求头声明了某工具,只要密钥未授予,仍不可用。

2.3 过滤组合示例

配置结果
连接级允许 read/write/delete;密钥级限定 read;请求头声明 writeread 可用(密钥级覆盖请求级)
连接级允许 read/write;无密钥级配置;请求头声明 writewrite 可用(请求级生效)
连接级允许 read/write;密钥级与请求级均未声明取连接级基线 read/write

常见用法:只读访问(仅开放 search/view/get_* 一类工具)、按环境隔离(开发密钥放开、生产密钥收窄)、按角色分级(查看 / 编辑 / 管理三档密钥配不同工具集)。

3. 按密钥的工具会话与凭据生命周期

当某些工具服务器要求逐调用方独立凭据(如按使用者各自授权才能访问的业务系统)时,灵渠为每个调用方身份维护一份独立的工具会话凭据。「MCP 会话」页按密钥(子账户)粒度集中管理这些凭据。

3.1 会话凭据的状态

每条会话凭据处于以下状态之一:

状态含义如何恢复
active凭据有效,平台在每次调用时自动附带
needs_reauth上游凭据已失效(刷新失败或被使用者在源端撤销)重新授权并完成上游流程
needs_update管理员调整了该工具服务器要求的凭据字段,现有凭据缺少新增字段重新提交凭据值
orphaned该身份已失去对此工具服务器的访问权(密钥被移出允许清单等),凭据本身仍有效由管理员侧恢复访问权,下次对账自动转回 active
pending授权 / 提交链接已下发,使用者尚未完成完成链接指向的授权或提交

needs_reauth/needs_updateorphaned 的本质区别。 前两者是调用方侧问题——补一份新凭据即可修复(重新授权或重新提交)。orphaned访问控制问题——凭据本身没坏,缺的是"该身份经灵渠使用此工具服务器的权利";重新授权只会产生重复凭据或在下次对账时再次回到孤立态,真正的修复在管理员侧(把密钥重新加回允许清单等)。因此孤立态凭据的「重新授权」操作在界面上隐藏,避免无效动作。

3.2 凭据随访问关系自动收敛

平台让会话凭据与"密钥 ↔ 工具服务器"的允许关系保持自动同步:当某身份的有效允许范围变化时,受影响的凭据自动改写状态,无需人工逐条处理。

管理动作对现有凭据的影响
把某工具服务器从某密钥的允许清单移除该「密钥 × 工具服务器」凭据转为 orphaned
把某工具服务器重新加回密钥允许清单对应孤立凭据转回 active
删除某密钥该密钥下全部凭据被清除
删除某工具服务器连接该连接下全部身份的凭据与待完成流程一并清除

"有效允许范围"取"逐密钥显式配置 ∪ 全局放开的工具服务器"——与运行期工具可用性判定同一套谓词。凭据状态的收敛与工具过滤的判定口径一致,二者始终对得上。

3.3 凭据管理操作

「MCP 会话」页按凭据当前状态提供对应操作,不展示无效动作:

操作适用状态效果
重新授权needs_reauth对同一工具服务器与身份发起新授权流程,完成后原位替换失效凭据,状态转 active,身份不变
编辑凭据值active / needs_update发起新的凭据提交流程(表单预填已存字段名,不回显值),提交后原位替换
完成授权pending把使用者送回授权链接,完成未竟流程
撤销凭据行与陈旧待完成流程删除该凭据行;对待完成授权流程,先移除流程行以规避回调竞态

待完成流程行有短时有效期(约 15 分钟),逾期由平台清理,不残留为失败行。会话凭据的状态机与界面动作随状态自适应——孤立态与待重新授权态互斥于"无济于事的动作",平台不暴露无操作意义的选项。

相关链接

  • MCP 概述:MCP 协议简述、灵渠双重定位、工具调用统一治理价值。
  • 接入 MCP 服务器:连接方式、连接配置、工具准入范围、状态机与健康探测。
  • 中间件管道与扩展点 SDK:工具调用经路由 / 缓存检查点 / 安全护栏管道治理的统一口径。

On this page