Topic: claude code audit skill

Claude Code: audit a Skill — manifest, handlers, and what changes vs an MCP server

"Claude Code audit skill" is the inverse phrasing of the rest of this page cluster — the searcher is asking how to audit a skill they're using or shipping in Claude Code's Skills format specifically. That format has a manifest, declared capabilities, in-process handlers, and a different protocol-compatibility surface than a remote MCP server. The audit changes accordingly. This page names what's different, what's the same, and how the SkillAudit engine handles each.

TL;DR

A Claude Code Skill is the file-format unit Anthropic ships for in-CLI extensions: a directory containing a SKILL.md manifest plus optional handler scripts, declaring capabilities the agent can invoke. Auditing one means checking (a) manifest scope — declared permissions vs what the handlers actually use, (b) handler safety — the same SSRF/credentials/exec/deserialization classes that apply to MCP, (c) prompt-injection susceptibility — handlers that pull external content, (d) protocol compatibility — version pin and skill-format compliance. SkillAudit accepts a Skill directory as a ZIP upload or via a GitHub URL; the engine adapts its rule pack to the in-process shape and runs the same six-axis grade as for MCP servers. ~60s pass-time, free for public repos. Run an audit.

Two intents on the same query — both addressed

"Claude Code audit skill" parses two ways:

  1. "Audit my Claude Code Skill" — the searcher wrote a Skill (or installed one from a community source) and wants the security/quality signal before publishing or before letting it run in their agent. Primary intent for this page.
  2. "A Claude Code skill that performs auditing" — the searcher is looking for a Skill they can install into Claude Code that audits their code. We ship one of these too — skillaudit/cc-audit-skill wraps the public scanner so claude can invoke it on a path. Linked at the end of this page.

Most of this page covers intent 1. Intent 2 is the small section at the end — the Skill is a thin wrapper, not the page's main subject.

What's different about a Claude Code Skill vs a remote MCP server

Both are agent-extensible surfaces, but the threat model and the audit shape differ in ways that matter:

PropertyMCP server (remote)Claude Code Skill (in-process)
Process boundarySeparate stdio/HTTP processRuns in the agent's process / shell context
Capability declarationTool definitions registered at startupSKILL.md manifest + frontmatter
Permission scopeOAuth scopes, env varsFile-system root, allowed binaries, network
Execution modelJSON-RPC tool callsDirect function/script invocation by agent
Failure blast radiusToken exfil + reachable APIsLocal FS, shell, dev environment
Audit emphasisTool argument tainting → fetch/exec sinksManifest scope drift + handler taint + shell shape
Prompt-injection concernTool returns external content to modelSkill instructions + agent files mixed in same context
Re-audit cadence triggerServer bump, model retrainSKILL.md edit, handler edit, claude-code version bump

In practice: a Skill audit weights the manifest-scope axis higher because a Skill running in your shell with broad scope is closer to "trust me with your laptop" than a remote MCP server with a network-bounded scope.

The four things a Claude Code Skill audit specifically checks

1. Manifest scope vs handler reality

The SKILL.md frontmatter declares what the Skill can do — typically allowed file roots, allowed shell commands, network endpoints, and any required environment variables. The audit compares the declared shape to what the handler scripts actually do. Three classes of finding:

This is the highest-leverage axis for a Skill audit. The MCP-server analogue (OAuth scope drift) is lower-leverage because the OAuth provider enforces some of it; in the Skill case, the only enforcer is the host runtime, and it's permissive by design.

2. Handler safety — the seven static classes

The handler scripts (Bash, Node, Python, depending on the Skill) get the same static taint pass as MCP server tool handlers, slightly remapped for the in-process shape:

3. Prompt-injection susceptibility

For a Skill that reads external content (web pages, files outside the declared root, RSS, third-party APIs) and surfaces it back to the agent, the same prompt-injection probe bank from the MCP-server audit applies. The threat model is slightly different — the Skill instructions and the agent's own conversation share the same context window, and an injected instruction can hijack subsequent agent actions across other Skills. We probe the live Skill in a sandboxed Claude Code environment with the same 14-probe bank used against MCP servers; the susceptibility band is reported on the security axis the same way.

4. Protocol / Skill-format compatibility

The Claude Code Skills format versions; format-breaking changes have happened in the past and will happen again. A Skill that "works" on the current claude-code release can fail to load on the next minor version if the manifest schema tightens. The audit checks: SKILL.md matches current schema, declared claude-code version range is sane (not pinned to one patch, not unbounded), handler-script shebangs and runtimes are present in the declared environment. This is the analogue of the client-compatibility axis on the MCP-server side; on Skills it's tighter because the host is just claude-code, not four clients.

How SkillAudit handles a Claude Code Skill input

  1. Input formats accepted. A GitHub URL pointing at a Skill repo, an uploaded ZIP of the Skill directory, or a path inside a monorepo. The engine detects the Skill shape from the presence of SKILL.md at the root.
  2. Manifest parse. The frontmatter and body of SKILL.md are parsed; declared scopes and capability shape feed the manifest-vs-handler diff.
  3. Static pass. The same tree-sitter rule pack runs against handler scripts, with the seven Skill-class subset enabled. Bash handlers go through a Bash-specific rule pack (a smaller set than the JS/Python ones because Bash has fewer safe-by-construction call shapes; we lean on shellcheck-style heuristics plus our own taint rules).
  4. Sandbox boot + LLM probe. The Skill loads in a sandboxed claude-code instance with stubbed env and recorded network. The probe bank runs against any handlers that match the susceptible-shape predicate. Pass-time slightly higher than MCP-server audits (60–120s vs 30–90s) because Skill boot is heavier than MCP-server stdio boot.
  5. Grade. The same six-axis A–F. The manifest-vs-handler diff feeds the permissions-hygiene axis, weighted higher than for MCP servers per the threat-model table above.
  6. Output. Public report page + embeddable badge + remediation hints per finding. Same artifact shape as MCP-server audits; same Pro/Team plan structure for private Skills and CI gates.

Audit a Claude Code Skill

Common F-grade patterns in Claude Code Skills

From the Skills we've audited so far, the F-grade patterns cluster:

Patches for each of these are mechanical — typically one to five lines. The most leveraged fix is tightening the manifest shell declaration to a closed set; that one change usually moves a manifest-axis grade from D/F to B.

Intent 2: a Claude Code Skill that performs auditing

If you arrived here looking for a Skill you can install into Claude Code that wraps SkillAudit so claude can audit a path, that's skillaudit/cc-audit-skill — install via claude plugin install skillaudit/cc-audit-skill (subject to availability — the Skills marketplace is rolling out). The Skill exposes /skillaudit <path-or-url>; output is the same report as the web flow, rendered in your terminal. Source is on GitHub; it self-audits on every release (the report is in the README). For most authors auditing their own Skills this is a faster loop than uploading a ZIP — but the public badge embed comes from the web side either way.

Where this page sits in the cluster

This page is the format-specific take. Two siblings cover adjacent intents:

Related questions

Is a Skill audit different from an MCP server audit?

Yes — same six axes, different weighting and a couple of swapped-in classes. The biggest delta is the manifest-vs-handler diff, which is the highest-leverage axis on Skills and a smaller axis on MCP servers. The static rule pack overlaps about 80% with the MCP-server pack; the LLM-probe bank is the same.

Can I audit a Skill before it's published?

Yes — upload as a ZIP or point to a private GitHub repo on the Pro plan. The audit doesn't require the Skill to be in any registry; pre-publish is the most common audit shape we see for Skills.

Does the audit work on Skills that aren't open source?

If you have the source, yes — Pro plan, private repo or ZIP upload. If you only have the installed binary/installed Skill directory and not the source, partial — the manifest pass works, the static pass doesn't on minified/compiled handlers. For closed-source Skills the right answer is usually to ask the author for the source or to use a different Skill.

Why is "shell: any" auto-flagged?

Because the entire point of declaring scope is to bound the blast radius. shell: any says "this Skill can run any binary on the user's machine"; even if the handler today only runs git, the manifest contract is an unbounded one. Tightening to a closed set (e.g. shell: [git, node, npm]) is a one-line fix that moves the grade.

How do I wire a Skill audit into CI?

Same as the MCP-server flow — use the GitHub Action. The action auto-detects Skill vs MCP-server shape and runs the appropriate rule pack. Configure a minimum-grade gate (we recommend B for Skills given the in-process blast radius, vs B for MCP servers). Wiring details.

What about Skills written in languages SkillAudit doesn't statically support?

The static layer covers TypeScript, JavaScript, Python, and Bash today. Skills in Go, Rust, or shell-other-than-Bash get partial coverage — the manifest pass and the LLM-probe pass run; the static pass is skipped with a warning. A finding from the manifest or the probe is still a finding; the absence of static findings shouldn't be read as "the static layer would have found nothing." Coverage roadmap in the methodology page.

Further reading