
Durin 内部:受控 MCP 请求如何工作
通过 Durin 进行一个智能体工具调用,从登录请求和访问检查到审查、凭据处理和记录的结果。
决策摘要
Durin 将智能体的工具调用视为评估请求,而不是要遵循的指令。网关确认谁在呼叫,组织的运行时重新检查当前访问和策略,一个单独的代理附加该人的提供商授权,并且在尝试之前和之后记录每个更改。依靠该路径来处理通过 Durin 路由的请求,并对直接访问、模型提供商和提供商权限保留单独的控制。
在工具调用处画线
假设工程师要求编码智能体为失败的测试开具票证。对于模特来说,起草票据很容易。创建它意味着使用真实帐户在真实系统上调用工具,并留下其他人会看到的更改。 Durin 将该调用视为工作区做出决定的请求,而不是要执行的指令。
Durin 位于智能体客户端端和工作区连接的系统之间。该模型以及智能体在其自己的环境中执行的工作(例如读取本地文件、运行测试或编辑代码)保留在客户端。 Durin 不托管或训练模型。它管理通过 Durin 端点到达它的工具调用,例如搜索文档、阅读票证、创建问题或发送消息。
每个人都通过自己的端点进行连接。个人 URL 涵盖他们可以使用的每个连接; 连接 URL 将客户端范围缩小到一个。 URL 是地址,而不是密码。客户端使用该地址的 OAuth 登录 Durin,然后 Durin 从已验证的身份中派生出预期地址并拒绝不匹配。客户端永远不需要提供商的令牌。
在端点后面,连接代表一个经批准的系统:提供商的托管 MCP 服务器或您的组织运行的 MCP 服务器。内置的Durin沙箱是第三种。它通过 Durin 内部的合成文档和票据进行答复,并且从不联系外部提供商。他们都持有相同的支票。
智能体客户端端及其模型位于 Durin 外部,并使用为该确切端点颁发的 OAuth 令牌发送工具调用。网关验证令牌并找到组织。签名请求的有效期为 30 秒,它将调用传送到组织运行时,该运行时会重新检查当前访问、应用策略和审查,并在分派之前记录意图。 凭据经纪人收到与该确切调用绑定的签名请求,再次检查决策并附加该人的提供者令牌。出口服务通过公共 HTTPS 将其发送到远程 MCP 服务器,无需重定向或重试。结果返回给客户端;提供商令牌则不然。直接提供商访问永远不会跨越 Durin。
打开全尺寸图: 工具调用在到达远程 MCP 服务器之前会经过网关、组织运行时、凭据代理和出口。寻找工具而不扩大访问范围
智能体必须先发现工具,然后才能调用它们。 Standard 工具/列表请求逐页返回人们可以使用的提供商工具。对于大型目录,Durin 添加了三个发现工具:durin_list_connections 查找预期的连接,durin_list_tools 使用可选文本查询浏览允许的工具摘要,durin_describe_tools 返回最多五个确切名称的已审阅模式。第四个是 durin_call_tool,按名称及其参数和幂等键运行工具。
发现是由访问决定的,但它不是访问。当前策略会阻止的工具被排除在外。需要审查的工具或者其结果取决于调用名称的资源的工具仍然会出现,因为决策取决于特定的请求。当某些内容不可用时,响应会显示是否缺少登录、同意、审核或策略,但不会透露被阻止工具的定义。 连接 URL 限制对其连接的发现和调用,并且任何过滤器都无法扩大该范围。
每个呼叫到达时都会再次评估,因为自获取列表以来,成员身份、策略或连接可能已发生更改。 Durin 对客户的指示直接这么说:永远不要发明工具名称,当多个匹配时询问使用哪个连接,并期望每次调用都被再次检查。
一通电话,一步一步
以下是客户端调用工单工具时发生的情况。每个步骤都在具有狭窄作业的服务中运行,并且每个移交都针对接收它的服务进行签名。
- 网关对呼叫者进行身份验证。它验证 OAuth 访问令牌的签名、颁发者和受众,然后询问身份提供者该令牌是否仍然有效以及该令牌已颁发给哪个客户端。它对每个请求都会执行此操作,而不进行缓存。客户端报告的有关其自身的名称以及写入令牌中的任何角色在建立身份时不发挥任何作用。
- 网关从该身份中查找组织,而不是从标头或请求正文中指定的组织中查找。该组织的运行时确认该人是活跃成员并提供其当前角色。
- 网关将对该运行时的调用作为签名的内部请求进行处理。它命名了组织、环境、人员、角色、客户端和操作,并在 30 秒后过期。运行时拒绝向另一个组织、环境或操作发出的请求。
- 运行时根据自己的记录(而不是令牌)重新检查当前访问:成员资格和撤销、连接的状态和团队范围、人员的提供者授权、审查的工具和调用目标的资源。参数必须与工具审查的架构相匹配并通过检查。这些检查中的每一项都未能关闭。
- 运行时应用工作区的规则。默认情况下,允许通过这些检查的请求,包括更改。管理员可以要求其他管理员审核更改、拒绝更改或拒绝所有访问。团队策略和自定义规则可以使决策更加严格,绝不宽松。
- 对于允许的调用,运行时会记录其意图并将调用交给凭据代理,该代理在联系提供者之前再次根据当前记录检查决策。
- 运行时记录结果并将结果返回给客户端。
身份验证和授权始终保持分离。有效的令牌确定谁在呼叫;它不会决定该人现在是否可以拨打此电话。运行时在调用时根据它控制的记录来决定。
在运行时内部,每个组织和环境有一个协调对象(Cloudflare 持久对象)一次处理这些请求。因此,决定、审批、策略变更和撤销不能交织在一起。如果在评估调用时策略发生变化,则调用会因冲突而停止,并且不会记录任何允许的内容。
运行经过审查的工具,而不是当前服务器提供的任何工具
MCP 服务器可以随时更改其工具,包括它们的描述和输入模式。当管理员检查工具时,Durin 会记录其定义的摘要。审查还决定该工具是否读取或更改数据、它可能接触哪些资源以及这些资源在其参数中出现的位置。 Durin 不依赖于服务器自己的提示来表明工具是只读的,并且新发现的工具在经过审查之前保持不活动状态。
如果稍后发现返回不同的定义,Durin 将创建一个需要审核的新版本,暂停活动版本并撤销其开放的审批。一个人如果自己发现的定义与审查的定义不再匹配,就会被拒绝。未经审查的工具将被拒绝,并且其名称不会作为可调用工具提供给客户端。
每个激活的工具还需要一个其参数的验证器。 Durin 在审核期间创建一个简单的模式;一种工具,其架构过于复杂,需要等待单独签名的验证器才能激活。在调度时,代理从审查的记录而不是从客户端的请求中获取上游工具名称和模式。
审查也将参数映射到资源。管理员在工具的输入中最多命名四个字段,Durin 将它们的值连接到规则引用的资源中,例如所有者和存储库。其资源不在该工具的允许列表中的调用将被拒绝,并且缺失值不匹配。
审批绑定到一个确切的调用
当规则需要审查时,调用会返回所需的审批,并且不会向上游发送任何内容。另一位主动管理员(而非请求者)在审批中或(如果已配置)在 Slack 中打开请求。他们看到请求者、连接、工具、资源、参数摘要、版本和到期日,然后选择允许一次、始终允许或拒绝。
审批不运行该操作。在审批在原始请求后 15 分钟到期之前,请求者使用相同的幂等性密钥和审批引用再次发送相同的调用。运行时再次检查当前访问,消耗授权,记录决策并声明单次尝试。如果成员资格被撤销、策略发生更改或参数不同,则旧的审批无法授权呼叫。
| 部分请求 | 为什么会被绑定 |
|---|---|
| 请求者及组织 | 其他人不能使用该补助金。 |
| 连接和凭据 | 补助金不能转移到其他帐户。 |
| 工具版本、定义摘要和映射 | 改变的工具需要重新审查。 |
| 参数摘要和资源 | 不同的标题或目标是不同的行动。 |
| 架构和策略版本 | 发布新规则会使打开的审批失效。 |
| 请求者的撤销时期 | 失去和重新获得访问权限不会恢复旧的授权。 |
| 到期前执行一次 | 单次尝试就会消耗补助金。 |
当审阅者保存决定时
回顾例行变更的每一次重复,可以训练人们在不阅读的情况下单击“批准”。允许始终在狭窄的范围内解决该问题。当审批内存处于默认状态时,它会保存持续 30 天的长期拨款,除非组织选择另一个生命周期。如果后续请求来自同一请求者,针对相同的连接、工具和资源,且每个绑定版本均未更改,且其参数相同或满足组织的匹配阈值(默认为 90%),则后续请求无需重新审核即可继续进行。
匹配是根据参数的加盐单向草图计算的,而不是参数本身,并且相同的输入总是产生相同的分数。草图无法显示相似的任何内容都将被视为新的。允许一次永远不会覆盖以后的请求;它仅作为先例显示给下一个审阅者。
常设授权仍会通过当前的每个访问检查,并且代理会像任何其他审批一样重新检查它。 策略更改、请求者或审阅者的撤销、关闭内存或管理员的撤销都会提前结束。管理员可以在审批 → 内存下查看每个保存的决策以及每次使用的决策。
让提供商令牌远离智能体
对于提供商连接,Durin 使用请求者本人的授权调用提供商。每个人都需要通过 Durin 登录其使用的每个连接所对应的提供商,因此队友的授权不会扩大其他人的访问权限。令牌以 AES-256-GCM 加密存储。每条记录都将组织、环境、连接和人员绑定为经过身份验证的附加数据,因此无法以其他人的身份解密记录。轮换密钥时,密钥环最多保留五把密钥:最新的密钥用于加密新记录,环中的每把密钥都可用于解密以它加密的现有记录。
只有凭据经纪商使用这些Token。它是一项单独的服务,只有组织的运行时才能通过绑定到调用的确切正文的签名请求来调用,并且有效期为 30 秒。在联系提供商之前,代理会再次读取当前记录并重新运行策略决策。对于更改,还需要记录的意图、未更改的撤销纪元和相同的凭据版本。然后它附加令牌本身。没有端点向运行时、客户端或模型返回令牌。
对提供商托管和自定义 MCP 服务器的调用通过一项出口服务发出。它仅接受对公共主机名的 HTTPS 请求,拒绝重定向,限制方法和标头,并限制请求和响应大小。每个调用都固定到连接的已审核端点,并进行单个工具/调用,不会自动重试。
将令牌排除在模型上下文之外并不会使结果变得无害。无论允许的工具返回什么,都可以到达客户及其模型提供商。 Durin 保留每个结果,直到根据审查的模式进行检查并进行检查,但该检查会查找常见的秘密格式,例如私钥和实时 API 令牌,而不是每种敏感数据。缩小提供商范围。 Durin 审批永远不会扩展提供商帐户本身可以执行的操作。
最多执行一次更改
智能体重试,网络丢弃响应。一张票被创建两次是很麻烦的;消息或付款发送两次会更糟糕。 Durin 的构建使得一个允许的请求最多导致一次尝试。
- 每个调用都带有客户端选择的幂等密钥。首先再次评估具有相同密钥的重播。如果参数、工具或凭据发生更改,则会因冲突而被拒绝。否则,它将返回具有较早状态的重复项并且不发送任何内容。
- 在联系提供者之前,运行时将执行和审计条目写入单个事务中。如果写入失败,调用就会停止。经纪人拒绝任何缺乏此记录意图的变更。
- 由执行作为关键的单个调度声明可以保护每个更改。同一请求的第二次交付不能再次领取。
- 仅当经纪商返回通过检查的结果时,Durin 记录才完成。提供者错误、超时、最终事件丢失或未通过检查的结果将被记录为不确定。
允许的更改带有客户端选择的幂等密钥。运行时首先将执行和审计条目写入一个事务中;如果写入失败,则不会发送任何内容。然后它会认领一次发货,因此第二次递送无法再次认领。代理重新读取当前记录并调用提供商一次,而不会自动重试。当结果返回并通过检查时,记录的结果完成,或者在错误、超时或检查失败后不确定。对于未更改的请求,重复相同的键会返回重复项;对于已更改的请求,重复相同的键会导致冲突;都不发送任何内容。
打开全尺寸图: 允许的变更记录意图、声明一次调度并以完成或不确定结束。不确定的更改永远不会自动重试,因为它可能已经发生了。客户端被告知在重试之前检查记录,并且在提交新请求之前应该有人检查提供商和审计证据。使用新的幂等键强制进行另一次尝试可能会重复已经发生的操作。对于读取,从新请求重新开始通常是无害的。
Durin 记录了什么,以及保留在外面的内容
Durin 将策略决策和执行结果记录为仅附加审计日志中的单独条目。数据库触发器拒绝任何更新或删除,并且没有代码路径重写条目。记录通过论点摘要而不是论点本身来识别人员、客户、连接、工具、资源、决策和原因。调用路径不存储请求或结果负载。
Durin 在客户端中看不到对话。为其检测的客户端可以通过单独的捕获端点提交它实际观察到的消息,链接到它自己的执行并标记为客户端报告。捕获仅保留元数据,除非管理员打开编辑捕获。如果管理员启用外部内容评估器,它将接收其检查的参数或结果;它可以使决策更加严格,而不是更加宽松。
三件事超出了这条道路。不通过 Durin 到达提供商的请求需要自己的控制,例如网络或身份限制。您的模型提供商会接收客户端发送的所有内容,包括工具结果。并且提供商自己的权限仍然具有权威性:Durin 可以缩小智能体对连接的操作范围,而绝不会扩大它。
要亲自查看路径,请请求工作区中的 Durin 沙箱并进行读取。然后让管理员要求审查更改,创建综合票证并从所需的审批到其记录的结果进行跟踪。该评估套件列出了用于比较任何网关的相同测试。