A secrets management server for storing and retrieving credentials from system keyrings
This MCP server exposes two secrets management tools with basic but incomplete definitions. Both tools have action-verb names (get_secret, set_secret) and descriptions present, but critical gaps exist: (1) No input schema validation visible in the code, parameter types are declared in the JSON structure but no enum constraints, ranges, or format specifications are enforced; (2) Parameter descriptions are minimal (avg ~45 chars) and lack actionable details like expected format or constraints; (3) No output schema documentation, the code shows return statements but no structured response types are defined; (4) Error handling is minimal, exceptions are caught and re-raised with only generic messages, no guidance for recovery; (5) No security annotations or permission gates visible; (6) The tools do operate on a single responsibility (get vs set) so composition is sound. The server lacks the rigor expected of a production secrets tool: no validation of service_name/secret_key formats, no rate limiting, no audit logging visible, and no documented return types.
Retrieve a secret from system keyring.
Store a secret in system keyring.
No documented output schema for either tool. The code shows return statements but no structured response type or field list is provided. LLMs cannot infer what fields to expect in the response.
Parameter descriptions are too generic and lack actionable constraints. 'The service name to retrieve the secret for' does not specify valid characters, length limits, or format. No enum, pattern, or range constraints are visible.
Error messages are not recovery-guided. When a secret is not found ('Secret "X" not found...'), the response does not suggest alternative actions or list available secrets. Errors should tell the LLM what to do next.
No input validation or sanitization visible in code. Parameters are passed directly to keyring.get_password() and keyring.set_password() without checks for injection, length limits, or null/empty values. LLMs can pass arbitrary strings.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
No audit logging or permission gates visible. Sensitive operations (reading/writing secrets) should verify authorization and log all access for compliance. No evidence of either in the code.
set_secret has no confirmation or dry-run mechanism. This is a destructive/sensitive operation that could overwrite existing secrets. No pattern to request user confirmation before executing.
No documented return type or response structure. Does get_secret return just the string value? A structured object? Both tools return raw values or print statements, but the expected response shape is not documented for LLMs.