跳转到主要内容
每一条防火墙规则都从回答*我适用于哪些工具调用?*开始。那个答案的前半部分 是一个工具名 glob——规则上的 tool_name_glob 字段。它是一个有意精简的、 大小写敏感的语法(没有正则,没有回溯),所以一条规则读起来就和你从 Discovered tools 标签里照着键入一个工具名一样,而匹配在中继热路径上 保持线性时间。 本页是关于那一个字段的聚焦语法参考。关于一个 glob 在一条完整规则中的 位置——执行面、参数子句、egress 列表、判定——参见 规则 schema 以及 防火墙规则 中的深度引擎参考。

1. 为什么用 工具名 glob 而非正则

工具按惯例以 server.toolcategory.action 做命名空间 (shell.execdb.querycommunity.http_fetch)。一个 glob 让一条规则 捕获一整个家族——用 shell.* 捕获每一个 shell 动词,用 *.delete 跨 服务器捕获一个动词——而没有在每一次工具调用都运行的路径上用正则带来的 脚枪。
这个语法故意微小。匹配是大小写敏感的——MCP 工具名按惯例是小写加点, 所以一次大小写折叠会让从 Discovered tools 视图直接复制粘贴一个名称的作者 吃惊。没有灾难性回溯,因为它背后没有正则引擎;下面每一个模式都是少数几个 字符串操作。

2. 五种模式形态

一个工具名 glob恰好是这些形态之一。任何不符合通配符形式的东西都被当作 一个字面的、精确的匹配。
模式形态匹配
""*任意每一次工具调用。
foo.*前缀foo.barfoo.exec——不含foo
*.exec后缀shell.execdb.exec以及exec
*.shell.*中缀local.shell.execbyo.shell.run
shell.exec精确仅字面字符串 shell.exec
阅读接下来的各节,了解每种形态中那个绊倒人的边界。

3. 前缀 —— foo.*

匹配任何名称以 foo. 开头且在点之后至少有一个字符的工具。

匹配

对模式 shell.* 匹配 shell.execshell.runshell.rm

不匹配

shell(前缀要求那个尾随的点以及它之后的某个东西)
用一个前缀 glob 一次性治理整个服务器或类别——一个 shell.* 拒绝覆盖一个 服务器以后可能添加的每一个 shell 动词。

4. 后缀 —— *.exec

匹配任何名称以 .exec 结尾、锚定在一个点上的工具——并且也匹配单独的 裸的、无命名空间的动词 exec
这个裸动词匹配是有意的。提供商原生函数调用以及不做命名空间的 MCP 服务器 会以工具的裸动词暴露它(只是 exec,而非 shell.exec)。一条 *.exec 规则覆盖两种形态,所以一个不做命名空间的工具不会被静默漏掉。
后缀保持锚定——它不会匹配一个部分单词:
模式shell.execexecshell.execute
*.exec匹配匹配不匹配
shell.execute 需要 *.execute;后缀只在一个点边界或字符串开头触发, 绝不在单词中间。

5. 中缀 —— *.shell.*

匹配任何名称把 .shell. 作为中缀包含、每一侧至少有一个字符的工具。 这就是一条规则如何覆盖一个动词,无论一个 BYO-MCP 服务器恰好如何为它做 命名空间。
{
  "label": "gate every shell tool, any server",
  "tool_name_glob": "*.shell.*",
  "verdict": "deny"
}
那条规则匹配 local.shell.execbyo.shell.run 以及任何其他 <server>.shell.<verb> 形态。它匹配裸 shell 或一个周围什么都没有的 裸 .shell.——每一侧至少一个字符的要求让中缀保持诚实。
中缀形式只是对称的 *.X.* 形态。一个在中间带星号的模式—— foo.*.bar——不是一个中缀 glob;它落到一个精确字符串匹配(它只 匹配一个字面名为 foo.*.bar 的工具,而那不会存在)。要匹配”以 foo. 开头、以 .bar 结尾”,你需要两条规则或一个 参数子句,而非一个 glob。

6. 精确 —— shell.exec

任何不是上面通配符形态之一的东西都是一个字面字符串匹配。shell.exec 匹配 shell.exec 而无其他。当你想点名一个特定工具时这是正确的选择——把它 与一个 参数子句 搭配以进一步 收窄(“只在命令是 rm -rf 时拦截 shell.exec”)。

7. 一个具体示例

假设你想拒绝每一个破坏性 shell 动词,无论一个 MCP 服务器如何为它做命名 空间,同时让其他一切审计。在控制台规则编辑器中(写入需要 Developer+), 该规则的匹配那一半是一个单一的中缀 glob:
{
  "label": "deny shell across servers",
  "stage": "response",
  "tool_name_glob": "*.shell.*",
  "verdict": "deny"
}
把一个密钥绑定到该策略(密钥上的 firewall_policy_id),现在该规则捕获 local.shell.execbyo.shell.runacme.shell.rm——三个服务器,一个 glob。想在依赖它之前确认它在你预期的内容上触发?使用 测试规则——它返回判定、匹配到的规则 和原因,而不派发任何东西。
一个 glob 收窄哪个工具。要按用什么参数收窄,把一个 参数子句 AND 到同一条规则上; 要仅在一个特定技能拥有一个工具时治理它,添加一个技能名 glob(相同 语法,对照所属技能匹配)。两者都在 防火墙规则 中讲解。

8. 快速参考

是的。*.exec 匹配 shell.execdb.exec以及裸的、无命名空间的 exec。前缀 glob(foo.*匹配裸命名空间 foo——只匹配点之后 有东西的名称。
不。引擎理解的唯一中间通配符形态是对称中缀 *.X.*foo.*.bar 落到 一个精确字面匹配。改用两条规则或一个参数子句。
是的。Shell.Execshell.exec 是不同的工具。从 Discovered tools 标签逐字复制名称。
任何不是上面五种之一的形态都被当作一个精确匹配——它根本不会匹配一个 真实的工具名,所以该规则永不触发,而不是匹配某个意外的东西。控制台在 保存时验证规则。

相关

工具白名单

用 glob 允许一个已知集合并拒绝其余。

验证参数

把一个 JSONPath 参数子句 AND 到一个 glob 上。

规则 schema

一处看清一条规则的每一个字段。
关于完整的匹配语言——判定、执行面、egress 列表和序列——参见 防火墙规则。刚接触这个平面?从 防火墙概览 开始。