Zero-knowledge, local-first MCP vault for AI agents and secret masking in Cursor/Claude
MaskMCP defines 4 tools with basic schemas and descriptions. All tools have input schemas with type definitions and descriptions present. However, descriptions are minimal (10-100 chars, well below the 194-char baseline), lacking context on WHEN to use each tool or dependencies. The mask_fetch tool has good parameter descriptions but lacks output schema documentation. No tool annotations (readOnlyHint, destructiveHint) despite all being read-only. Error handling is present but generic. Tool composition is reasonable (single responsibility), but descriptions do not guide LLM selection effectively.
Securely fetches data from an allowed domain using a stored secret for authentication, with automatic redaction of secrets in responses
Checks if a secret with the given alias exists in the vault
Lists all stored secret aliases with their allowed domains and update timestamps
Health check endpoint that returns 'pong'
Descriptions are too brief (10-100 chars vs 194-char baseline). mask_ping is 'Health check endpoint that returns pong', lacks context on when/why to call it. LLMs cannot distinguish it from other health checks.
No tool annotations despite all tools being read-only. Missing readOnlyHint metadata prevents LLMs from understanding safety properties and optimizing retry logic.
mask_fetch output schema not documented. Test code shows JSON response with 'status', 'token', 'encoded' fields, but tool definition does not declare return type. LLMs cannot plan downstream parsing.
mask_list_secrets and mask_has_secret lack output schema documentation. Test shows JSON responses but tool definitions do not specify return structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
Error messages in mask_fetch are generic ('https required', 'SSRF detected', 'allowlist violation'). Should include recovery guidance: 'Use HTTPS URLs only. Retry with https://...' or 'Domain not in allowlist. Call mask_list_secrets to see allowed domains.'