Declarative, agent-aware secrets manager for solo developers. Exposes project secrets to MCP-compatible clients (Claude Code, Claude Desktop, Cursor, Windsurf) over stdio without exposing plaintext .env files.
Athanor exposes 2 tools with clear, action-verb names (get_secret, run_with_secrets) and reasonable descriptions (150 - 180 chars). Both tools have input schemas with type definitions and parameter descriptions. However, output schemas are not formally documented in the tool registration, they exist only in the Go struct definitions (getSecretOutput, runWithSecretsOutput), which are not visible to the MCP client. Parameter descriptions are present but minimal (e.g., 'the secret's name as it appears in athanor.yaml'). Error handling is basic: get_secret returns permission/not-found errors with guidance, but run_with_secrets lacks validation for empty commands (though it does check). No tool annotations (readOnlyHint, destructiveHint) are declared, despite get_secret being read-only and run_with_secrets being destructive. The server is intentionally minimal, a design choice, but this limits LLM reasoning about tool safety and idempotency.
Return one secret's value as plain text. Only works for secrets marked expose:true in athanor.yaml (or when the server is running with --full-access). Prefer run_with_secrets when you don't need the literal value.
Run a shell command with every project secret injected into its environment. The command's stdout/stderr is returned and may contain secret values if the command prints them.
Output schemas not declared in tool registration. Go structs (getSecretOutput, runWithSecretsOutput) define fields, but MCP clients see no schema for return values. LLMs cannot plan downstream operations or validate responses.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). get_secret is read-only; run_with_secrets is destructive and non-idempotent. LLMs cannot reason about retry safety or side effects without explicit hints.
Parameter descriptions are minimal. 'the secret's name as it appears in athanor.yaml' lacks guidance on format, length, or valid characters. 'argv to execute' is terse; no mention of shell escaping, PATH resolution, or working directory.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
run_with_secrets lacks input validation messaging. Empty command array is rejected, but error message is generic ('command must not be empty'). No guidance on max command length, timeout, or environment variable limits.
STDIO transport only. Server is not remotely accessible and cannot be used by hosted MCP clients (Claude.ai, etc.). Limits deployment to local/desktop environments.