What's Allowed

io.github.stcmain由 GitHub 账号 stcmain 发布v0.1.2更新于 Oct 24, 2026

Merged agent permission rules: which settings file wins, and which rules your client ignores.

已验证STDIO仅桌面开发者工具安全与监控

概览

AI 生成的概览

一个本地 MCP 服务器,读取为 Claude Code 代理权限提供配置的各个设置文件,报告哪个文件生效、哪些规则被静默忽略。

可以做什么
汇总合并后的权限全貌:参与贡献的设置文件、deny/ask/allow 规则数量、生效的默认模式、整体放行规则与钩子,以及有多少规则行为异常。按优先级列出设置来源,包括是否存在、解析状态、规则数量,以及前导斜杠锚定到哪里。报告每条文档行为与表面意图不符的规则,并给出原因和文档中的替代写法。展示无人值守时会发生什么:默认模式、整体放行、额外目录、模式守卫和钩子命令。
适用场景
当你为编码代理写了 deny 或 allow 规则、想知道它们是否真正生效时使用;当多个设置文件被合并、需要看清哪个文件胜出时也适用。它解释客户端权限视图为何如此显示,但不会判断某条假设命令是否会被允许。
运行要求
作为本地 stdio 进程运行,通常通过 npx 调用 whats-allowed-mcp 包,或使用 Claude Desktop 扩展包。无需配置、环境变量或 API 密钥;若用户配置已迁移,会遵循 CLAUDE_CONFIG_DIR。它只从磁盘读取设置文件。
安装前请注意
它会读取设置文件,而这类文件常含明文 API 密钥;README 称从不读取 env 的值、只读取名称,apiKeyHelper 脚本既不读取也不执行。它只报告、从不修改文件,不启动 shell 或子进程,也不访问网络。检查结果刻意保守,不判断规则是否符合你的意图。

安装

在 SourceWeft 中

  1. 打开 控制台中的 What's Allowed,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

whats-allowed-mcp

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

You wrote a deny rule. Did it do anything? An MCP server that reads every settings file feeding your agent's permissions, shows which one wins, and lists the rules your client accepts and then ignores.

Why

Permission rules for a coding agent are not in one file. They are in up to five at once: a machine-wide managed policy, the project file your team commits, a git-ignored local file, your user file, and whatever a session wrote. They are merged, and then evaluated deny → ask → allow, where the first match wins and specificity does not break the tie.

That merge is hard enough. The part that actually bites is that several rule shapes are accepted and then quietly do nothing:

  • Write(docs/**) — file permissions are checked against Edit(path) and Read(path) rules only. A Write, NotebookEdit, MultiEdit or Glob path rule is accepted and never consulted.
  • Bash(command:rm *) — a rule can't match a tool's primary content field with the param:value form. It is ignored, because a compound command would bypass it.
  • "mcp__*" in allow — an unanchored allow glob is skipped and auto-approves nothing.
  • Read(/.env) in user settings — a single leading slash anchors at the settings source, so that rule protects ~/.claude/.env, not the .env in each of your projects.
  • Bash(git push origin main) in allow under a Bash(git push *) in deny — a deny rule cannot carry allowlist exceptions, so the allow rule is unreachable.

Claude Code warns about some of these at startup, in a scrollback you have already lost by the time you care. Nothing collects them, nothing tells the agent itself, and nothing shows you the merged picture across all five files at once. This does.

What it looks like

Given a project .claude/settings.json:

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

…and a user ~/.claude/settings.json with "deny": ["Read(/.env)"] and "defaultMode": "acceptEdits", whats_allowed returns (paths shortened here):

# 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

Seven rules. Five of them do something other than what they read as — and the one everybody would have bet on, Write(.env*), is never consulted at all.

Tools

ToolWhat it answers
whats_allowedThe headline: which files contribute, how many deny/ask/allow rules, the winning defaultMode, blanket allows, hooks, and how many rules misbehave. Start here
permission_sourcesWhich file decides, in precedence order — existence, parse state, rule counts, and what a leading / anchors to in each one
rule_findingsEvery rule whose documented behaviour differs from its apparent intent, with the reason and the documented alternative
unattended_surfaceWhat proceeds with nobody watching: default mode, blanket allows, extra directories, mode guards, and hook commands

Install

Claude Desktop (one-click, no terminal): download the latest whats-allowed-mcp-<version>.dxt from Releases and open it with Claude Desktop (double-click, or Settings → Extensions → Install Extension…). The server and its dependencies ship inside the bundle — no npm, no Node install.

Register with Claude Code (available in every session):

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

Or in any MCP client config:

json
{  "mcpServers": {    "whats-allowed": {      "command": "npx",      "args": ["-y", "whats-allowed-mcp"]    }  }}
From source
bash
git clone https://github.com/stcmain/whats-allowed-mcpcd whats-allowed-mcp && npm install && npm run build# then point your client at node /path/to/whats-allowed-mcp/dist/index.js

Published as whats-allowed-mcp on npm and as io.github.stcmain/whats-allowed-mcp in the MCP Registry.

No configuration. No environment variables. Respects CLAUDE_CONFIG_DIR when you have moved your user config.

What it checks, and what it refuses to guess

Every finding corresponds to behaviour Anthropic documents, and every one links to the paragraph it comes from. There is no risk score, no severity ranking and no "suspicious rule" heuristic — those produce confident nonsense on ordinary configurations.

Reported:

  • Path rules on Write / NotebookEdit / MultiEdit / Glob, which file permission checks never consult
  • Tool(param:value) rules aimed at a tool's primary content field, which are ignored outright
  • Unanchored tool-name globs in allow, which auto-approve nothing
  • :* used anywhere but the end of a shell pattern, where the colon is literal
  • /path rules in user settings, which anchor at the config directory rather than at your project
  • Trailing * with no word boundary — Bash(ls*) also matches lsof
  • Allow rules on commands that run other commands (npx, docker exec, bash -c, xargs, devbox run…), which approve whatever follows them
  • Bash rules that try to constrain a URL, which the docs themselves call fragile
  • Allow rules a deny or ask rule reaches first
  • Rules declared in more than one file

Deliberately not reported:

  • Whether your rules express what you want. That is a judgement about intent and this server does not have one.
  • Shadowing that needs a wildcard solver. An allow rule is only called unreachable when the blocking rule is a prefix pattern that provably covers it. Anything subtler is left alone rather than guessed at, so this under-reports on purpose.
  • A verdict for a hypothetical command. See below.

Honest limitations

  • It does not simulate your client's decision. There is no "would git push be allowed" tool, and that is a design choice: Claude Code's built-in read-only command set, wrapper stripping (timeout, nice, xargs…), compound-command splitting, sandbox state and PreToolUse hook results all participate in the real answer. A static verdict would be confidently wrong often enough to be worth less than no answer. Use /permissions in your client for the live view; use this to understand why it says what it says.
  • Command-line flags are invisible. --allowedTools, --disallowedTools, --permission-mode and --settings sit between managed policy and local settings, and they are not on disk.
  • Session rules added through /permissions land in files this server reads, but rules added for one session only do not.
  • It reports; it does not fix. Nothing is edited, and no finding is ever a recommendation to delete a rule. Where the docs give a corrected form, it is quoted; where they don't, the finding stops at the observation.
  • ~/.claude/settings.local.json is reported but not ranked. It exists and Claude Code writes to it; the published precedence table lists four scopes and does not include it. This server refuses to invent its position.
  • Claude Code's schema is the model. Other clients with their own permission systems are not parsed.
  • It never reads git history, and it does not tell you who added a rule or when. git log -p .claude/settings.json does that better.

Design notes / threat model

  • No child processes. No shell. No network. No writes. The only Node APIs used are node:fs reads, node:path and node:os. There is no child_process import anywhere in the source, so nothing in a settings file can be executed by reading it — including the hook commands and apiKeyHelper scripts it reports on.
  • env values are never read — only names. Settings files are one of the most common places for a plaintext API key, and a tool that pasted one into a context window would be worse than the problem it solves. The same applies to apiKeyHelper: presence is reported, the script is neither read nor run.
  • Settings-authored strings are fenced and labelled. Rule text and hook commands have to be shown to be useful. They are emitted inside inline code spans with backticks neutralised, pipes escaped and newlines flattened, so a crafted string cannot break out of the span or out of a markdown table, and each block carries a standing note that the quoted text is data from a file, not instructions.
  • dir is the one model-controlled path, and it is bounded by construction: resolved, real-pathed, and required to be an existing directory. From there only fixed filenames are read — .claude/settings.json, .claude/settings.local.json, the user config file, the platform's managed-policy path. No globbing, no traversal, no arbitrary file reads.
  • Bounded work: a 2 MB ceiling per file, a capped walk when looking for the project root, and files that fail to parse are reported as unparsed rather than partially guessed at.
  • Findings are conservative by construction. Every check is anchored to documented behaviour; anything that would need a judgement call about intent is not reported at all. For a tool people use to decide whether a guard rail is real, under-reporting is the correct failure mode.

Who makes this

Built by Shift The Culture — we run a one-person company on AI agents and ship the tooling we needed ourselves. This server is free and MIT-licensed, no strings.

It has three siblings, all also free and MIT:

  • whats-running-mcp — what is actually running on the box right now, instead of what an old transcript claims.
  • whats-loaded-mcp — what is eating your context window before you type: skill descriptions, memory files and their imports.
  • whats-inherited-mcp — what a checkout you did not write tells your agent to do: instruction files, hooks, and the MCP servers it declares.

The rest of that tooling is paid:

  • Agent Fleet Ops Kit ($29) — the other failure modes of running three or four agents on one box: two sessions editing the same checkout, a dev server nobody owns (so the agent tests a different app than it edits), and MCP servers leaked from crashed sessions that hold ports and RAM for weeks. Prefer PayPal? Same kit on Payhip.
  • Agent Reliability Kit ($29) — a Stop hook and two CLIs that block a turn when an agent claims "done" against a repo, URL, or build that was never actually checked. Prefer PayPal? Same kit on Payhip.

The server above stays free and MIT either way — it has no upsell in it, no telemetry, and no dependency on the paid kits.

Sponsors

This server is MIT and stays MIT. There is no pro edition, no telemetry, and nothing held back from the free build. Sponsorship is how the maintenance gets paid for without any of that changing.

No sponsors yet — the first slot is open. Company sponsors get their name or logo in this section, in the three sibling servers, and on the sponsor page. Tiers, exactly what the placement is, and what it explicitly does not buy: https://shifttheculture.media/sponsor

Individuals: https://paypal.me/ShiftTheCultureLLC — any amount, no perks, no tier.

License

MIT © Zachary Pampu

来源:README.md,提交 0678fae

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.2最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分