关于 What's Allowed
What's Allowed 是面向编码 Agent 用户的 MCP 服务,用于检查 Claude Code 权限设置如何合并。它说明文件优先级和有文档依据的规则问题,但不模拟实际判定,也不修改文件。
主要功能
- 01汇总生效的权限设置
- 02展示设置文件优先级
- 03查找有据可查的规则问题
- 04报告无人监督时可执行的操作面
适用场景
- 01检查拒绝规则是否会被采用
- 02追踪哪个设置文件优先
- 03审查钩子和无条件允许规则
MCP 相关
MCP 客户端可调用工具,检查合并后的 Claude Code 权限设置、规则问题和无人监督时可执行的操作面。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
4收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dir | string | 否 | 要检查其权限的项目目录的绝对路径。默认为服务器的工作目录。 |
详细介绍
whats-allowed-mcp
你写了一条拒绝规则。它起作用了吗? 这是一个 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
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。