mcpField
W
What's Allowed

What's Allowed

本地服务
shifttheculture.media安全04 周前更新

关于 What's Allowed

What's Allowed 是面向编码 Agent 用户的 MCP 服务,用于检查 Claude Code 权限设置如何合并。它说明文件优先级和有文档依据的规则问题,但不模拟实际判定,也不修改文件。

主要功能

  1. 01汇总生效的权限设置
  2. 02展示设置文件优先级
  3. 03查找有据可查的规则问题
  4. 04报告无人监督时可执行的操作面

适用场景

  1. 01检查拒绝规则是否会被采用
  2. 02追踪哪个设置文件优先
  3. 03审查钩子和无条件允许规则

MCP 相关

MCP 客户端可调用工具,检查合并后的 Claude Code 权限设置、规则问题和无人监督时可执行的操作面。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"stcmain-whats-allowed": {
"command": "npx",
"args": [
"-y",
"whats-allowed-mcp"
]
}
}
}
启动命令npx -y whats-allowed-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmwhats-allowed-mcp0.1.1

工具

4

收录的工具列表 · 更新于 2 周前

参数类型必填说明
dirstring否要检查其权限的项目目录的绝对路径。默认为服务器的工作目录。

详细介绍

whats-allowed-mcp

npm License: MIT stcmain/whats-allowed-mcp MCP server

你写了一条拒绝规则。它起作用了吗? 这是一个 MCP 服务,会读取所有影响 Agent 权限的设置文件,显示其中哪一个生效,并列出客户端接受后又忽略的规则。

原因

编码 Agent 的权限规则并不只存在于一个文件中。最多会同时存在于五处:机器级托管策略、团队提交的项目文件、被 git 忽略的本地文件、用户文件,以及会话写入的内容。这些规则会合并,然后按拒绝 → 询问 → 允许的顺序评估,首个匹配项优先,规则的具体程度不会打破平局。

合并本身就够复杂了。真正棘手的是,有好几种规则形式虽然会被接受,却悄无声息地不起作用:

  • Write(docs/**) — 文件权限只会根据 Edit(path) 和 Read(path) 规则检查。Write、NotebookEdit、MultiEdit 或 Glob 路径规则虽然会被接受,但从不会被查询。
  • Bash(command:rm *) — 规则无法使用 param:value 形式匹配工具的主要内容字段。它会被忽略,因为复合命令可以绕过它。
  • allow 中的 "mcp__*" — 未锚定的 allow glob 会被跳过,不会自动批准任何内容。
  • 用户设置中的 Read(/.env) — 单个前导斜杠会锚定到设置来源,因此该规则保护的是 ~/.claude/.env,而不是每个项目中的 .env。
  • deny 中的 Bash(git push *) 之下,allow 中的 Bash(git push origin main) — 拒绝规则不能包含允许列表例外,因此这条允许规则无法生效。

Claude Code 会在启动时警告其中一些问题,但等你真正需要时,相关内容早已在滚屏中消失。没有任何东西会汇总这些问题、告知 Agent 本身,也不会一次性展示所有五个文件合并后的情况。本工具可以做到。

效果展示

假设项目中的 .claude/settings.json 如下:

{
  "permissions": {
    "deny": ["Bash(git push *)", "Write(.env*)"],
    "allow": [
      "Bash(npm run test:*)",
      "Bash(git push origin main)",
      "Bash(npx *)",
      "Bash(ls*)"
    ]
  }
}

……用户的 ~/.claude/settings.json 中包含 "deny": ["Read(/.env)"] 和 "defaultMode": "acceptEdits",那么 whats_allowed 会返回以下结果(此处缩短了路径):

# Permissions in force

| | |
|---|---|
| Settings files contributing | 2 of 5 possible |
| Permission rules | 3 deny, 0 ask, 4 allow |
| Blanket allow rules (whole tool) | 0 |
| Hook commands wired to agent events | 0 |
| Extra directories granted | 0 |
| Rules that do not do what they look like | 5, of which 1 is ignored outright |

## Default mode

`defaultMode` = **`acceptEdits`**, set in User (`~/.claude/settings.json`).

> Automatically accepts file edits and common filesystem commands (`mkdir`,
> `touch`, `mv`, `cp`) for paths in the working directory or additionalDirectories.

## First things to look at

- **Path rule on Write** — `Write(.env*)` in Project settings
- **Allow rule on a command runner (`npx`)** — `Bash(npx *)` in Project settings
- **Trailing wildcard with no word boundary** — `Bash(ls*)` in Project settings

七条规则。其中五条的实际作用与字面含义不同;而大家都会以为会生效的 Write(.env*),实际上根本不会被查询。

工具

工具作用
whats_allowed概览:哪些文件会产生影响、拒绝/询问/允许规则的数量、生效的 defaultMode、一概允许的规则、钩子,以及行为异常的规则数量。从这里开始
permission_sources按优先级顺序确定由哪个文件决定 — 文件是否存在、解析状态、规则数量,以及每个文件中前导 / 的锚定位置
rule_findings列出所有实际行为与表面意图不符的规则,并说明原因及文档中建议的替代方案
unattended_surface展示无人看管时会继续执行的内容:默认模式、一概允许的规则、额外目录、模式保护机制及钩子命令

安装

Claude Desktop(一键安装,无需终端): 从 Releases 下载最新的 whats-allowed-mcp-<version>.dxt,并用 Claude Desktop 打开(双击,或选择 Settings → Extensions → Install Extension…)。服务及其依赖项都已打包在其中,无需 npm,也无需安装 Node。

在 Claude Code 中注册(每个会话均可使用):

claude mcp add --scope user whats-allowed -- npx -y whats-allowed-mcp

或者在任何 MCP 客户端配置中:

{
  "mcpServers": {
    "whats-allowed": {
      "command": "npx",
      "args": ["-y", "whats-allowed-mcp"]
    }
  }
}
从源代码安装
git clone https://github.com/stcmain/whats-allowed-mcp
cd whats-allowed-mcp && npm install && npm run build
# then point your client at node /path/to/whats-allowed-mcp/dist/index.js

此项目以 whats-allowed-mcp 的名称发布在 npm 上,并以 io.github.stcmain/whats-allowed-mcp 的名称发布在 MCP Registry 中。

无需配置。无需环境变量。如果你移动了用户配置目录,本工具会遵循 CLAUDE_CONFIG_DIR。

检查内容,以及不会臆测的内容

每项发现都对应 Anthropic 记录在文档中的行为,并且都链接到相应段落。没有风险评分,没有严重性排名,也没有“可疑规则”启发式判断——这些方法在处理普通配置时会得出自信却荒谬的结论。

会报告:

  • Write / NotebookEdit / MultiEdit / Glob 上的路径规则;文件权限检查不会查询这些规则
  • 针对工具主要内容字段的 Tool(param:value) 规则;这些规则会被直接忽略
  • allow 中未锚定的工具名称 glob;它们不会自动批准任何内容
  • 在 shell 模式末尾以外使用的 :*;此时冒号会被视为字面字符
  • 用户设置中的 /path 规则;它们会锚定到配置目录,而非项目目录
  • 没有单词边界的尾随 *——Bash(ls*) 也会匹配 lsof
  • 针对会运行其他命令的命令(npx、docker exec、bash -c、xargs、devbox run……)的 allow 规则;这些规则会批准其后的任何内容
  • 试图约束 URL 的 Bash 规则;文档本身称其脆弱
  • 被 deny 或 ask 规则优先拦截的 allow 规则
  • 在多个文件中声明的规则

有意不报告:

  • 你的规则是否表达了你想要的意思。 这是对意图的判断,而本服务并不具备这种判断能力。
  • 需要通配符求解器才能判断的遮蔽情况。 只有当阻止规则是能够明确覆盖该规则的前缀模式时,allow 规则才会被判定为不可达。更微妙的情况不会臆测,而是留作不判,因此本工具会有意少报。
  • 对假设命令的判定。 见下文。

明确的局限

  • 它不会模拟客户端的决策。 本工具没有“git push 是否会被允许”之类的工具,这是有意为之:Claude Code 内置的只读命令集、包装器剥离(timeout、nice、xargs……)、复合命令拆分、沙盒状态以及 PreToolUse hook 的结果,都会影响实际判定。静态判定经常会自信地给出错误答案,其价值甚至不如不提供答案。请在客户端中使用 /permissions 查看实时状态;使用本工具了解它为何会给出相应结果。
  • 无法看到命令行标志。 --allowedTools、--disallowedTools、--permission-mode 和 --settings 位于托管策略与本地设置之间,并不会保存在磁盘上。
  • 通过 /permissions 添加的会话规则会写入本服务读取的文件,但仅针对单个会话添加的规则不会写入。
  • 它只报告,不会修复。 不会编辑任何内容,也不会建议删除规则。若文档提供了修正后的形式,本工具会引用该形式;若未提供,发现内容就止于观察结果。
  • 会报告 ~/.claude/settings.local.json,但不会对其进行优先级排序。 该文件确实存在,且 Claude Code 会写入其中;已发布的优先级表列出了四个作用域,但不包括该文件。本服务不会臆造它的优先级位置。
  • 以 Claude Code 的架构为准。 不会解析采用自身权限系统的其他客户端。
  • 它从不读取 git 历史记录,也不会告诉你是谁或何时添加了某条规则。git log -p .claude/settings.json 更适合完成这项工作。

设计说明 / 威胁模型

  • 不启动子进程。不使用 Shell。不联网。不写入。 唯一使用的 Node API 是 node:fs 读取、node:path 和 node:os。源码中完全没有导入 child_process,因此读取设置文件时,不会执行其中的任何内容——包括它所报告的钩子命令和 apiKeyHelper 脚本。
  • 绝不读取 env 值,只读取名称。 设置文件是明文 API 密钥最常出现的地方之一,而将密钥粘贴到上下文窗口中的工具,只会让问题变得更糟。apiKeyHelper 也是如此:只报告它是否存在,不读取或运行脚本。
  • 设置文件中的字符串会受到隔离并加上标注。 为了让规则文本和钩子命令有用,必须展示出来。它们会放在行内代码片段中,并对反引号进行处理、转义竖线、展平换行,因此精心构造的字符串无法逃出代码片段或 Markdown 表格;每个代码块还会附带一条常驻说明,指出引用的文本是文件中的数据,而非指令。
  • dir 是唯一由模型控制的路径,并且在设计上受到了限制:解析路径、获取真实路径,并要求它指向现有目录。此后只读取固定文件名——.claude/settings.json、.claude/settings.local.json、用户配置文件和平台的托管策略路径。不使用 glob,不遍历目录,不读取任意文件。
  • 工作量有上限: 每个文件最多 2 MB;查找项目根目录时,遍历次数有上限;无法解析的文件会报告为未解析,不会进行不完整的猜测。
  • 发现项在设计上采取保守原则。 每项检查都有文档化行为作为依据;任何需要判断意图的情况都不会报告。对于一个人们用来判断防护措施是否真实存在的工具而言,少报才是正确的故障模式。

关于我们

由 Shift The Culture 构建——我们以 AI Agent 运营一家一人公司,并发布自己所需的工具。此服务免费,采用 MIT 许可证,没有任何附加条件。

它还有三个同系列工具,也都免费并采用 MIT 许可证:

  • whats-running-mcp — 查看当前机器上实际运行的内容,而不是旧对话记录声称的内容。
  • whats-loaded-mcp — 查看输入内容之前是什么占用了你的上下文窗口:技能说明、记忆文件及其导入内容。
  • whats-inherited-mcp — 查看你未编写的检出内容要求 Agent 做什么:指令文件、钩子,以及其中声明的 MCP 服务。

该工具套件的其余部分为付费内容:

  • Agent Fleet Ops Kit($29)— 涵盖在一台机器上运行三个或四个 Agent 时的其他故障模式:两个会话同时编辑同一检出目录、无人负责的开发服务器(导致 Agent 测试的应用与它编辑的应用不同),以及崩溃会话遗留的 MCP 服务占用端口和内存数周。 更喜欢使用 PayPal?同一套工具也可在 Payhip 购买。
  • Agent Reliability Kit($29)— 包含一个 Stop 钩子和两个 CLI;当 Agent 声称已完成,但实际上从未检查过相应的仓库、URL 或构建时,它们会阻止该轮操作。 更喜欢使用 PayPal?同一套工具也可在 Payhip 购买。

无论如何,上述服务始终免费并采用 MIT 许可证——其中没有任何追加销售内容,没有遥测,也不依赖付费工具套件。

赞助商

此服务采用 MIT 许可证,并将继续采用 MIT 许可证。没有专业版,没有遥测,也不会从免费版本中扣留任何功能。赞助为维护工作提供资金,且不会改变上述任何一点。

目前还没有赞助商——首个名额虚位以待。 企业赞助商的名称或徽标将显示在本节、三个同系列服务以及赞助商页面上。赞助级别、具体展示位置以及明确不包含的权益请见: https://shifttheculture.media/sponsor

个人赞助:https://paypal.me/ShiftTheCultureLLC — 金额不限,无附加权益,无级别。

许可证

MIT © Zachary Pampu

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。