The official page gives away the answer in its first sentence: "A Claude Code plugin you install can execute arbitrary code on your machine with your user privileges." This issue gives you three commands you can run today, the official four-step review, what each trust tier actually guarantees, and the least intuitive part — you don't have to install anything at all. A git clone and one claude -p is enough.
Skills and plugins are already a link in your software supply chain; nobody manages them like a dependency. NVIDIA's own scanner puts an uncomfortable number in its README: in the analyzed subset of their research dataset, 26.1% of skills contain vulnerabilities and 5.2% show likely malicious intent (per the NVIDIA/SkillSpector GitHub repository page, 2026-10). This issue doesn't stop at the scare: the runnable intake pipeline comes first, the criteria come later, and the criteria exist to choose among the tools named here.
# 1. Inventory what is ALREADY on this machine (covers a dozen-plus clients)
uvx snyk-agent-scan@latest
# 2. For the next candidate: static scan (--no-llm = no model calls, static only)
uv tool install git+https://github.com/NVIDIA/skillspector.git
skillspector scan ./candidate-skill/ --no-llm
# 3. Official: no session, just list what it would add
claude --plugin-dir ./that-plugin plugin details <plugin-name>
# 4. Structural check — note it validates structure, not safety
claude plugin validate ./that-plugin
--no-skills scans MCP only; --ci exits nonzero on findings. When not to: you've installed nothing third-party — and never put --dangerously-run-mcp-servers in a script, because that drops the per-item consent prompt.claude --plugin-dir … plugin details (official, nothing to install) — kills "the pane won't tell me how many hooks it has." It reads the directory without starting a session and prints a Component inventory: skills and commands, agents, every hook with the event it fires on, and MCP and LSP servers. After install, the same claude plugin details <name> reports on the installed copy under ~/.claude/plugins/cache/.claude plugin validate — checks JSON syntax, required fields, naming rules, and .. in relative paths. Said honestly: it never looks at what a hook runs. ✔ Validation passed has nothing to do with safety.hooks/hooks.json (the command each hook actually executes), .mcp.json (each server's command or URL), and bin/ (every file in the directory). Until you've read those three, the commands above are just a warm-up.bin/ directory: added to the PATH of the Bash tool's shell.The official boundary is blunt: permission rules and the sandbox cover the tool calls Claude makes, not the code a plugin runs by itself — Claude Code runs hooks and MCP servers outside the sandbox, with your full user permissions. Only when Claude uses Bash to run an executable from bin/ is that a tool call, and only then do your permission rules apply.
Skills, slash commands and agents don't execute code. They enter Claude's context as instructions and change what the model does with the tools it already has. And a skill's allowed-tools can grant itself access: the docs say plainly that workspace trust doesn't gate that field — "A skill can grant itself broad tool access, so review the allowed-tools of skills checked into a repository before you run Claude Code there." The ! command lines in a skill body are the same story: they run on your machine before the content reaches the model.
allowed-tools: Used (used even in a claude -p run in a folder you've never trusted); servers in .mcp.json: under -p, connected without asking, approved or not; and permissions.allow: Not used until you accept the dialog. The dangerous half applies by default; the half that protects you does not.# Cheapest one-shot: read no project-side customization at all
claude --bare -p "review the structure of this repo"
# Or turn things off piecemeal: user settings only / all hooks off / reject one server
claude --setting-sources user -p "…"
claude --settings '{"disableAllHooks": true}' -p "…"
# Two standing settings: kill shell execution in skill bodies; deny a skill by name
{ "disableSkillShellExecution": true,
"permissions": { "deny": ["Skill(skill:deploy)"] } }
Putting disableAllHooks in your user settings isn't enough — project settings take precedence and can set it back to false, so pass it via --settings. In deny rules, a bare Skill removes the whole tool from the model's context; the Skill(skill:<name>) form matches that one skill under any of its names.
The community catalog states its guarantee concretely in the README: every plugin listed there was submitted via claude.ai, "passed automated security scanning, and been approved for distribution." The repository itself is a read-only mirror, direct pull requests are closed automatically, and it syncs nightly from the internal pipeline. The hard constraint lives client-side: that catalog pins a commit SHA for nearly every entry, and Claude Code refuses to install a different commit. The third-party tier has none of this — in Anthropic's words, Anthropic doesn't review third-party marketplaces.
knowledge-work-plugins and first-party-plugins) and off for community, third-party and local development marketplaces. Leave the third-party one off; don't switch it on by hand./plugin marketplace add your-org/plugins#v1.2.0 pins the marketplace to a tag.archive source can pin sha256 in its entry, and a mismatched download is refused.After claude plugin uninstall <plugin> --scope <the scope you installed at>, its files stay under ~/.claude/plugins/cache/ for fourteen days before a background sweep removes them; delete that directory yourself if you want them gone now. If it's the owner you distrust, remove the marketplace too — that uninstalls every plugin you got from it.
strictKnownMarketplaces (source allowlist, alias allowedMarketplaces; an empty [] blocks the official one too) · blockedMarketplaces (blocklist, checked before the allowlist) · disableSideloadFlags (rejects --plugin-dir, --plugin-url, --agents and CLAUDE_CODE_PLUGIN_DIRS) · strictPluginOnlyCustomization (allows skills / agents / hooks / mcp only from a plugin, managed settings or the built-ins) · allowManagedHooksOnly · pluginTrustMessage (appends your own text to the pre-install trust warning).
SKILL.md and copy the twenty lines that actually help into your own .claude/skills/ — without its hooks, without bin/, without the MCP server it drags along. For methodology-style skills the value is almost entirely in the body, and the body is the one part you can read end to end.claude --plugin-dir ./that-plugin loads it for one session only and never writes to enabledPlugins (note: this is rejected where a team sets disableSideloadFlags).docx/pdf/pptx/xlsx set source-available) and anthropics/claude-plugins-official. Only after reading a few normal ones can you see why the third-party one has an extra hook.strictKnownMarketplaces: [] blocks the official marketplace along with everything else, and setting any allowlist without a {"source": "skills-dir"} entry stops your own plugins under ~/.claude/skills/ that carry a .claude-plugin/plugin.json from loading (a plain SKILL.md is unaffected). And once a machine has started under a policy that blocked the official marketplace, Claude Code records the blocked attempt and won't retry registration after you change the policy back.anthropics/skills README says these skills are "provided for demonstration and educational purposes only" and asks you to "always test skills thoroughly in your own environment before relying on them for critical tasks." A star count is not a security property.Do these three today: 1. uvx snyk-agent-scan@latest — inventory what's already on the machine; most people discover something here they forgot installing. 2. Run the next third-party candidate through the sequence: skillspector scan ./x --no-llm → claude --plugin-dir ./x plugin details <name> → read hooks/hooks.json, .mcp.json and bin/ by hand. 3. Write two standing settings: "disableSkillShellExecution": true, and leave auto-update off for third-party marketplaces (off is the default).
Add as needed: claude plugin validate (you publish a marketplace) · strictKnownMarketplaces + disableSideloadFlags (you set team policy) · a Skill(skill:<name>) deny rule (keep a skill but stop the model from firing it) · claude --bare -p (you run non-interactively in an unfamiliar repo) · trailofbits/mcp-context-protector (it ships an MCP server and you want pin-on-first-trust).
Explicitly don't: run a bare claude -p in an unfamiliar repo · treat "passed the scan" as "safe" · assume more stars means safer · turn auto-update on for a third-party marketplace · put --dangerously-run-mcp-servers in a script · uninstall the plugin but keep the marketplace · read the Will install pane and think you've read the hook · leave disableAllHooks only in your user settings.
permissions.allow. It does not gate hooks or a skill's allowed-tools.claude plugin details prints: skills and commands, agents, hooks with each hook's event, and MCP and LSP servers. Available before install via --plugin-dir.github.com/anthropics/ is refused, so third parties can't impersonate one.#ref or a sha256.~/.claude/skills/ or a project's .claude/skills/ with a .claude-plugin/plugin.json. Set a marketplace allowlist and you must add {"source": "skills-dir"} or these stop loading.bin/ is a different order of magnitude from wording in the body), does the feature it claims require that capability, and what do you lose by not installing it. The third one usually decides it. Most of the time the answer is "twenty lines of prompt," and then how to read a 70 never comes up.--plugin-dir … plugin details; the trust warning verbatim; cache kept 14 days after uninstall (2026-10)allowed-tools still apply under -p, .mcp.json connects without asking, permissions.allow does not apply); --bare / --setting-sources user / disableAllHooks / disabledMcpjsonServers; the Skill(skill:<name>) deny rule (2026-10)! commands in a skill body run, and disableSkillShellExecution (2026-10)strictKnownMarketplaces / blockedMarketplaces / disableSideloadFlags / strictPluginOnlyCustomization / allowManagedHooksOnly / pluginTrustMessage each enforce and can't do; the [] lockout and the skills-dir trap (2026-10)#ref; a command source asks you to accept it before it runs (2026-10)scan usage; 71 patterns across 17 categories and the 0–100 risk score; SARIF output and --no-llm; the 26.1% / 5.2% dataset figures; its own five stated limitations (Apache-2.0, per its repository page 2026-10)uvx snyk-agent-scan@latest; the discovery coverage for harnesses, MCP servers and skills across a dozen-plus clients; fourteen risk classes; --no-skills / --ci / --dangerously-run-mcp-servers (Apache-2.0, per its repository page 2026-10).claude-plugin/marketplace.json is the catalog (2026-10)