Skip to content

MCP 策略是使用 Docker 的 MCP 命名空间、以 Cedar 编写的组织策略。本参考定义了 Docker 特有的策略接口,用于 Model Context Protocol(MCP)通过 Docker 的 MCP gateway提供给沙箱的各类活动。开发者注册服务器 时以及智能体使用 MCP gateway 时,MCP 策略都会生效。注册规则控制未来的 sbx mcp add 操作。使用时规则控制工具调用、内置 gateway 工具、资源读取,以及从 已注册或已加载的服务器获取提示。

请将本参考与组织 MCP 访问策略结合使用,了解常见的 策略模式。关于 Cedar 语言,请参阅 Cedar 文档。

求值模型 ​

Cedar 针对主体、操作、资源和上下文对 MCP 请求进行求值。对于 Docker MCP 策略,策略 作用域提供主体。请针对操作、资源和上下文编写策略。引用主体属性的子句,例如 principal in ...、principal.role 或 principal.tenant,不会匹配。

受治理的 MCP 活动默认拒绝。除非有匹配的 permit 允许,否则请求会被拦截。匹配的 forbid 会覆盖任何 permit,包括带 @requireApproval 注解的 permit。

有关 Docker Sandboxes 在何时为用户求值 MCP 策略的细节,请参阅 MCP 策略在何处适用。

不带操作的 permit 会匹配所有进入 Cedar 求值的 MCP 操作:

plaintext
permit (principal, action, resource);

操作 ​

操作治理对象备注
registerMCP 服务器注册服务器注册需要显式的 permit。使用服务器属性来限定注册范围。
invokeToolMCP 工具调用大多数工具访问策略都针对该操作。
invokePrimordial内置 gateway 工具调用适用于内置 gateway 工具,例如 mcp-exec、mcp-add、code-mode 以及 OAuth 授权辅助工具。
readResourceMCP 资源读取规则匹配 MCP::Resource 和 resource.uri。
getPromptMCP 提示获取规则匹配 MCP::Prompt 和 resource.name。
listToolsMCP 工具列出在结构中已定义,但不受 Cedar 网关控制。工具列表可能包含在调用时被拒绝的工具。
listResourcesMCP 资源列出在结构中已定义,但不受 Cedar 网关控制。资源列表可能包含被策略拒绝的资源。
subscribeResourceMCP 资源订阅在结构中已定义,但不受 Cedar 网关控制。

资源 ​

使用 MCP 实体类型以及该请求的属性来匹配资源。

实体匹配方式备注
MCP::Server已注册的服务器名称规范的服务器标识是 resource.identityURL 属性,而不是实体 ID。
MCP::Tool裸工具名称使用 resource.name。不包含显示前缀。裸名称匹配适用于每个暴露同名工具的服务器。
MCP::Resource资源 URI使用 resource.uri。
MCP::Prompt提示名称使用 resource.name。
MCP::Primordial内置 gateway 工具名称用实体引用匹配某个具体的内置 gateway 工具。

示例:

plaintext
resource in MCP::Server::"notion"
resource.name == "move_file"
resource.uri like "*/docs/*"
resource in MCP::Primordial::"code-mode"

资源属性 ​

工具注解属性来自 MCP 工具注解或目录元数据,仅供参考。

属性适用于备注
resource.name工具和提示对于工具,这是裸工具名称,而不是带显示前缀的名称。
resource.uri资源与 like 等字符串运算符一起使用。
resource.readOnly工具当工具未声明该属性时,默认为 false。
resource.destructive工具当工具未声明该属性时,默认为 true。
resource.idempotent工具当工具未声明该属性时,默认为 false。
resource.openWorld工具当工具未声明该属性时,默认为 true。
resource.type服务器用于服务器注册规则。有关更多细节,请参阅服务器类型值。
resource.identityURL服务器规范的服务器标识。该值取决于注册类型。有关更多细节,请参阅服务器标识值。
resource.requiresOAuth服务器用于服务器注册规则。
resource.requiresNetwork服务器用于服务器注册规则。
resource.command服务器本地 stdio 服务器命令,例如 npx 或 docker(在可用时)。对于远程服务器以及不包含命令详情的注册,该值为空。
resource.args服务器本地 stdio 服务器参数(在可用时)。这是一个集合,因此可以用 .contains() 匹配其中的值。当没有命令详情可用时该值为空。

对字符串属性使用 like。在 Cedar 中,like 用 * 作为通配符,匹配整个字符串,把 ? 视为字面字符,并把 \* 视为字面星号。

只在集合属性(例如 resource.args)上使用 .contains()。在字符串属性上使用 like。

服务器类型值 ​

通过 MCP gateway 注册时使用这些值:

  • local-stdio:在宿主机上运行的 stdio 服务器。这包括显式命令,以及通过 --local 从元数据解析出的 OCI 打包 stdio 服务器。
  • container-stdio:不带 --local、通过元数据解析出的 OCI 打包服务器。该值可能出现在 register 判定中,但 MCP gateway 无法附加或运行这种类型的服务器。
  • remote-dcr:不需要 OAuth,或支持 OAuth 动态客户端注册的远程端点。
  • remote-no-dcr:不支持动态客户端注册的远程 OAuth 端点。

服务器标识值 ​

对于远程服务器,resource.identityURL 是端点 URL。对于显式的本地命令,它是宿主机 上解析出的可执行文件路径。对于 --local 的元数据注册,它是 local://stdio/<name>, 而不是镜像仓库或清单 URL。

上下文字段 ​

字段备注
context.request_time工具调用、内置 gateway 工具调用、资源读取和提示获取都会绑定该字段。注册请求不包含它。
context.args由 gateway 求值的 invokeTool 和 invokePrimordial 请求的参数。当参数可作为 JSON 对象获取时存在。

以 context.request_time 为条件的注册 permit 不会匹配,因此注册会落到默认拒绝。

用 context has args 和一次字段检查来守护工具调用的参数规则:

plaintext
permit (principal, action == MCP::Action::"invokeTool", resource)
when {
  resource.name == "approve_expense" &&
  context has args &&
  context.args has amount &&
  context.args.amount <= 500
};

以缺失参数为条件的 permit 不会匹配,因此请求会落到默认拒绝。以缺失参数为条件的 forbid 也不会匹配,因此它不会拦截该请求。

只有对象形式的工具参数才会在 context.args 中体现。不支持或格式错误的参数会被省略。

审批注解 ​

在 permit 语句上使用 @requireApproval("reason"),可以在匹配的请求运行之前,通过 MCP elicitation 要求在会话内确认:

plaintext
@requireApproval("write tool call")
permit (principal, action == MCP::Action::"invokeTool", resource)
when { resource.readOnly == false };

当请求匹配带注解的 permit 且没有 forbid 覆盖它时,策略引擎会返回需要审批的结果。 该注解字符串会作为 elicitation 的原因显示。需要审批的结果优先于普通的 permit。 匹配的 forbid 会在不进行 elicitation 的情况下拒绝该请求。

有关请求流程和信任模型,请参阅 使用 MCP elicitation 要求确认。

审批需要一个能够向用户呈现 MCP elicitation 请求的客户端会话。如果该请求无法呈现给 用户审批,请求就会被拒绝。审批是会话内的确认,而不是带外审批工作流。每次确认只适用 于一个授权请求。客户端确认之后,gateway 会带着审批摘要重新对该请求求值。

sbx mcp add 无法呈现 elicitation 请求。因此,带 @requireApproval 的注册 permit 会 导致拒绝。

只有完全一致的注解名 @requireApproval 才会触发审批行为。其他注解名,例如 @requireConsent 或 @requireConfirmation,不会要求审批。

限制 ​

  • 工具和资源的列出操作不受 Cedar 网关控制。列表可能包含沙箱尝试使用时会被策略拒绝 的条目。
  • 当执行上下文无法把 MCP elicitation 转达给发起请求的客户端时,需要审批的请求会被 拒绝。这包括在 code-mode 内部发起的工具调用。
  • 注册规则在服务器注册时求值。它们本身不会移除已有注册,也不会阻止已加载的服务器。 请使用时规则(例如 invokeTool、readResource 和 getPrompt)来治理已有的注册。
  • 使用 resource.command 或 resource.args 的服务器命令和参数规则,仅当解析出的服务器 注册包含本地 stdio 命令详情时才适用。远程服务器和通过元数据解析出的本地服务器,这 些属性可能为空。请使用 resource.type == "local-stdio" 独立于命令详情来匹配宿主机 上运行的服务器。
  • 基于主体的规则不会生效。请使用组织和团队策略作用域来定位用户。
  • MCP 策略不支持服务器分组。请单独引用各个服务器。