MCP server for supply chain security scanning, detecting compromised packages and vulnerabilities in project dependencies
Server has 4 tools with basic descriptions and partial schemas. Tool names follow verb_noun convention (supplyscan_status, supplyscan_scan, supplyscan_check, supplyscan_refresh), which is good. However, input schemas are defined via struct tags (jsonschema) rather than explicit JSON Schema in tool registration, the actual schema objects are not visible in the registration code. Descriptions are present but brief (34-72 chars), below the 50-200 char LLM-optimized baseline. Parameters lack explicit type declarations in the tool registration; types are inferred from Go struct fields. No output schemas are documented. Error handling via FindingsError is custom but lacks recovery guidance. No parameter validation, enums, or constraints visible.
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 explicitly registered with tools. Schemas are defined via Go struct tags (jsonschema) but not passed to mcp.Tool registration. LLMs cannot see parameter types, descriptions, or constraints at tool discovery time.
Descriptions are too brief (34-72 chars vs. 50-200 char baseline). 'Get scanner version, IOC database info, and supported lockfile formats' lacks context on WHEN to call this tool or what the output structure is.
No output schemas documented. LLMs cannot plan downstream calls or extract fields from responses. E.g., supplyscan_scan returns types.ScanResult but the structure is not visible in the tool definition.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
Parameter descriptions lack format/constraint details. 'path to the project directory to scan' does not specify if relative or absolute paths are accepted, or what happens if the path does not exist.
FindingsError wraps results as errors, conflating findings with failures. LLMs cannot distinguish 'tool succeeded with findings' from 'tool failed'. Should return findings in a structured result field, not as an error.