Static security scanner for Claude Code skills, plugins, and MCP servers. Detects env-var exfiltration, install-time shell hooks, prompt injection, committed binaries, and auto-approve configs. Never executes the scanned code.
SkillGuard exposes a single security-scanning tool with a clear, well-motivated purpose. The tool name 'scan_skill' is verb-first and unambiguous. The description (287 chars) is detailed and explains what the tool does, when to use it, and what it returns, well above the 10-char minimum and within the 194-char baseline average. The input schema is present with a 'target' parameter that has a type (string) and description. However, the schema lacks formal constraints (no enum, pattern, or minLength/maxLength), and there is no documented output schema, the description mentions 'returns a verdict (clean/suspicious/dangerous) with the flagged files' but the actual response structure is not formally specified. Error handling is not visible in the provided code excerpt. The tool is READ_ONLY (no state mutation), which is appropriate for a scanner.
Statically scan a Claude Code skill, plugin, or MCP server (a local path or a git/GitHub URL) for malware patterns BEFORE installing it: secret/env exfiltration to suspicious hosts, install-time (pre/postinstall) hooks, obfuscated remote execution (eval(atob), base64|sh), prompt injection in tool descriptions/SKILL.md, committed binaries, and auto-approve/skip-permission configs. Static-only — it clones and reads files, never executes the target code, so scanning something malicious is safe. Returns a verdict (clean/suspicious/dangerous) with the flagged files.
Output schema not documented. Description states 'returns a verdict (clean/suspicious/dangerous) with the flagged files' but the formal response structure (fields, types, nested objects) is not specified. LLMs cannot plan downstream actions or extract data without knowing the response shape.
Input parameter 'target' lacks formal constraints. No regex pattern, minLength, maxLength, or enum to guide LLMs or validate input. Description says 'e.g. https://github.com/owner/repo or ./my-skill' but examples in descriptions are anti-pattern, should use JSON Schema constraints instead.
No error handling guidance. If the target is unreachable, malformed, or a git clone fails, the tool should return actionable error messages (e.g., 'Git clone failed: repository not found. Verify the URL is public and accessible.'). Current code does not show error recovery paths.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2025-06-18+ | v2 |
STDIO transport only. The server is not remotely accessible and cannot be used by hosted MCP clients. This is a hard architectural limitation that caps protocol readiness at 50.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Although the tool is READ_ONLY, this should be declared via the readOnlyHint annotation in the tool definition for clarity and to enable client-side optimizations.