Supply chain security scanner for detecting compromises and vulnerabilities in project dependencies
supplyscan exposes 4 tools with basic descriptions and partial input schemas. All tools have descriptions (10-100 chars each), but schema definitions are incomplete: the code shows struct tags for input validation but does NOT register explicit JSON Schema objects with the MCP server. Tool names follow verb_noun convention (supplyscan_status, supplyscan_scan, supplyscan_check, supplyscan_refresh), which is good, but parameter descriptions are inconsistent. The `handleStatus` tool has an empty input struct; `handleScan` and `handleCheck` have rich parameter sets but descriptions are embedded in struct tags (jsonschema annotations), not in the MCP tool registration visible in `registerTools()`. The code snippet shows `mcp.Tool{}` structs with only Name and Description fields, no InputSchema property is visible. This means input schemas are likely inferred or missing entirely from the MCP registration layer, which is a critical gap. Error handling is minimal: `handleScan` returns early on empty path, but most tools lack detailed recovery guidance. No pagination, no output structure documentation, no error categorization.
Check a single package@version for supply chain compromises and vulnerabilities
Update the IOC database from upstream sources
Scan a project directory for supply chain compromises and known vulnerabilities
Get scanner version, IOC database info, and supported lockfile formats
Input schemas not registered in MCP Tool definitions. Code shows jsonschema struct tags on input types (scanInput, checkInput, etc.) but mcp.Tool registration does not include InputSchema. This means LLMs cannot see parameter types or constraints at tool invocation time.
supplyscan_status has empty input struct (statusInput struct{}) but no documentation of why no parameters are needed. Description does not clarify prerequisites or when to call this tool.
Parameter descriptions are vague or incomplete. 'path to the project directory to scan' does not specify format (relative vs absolute), error handling (non-existent path), or expected structure (mono-repo vs single package). LLM cannot reason about path semantics.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
supplyscan_scan and supplyscan_check do not document output schema. Response fields (findings, vulnerabilities, etc.) are not visible in tool definition. LLM cannot plan downstream tool calls or extract relevant data.
Error handling lacks recovery guidance. handleScan returns 'path is required' but does not suggest alternative actions or how to identify valid paths. FindingsError wraps results but the MCP client does not receive structured error codes for categorization (retryable vs user-fixable).
No validation of enum constraints at registration time. ecosystem parameter in supplyscan_check accepts 'npm' or 'pypi' but this is only documented in the struct tag comment, not enforced as an enum in the input schema. LLM may hallucinate invalid values.
Descriptions under 100 characters for critical tools. supplyscan_refresh (70 chars) lacks context: when should refresh be forced? What is 'upstream sources'? Does it require network access? Can it fail?