secretctl

by forest6511

Not rated
GitHub

About

AI-safe secrets manager - inject credentials as env vars, AI never sees plaintext

Details

Author
forest6511
Categories
Developer Tools, Security, Infrastructure

Setup

Install secretctl in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/forest6511/secretctl

Follow the installation instructions in the repository README, then restart your MCP client.

When you pastesk-proj-xxxinto Claude Code, that secret is now in your conversation history, Anthropic's logs, and potentially exposed to prompt injection attacks.

secretctl fixes this. Your AI gets command results, never secret values.

Every day, developers paste secrets into AI coding assistants:

You: "Help me debug this AWS error" You: "Here's my config: AWS_ACCESS_KEY_ID=AKIA..."

This is a security incident waiting to happen.

- Secrets in conversation history
- Secrets in cloud logs
- Secrets exposed to prompt injection
- No way to rotate or revoke

secretctl injects secrets as environment variables. Your AI runs commands and sees results, butnever sees the actual credentials.

- Single binary— No servers, no configuration, no subscription
- Local-first— Secrets never leave your machine
- MCP integration— Works with Claude Code out of the box
- Defense in depth— AES-256-GCM + Argon2id + output sanitization

# That's it. You're done. secretctl init secretctl set API_KEY secretctl get API_KEY

-

Your secrets, your machine— No cloud sync, no third-party servers, no subscription fees. Your credentials stay on your device, period.

AI agents don't need plaintext— When Claude runsaws s3 ls, it needs theresult, not your AWS keys. secretctl injects credentials directly into commands—AI never sees them.

Defense in depth— AES-256-GCM encryption at rest, Argon2id key derivation, MCP policy controls, and automatic output sanitization. Multiple layers, not a single point of failure.

flowchart LR subgraph Flow["How It Works"] AI["🤖 AI Agent<br/>(Claude)"] MCP["🔐 secretctl<br/>MCP Server"] CMD["⚡ Command<br/>(aws, etc)"] AI -->|"1. Run aws s3 ls<br/>with aws/"| MCP MCP -->|"2. Inject secrets<br/>as env vars"| CMD CMD -->|"3. Execute"| MCP MCP -->|"4. Sanitized output<br/>[REDACTED]"| AI end AI ~~~ NOTE["✓ Gets command results<br/>✗ Never sees secret values"]
# Requires Go 1.24+ git clone https://github.com/forest6511/secretctl.git cd secretctl go build -o secretctl ./cmd/secretctl

Download the latest release fromGitHub Releases.

- secretctl-linux-amd64— Linux (x86_64)
- secretctl-linux-arm64— Linux (ARM64)
- secretctl-darwin-amd64— macOS (Intel)
- secretctl-darwin-arm64— macOS (Apple Silicon)
- secretctl-windows-amd64.exe— Windows (x86_64)

- secretctl-desktop-macos— macOS (Universal)
- secretctl-desktop-linux— Linux (AppImage)
- secretctl-desktop-windows.exe— Windows (Installer)

# Download checksums.txt and verify sha256sum -c checksums.txt

macOS may show a security warning for unsigned apps. To allow:

# Option 1: Remove quarantine attribute xattr -d com.apple.quarantine secretctl-darwin-arm64 # Option 2: Right-click the app and select "Open"

Windows SmartScreen may show a warning. To allow:
- Click "More info"
- Click "Run anyway"

secretctl init # Enter your master password (min 8 characters)
echo "sk-your-api-key" | secretctl set OPENAI_API_KEY

- AES-256-GCM encryption— Industry-standard authenticated encryption
- Argon2id key derivation— Memory-hard protection against brute force
- SQLite storage— Reliable, portable, no external dependencies
- Audit logging— HMAC-chained logs for tamper detection
- AI-safe by design— MCP integration never exposes plaintext secrets to AI agents

# Add notes and tags to secrets secretctl set DB_PASSWORD --notes="Production database" --tags="prod,db" # Add URL reference secretctl set API_KEY --url="https://console.example.com/api-keys" # Set expiration secretctl set TEMP_TOKEN --expires="30d" # Filter by tag secretctl list --tag=prod # Show expiring secrets secretctl list --expiring=7d # View full metadata secretctl get API_KEY --show-metadata

Inject secrets as environment variables without exposing them in your shell history:

# Run a command with a single secret secretctl run -k API_KEY -- curl -H "Authorization: Bearer $API_KEY" https://api.example.com # Use wildcards to inject multiple secrets # Pattern aws/ matches aws/access_key, aws/secret_key (single level) secretctl run -k "aws/" -- aws s3 ls # Output is automatically sanitized to prevent secret leakage secretctl run -k DB_PASSWORD -- ./deploy.sh # If deploy.sh prints DB_PASSWORD, it appears as [REDACTED:DB_PASSWORD] # With timeout and prefix secretctl run -k API_KEY --timeout=30s --env-prefix=APP_ -- ./app

Note: Output sanitization uses exact string matching. Encoded secrets (Base64, hex) or partial matches are not detected.

Export secrets for use with Docker, CI/CD, or other tools:

# Export as .env file (default) secretctl export -o .env # Export specific keys as JSON secretctl export --format=json -k "db/" -o config.json # Export to stdout for piping secretctl export --format=json | jq '.DB_HOST'

Import secrets from existing.envor JSON files:

# Import from .env file secretctl import .env # Import from JSON file secretctl import config.json # Preview what would be imported (dry run) secretctl import .env --dry-run # Handle conflicts: skip, overwrite, or error secretctl import .env --on-conflict=skip secretctl import .env --on-conflict=overwrite
# Generate a 24-character password (default) secretctl generate # Generate a 32-character password without symbols secretctl generate -l 32 --no-symbols # Generate multiple passwords secretctl generate -n 5

Create encrypted backups and restore your vault:

# Create encrypted backup secretctl backup -o vault-backup.enc # Create backup with audit logs secretctl backup -o full-backup.enc --with-audit # Verify backup integrity secretctl restore vault-backup.enc --verify-only # Restore to a new vault (dry run first) secretctl restore vault-backup.enc --dry-run # Restore with conflict handling secretctl restore vault-backup.enc --on-conflict=skip # Skip existing keys secretctl restore vault-backup.enc --on-conflict=overwrite # Overwrite existing # Use key file instead of password (for automation) secretctl backup -o backup.enc --key-file=backup.key secretctl restore backup.enc --key-file=backup.key

Security: Backups are encrypted with AES-256-GCM using a fresh salt. The HMAC-SHA256 integrity check detects any tampering.

# View recent audit events secretctl audit list --limit=50 # Verify log integrity secretctl audit verify # Export audit logs secretctl audit export --format=csv -o audit.csv # Prune old logs (preview first) secretctl audit prune --older-than=12m --dry-run

secretctl implementsAI-Safe Access— a security principle where AI agents never receive plaintext secrets.

Unlike traditional secret managers that might expose credentials directly to AI, secretctl uses a fundamentally different approach:

flowchart LR subgraph "Traditional Approach ❌" AI1[AI Agent] -->|"get secret"| SM1[Secret Manager] SM1 -->|"plaintext: sk-xxx..."| AI1 end subgraph "AI-Safe Access ✅" AI2[AI Agent] -->|"run command"| SM2[secretctl] SM2 -->|"inject env vars"| CMD[Command] CMD -->|"sanitized output"| SM2 SM2 -->|"[REDACTED]"| AI2 end

This follows the"Access Without Exposure"philosophy used by industry leaders like 1Password and HashiCorp Vault.

secretctl includes an MCP server for secure integration with AI coding assistants like Claude Code:

# Start MCP server (requires SECRETCTL_PASSWORD) SECRETCTL_PASSWORD=your-password secretctl mcp-server

- secret_list— List secret keys with metadata (no values exposed)
- secret_exists— Check if a secret exists with metadata
- secret_get_masked— Get masked value (e.g.,*WXYZ)
- secret_run— Execute commands with secrets as environment variables
- secret_list_fields— List field names for multi-field secrets (no values)
- secret_get_field— Get non-sensitive field values only
- secret_run_with_bindings— Execute with predefined environment bindings

Configure in Claude Code(~/.claude.json):

{ "mcpServers": { "secretctl": { "command": "/path/to/secretctl", "args": ["mcp-server"], "env": { "SECRETCTL_PASSWORD": "your-master-password" } } } }

Policy Configuration(~/.secretctl/mcp-policy.yaml):

version: 1 default_action: deny allowed_commands: - aws - gcloud - kubectl

Security: AI agents never receive plaintext secrets. Thesecret_runtool injects secrets as environment variables, and output is automatically sanitized.

secretctl includes a native desktop application built with Wails v2:

Desktop app showing multi-field secrets with templates (Database, API Key, Login, SSH Key)

# Build the desktop app cd desktop && wails build # Or run in development mode cd desktop && wails dev

- Native macOS/Windows/Linux application
- Create and unlock vaults with master password
- Full secret CRUD operations (Create, Read, Update, Delete)
- Search and filter secrets by key
- Copy secret values to clipboard (with auto-clear)
- Metadata support (URL, tags, notes)
- Password visibility toggle
- Auto-lock on idle timeout
-
Audit Log Viewer— View and analyze all vault activity

- Filter by action, source, key, and date range
- Pagination for large log volumes
- Chain integrity verification
- Export to CSV/JSON formats
- Detailed log entry modal

# Run E2E tests (Playwright) cd desktop/frontend npm run test:e2e # Run with visible browser npm run test:e2e:headed # Run with Playwright UI npm run test:e2e:ui

- Zero-knowledge design— Your master password is never stored or transmitted
-
AES-256-GCM encryption— Industry-standard authenticated encryption
-
Argon2id key derivation— Memory-hard protection against brute force
-
Secure file permissions— Vault files are created with 0600 permissions
-
No network access— Completely offline operation
-
Tamper-evident logs— HMAC chain detects any log manipulation
-
Output sanitization— Automatic redaction of secrets in command output

For reporting security vulnerabilities, please seeSECURITY.md.

📚Full Documentation*— Getting started, guides, and reference

- Getting Started- Installation and quick start
-
CLI Guide- Command-line usage
-
MCP Integration- AI agent integration
-
Desktop App- Native application guide
-
Contributing Guide
-
Security Policy

Apache License 2.0 — SeeLICENSEfor details.

Built with care for developers who value simplicity and security.

This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.

Manage secrets and environment variables with Infisical's official MCP server.

All-in-one website diagnostics: DNS, SSL certs, HTTP headers, security audit (A-F grade), WHOIS, tech stack detection. No API keys needed.

Cost tracking + security scanning for AI builders

AISG MCP Gateway — a security & DLP proxy for the Model Context Protocol. Aggregates your MCP servers behind one endpoint and enforces policy on every tool call

Securely access secrets from Doppler's secret management platform using a Doppler API token.

MCP server for Wundervault zero-knowledge secret management. Exposes vault secrets to AI agents via the Model Context Protocol — secrets are decrypted server-side and never returned to the agent in plaintext.

All Azure MCP tools in a single server. The Azure MCP Server implements the MCP specification to create a seamless connection between AI agents and Azure services. Azure MCP Server can be used alone or with the GitHub Copilot for Azure extension in VS Code.

Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning with Cycode.

Cloud security insights, guardrail guidance, and compliance checking via Dawnguard.

Access and interact with Harness platform data, including pipelines, repositories, logs, and artifact registries.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.