MCP server for SAFE file encryption — enables AI assistants to encrypt and decrypt files
safe-encryption provides clear tool names, reasonable descriptions, and well-formed JSON schemas for all 5 tools. However, several definition quality gaps prevent a higher score: (1) descriptions are inconsistent in depth and some lack guidance on when/why to use tools; (2) parameter descriptions are sparse or missing for some options (e.g., 'aead' enum in safe_encrypt lacks explanation of when to choose each cipher); (3) no documented output schemas, callers don't know what fields to expect from encryption operations; (4) no error handling guidance in tool descriptions, LLMs won't know what to do if decryption fails or a key is not found; (5) parameter dependencies and mutual exclusivity are undocumented (e.g., plaintext vs input_file in safe_encrypt, ciphertext vs input_file in safe_decrypt); (6) no description of file size limits, output format details, or key discovery behavior. Tools are well-named and follow verb_noun convention, but descriptions fall short of the 'prompt-engineering' standard (explain WHAT, WHEN, and prerequisites). All schemas have type definitions and basic constraints (enums on key types and algorithms), meeting the floor for 'fair' quality. Lacks the structured output documentation and error recovery guidance expected of 'good' tools.
Decrypt a .safe file or text. Auto-discovers keys from ~/.safe/keys/ and ~/.ssh/.
Encrypt text or file with SAFE. Supports password, public key, and GitHub username recipients.
Inspect a .safe file's metadata (recipients, algorithms) without decrypting.
Generate an encryption keypair. Types: x25519, p-256, ml-kem-768.
List all encryption identities and known recipients in ~/.safe/.
No documented output schemas for any tool. Callers cannot predict what fields to expect, forcing LLMs to parse unstructured output or guess at result structure. This violates the 'return structured objects with typed fields' pattern.
Parameter dependencies undocumented: safe_encrypt (plaintext vs input_file), safe_decrypt (ciphertext vs input_file), safe_info (input_file vs ciphertext) are mutually exclusive but not stated in descriptions. LLMs may pass both, causing undefined behavior.
No error recovery guidance in tool descriptions. If safe_decrypt fails (wrong password, key not found, corrupted ciphertext), the LLM has no hint on what to try next or how to troubleshoot.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
Parameter 'aead' in safe_encrypt has enum values but no description explaining the difference between AES-256-GCM and ChaCha20-Poly1305, when to use each, or which is default.
Tool descriptions lack context on prerequisites and idempotency. For example, safe_keygen does not document whether repeated calls with the same name/type overwrite or error. safe_info does not clarify whether it requires plaintext decryption permissions.