q-ring
The qring-mcp server provides a quantum-inspired secret/credential management system for AI coding agents, securely anchoring credentials to your OS's native vault (macOS Keychain, GNOME Keyring, Windows Credential Manager) with 20 specialized tools.
Core Secret Management
get_secret/set_secret/delete_secret/has_secret/list_secrets— full CRUD with scope control (global/project); values never exposed in listingsinspect_secret— view full metadata (TTL, environment states, entanglement, access history) without revealing values
Quantum-Inspired Features
Superposition: Store environment-specific values (dev/staging/prod) that auto-resolve based on context
Wavefunction Collapse (
detect_environment): Auto-detect environment via flags, env vars, git branches, or project configQuantum Decay: Set TTL so secrets expire automatically; expired secrets return false on existence checks
Entanglement (
entangle_secrets): Link secrets so updates to one automatically propagate to the otherQuantum Noise (
generate_secret): Generate cryptographically strong secrets (hex, UUID, API key, password, token) with optional auto-save
Advanced Security
Tunneling (
tunnel_create/read/list/destroy): Ephemeral in-memory secrets that never touch disk, with optional self-destruction after a time limit or number of readsTeleportation (
teleport_pack/unpack): Encrypt secrets into AES-256-GCM bundles for secure transfer between machines, with dry-run preview on import
Monitoring & Audit
Observer Effect (
audit_log): Full audit trail of all reads, writes, and deletesdetect_anomalies: Identify unusual patterns (burst access, off-hours access) with recommendationshealth_check: Comprehensive report on decay status, staleness, anomalies, and entropyagent_scan: Autonomous monitoring scan across secrets and projects, with optional auto-rotation of expired secrets
Works seamlessly with Cursor, Kiro, Claude Code, and the broader MCP ecosystem.
Provides a secure, encrypted alternative to storing sensitive API keys in plain-text .env files.
Uses Git branch heuristics to automatically detect environments and resolve the correct secret values.
Anchors credentials to the native GNOME Keyring to provide OS-level security for secrets on Linux.
Anchors credentials to the native macOS Keychain to provide secure, OS-level secret management.
Manages OpenAI API keys with advanced features like environment-specific resolution and access auditing.
Facilitates the generation and secure storage of Stripe API keys within the native OS vault.
q-ring
OS keychain secrets for AI coding agents, over MCP.
Stop pasting API keys into plain-text .env files or wrestling with clunky secret managers. q-ring securely anchors your credentials to your OS's native vault (macOS Keychain, Linux Secret Service, Windows Credential Vault) and supercharges them with mechanics from quantum physics.
📖 View the Official Documentation for a complete CLI reference, MCP prompt cookbooks, and architecture details.
Why q-ring?
Superposition: Store one key with multiple states (dev/staging/prod) that collapse based on context.
Entanglement: Link keys across projects so rotating one automatically updates them all.
Tunneling: Create ephemeral, in-memory secrets that self-destruct after a set time or read count.
Teleportation: Securely pack and share AES-256-GCM encrypted secret bundles.
Seamless AI Integration: 44 built-in MCP tools for native use in Cursor, Kiro, and Claude Code.
🚀 Installation
q-ring is designed to be installed globally so it's available anywhere in your terminal. Pick your favorite package manager:
# pnpm (recommended)
pnpm add -g @i4ctime/q-ring
# npm
npm install -g @i4ctime/q-ring
# yarn
yarn global add @i4ctime/q-ring
# Homebrew (macOS / Linux)
brew install i4ctime/tap/qringDocker (MCP server)
The repo ships a Dockerfile that builds the MCP server and exposes it through mcp-proxy — useful for hosted MCP deployments (e.g. Glama) or keeping the server off the host entirely:
git clone https://github.com/I4cTime/q-ring.git
cd q-ring
docker build -t qring-mcp .
docker run --rm -p 8080:8080 qring-mcpNote: inside a container there is no OS keychain (GNOME Keyring / macOS Keychain), so this path is for the MCP protocol surface, ephemeral use, and CI experiments — not for durable local secret storage. For day-to-day use install the CLI natively via one of the package managers above.
Related MCP server: Vaulted MCP Server
⚡ Quick Start
# 1️⃣ Store a secret (prompts securely if value is omitted)
qring set OPENAI_API_KEY sk-...
# 2️⃣ Retrieve it anytime
qring get OPENAI_API_KEY
# 3️⃣ List all keys (values are never shown)
qring list
# 4️⃣ Generate a cryptographic secret and save it
qring generate --format api-key --prefix "sk-" --save MY_KEY
# 5️⃣ Run a full health scan
qring health
# Something not working? Diagnose the install (keyring, audit, MCP wiring)
qring doctor
# Tab completion for your shell
qring completion zsh > ~/.zsh/completions/_qring # also: bash, fishQuantum Features
Superposition — One Key, Multiple Environments
A single secret can hold different values for dev, staging, and prod simultaneously. The correct value resolves based on your current context.
# Set environment-specific values
qring set API_KEY "sk-dev-123" --env dev
qring set API_KEY "sk-stg-456" --env staging
qring set API_KEY "sk-prod-789" --env prod
# Value resolves based on context
QRING_ENV=prod qring get API_KEY # → sk-prod-789
QRING_ENV=dev qring get API_KEY # → sk-dev-123
# Inspect the quantum state
qring inspect API_KEYWavefunction Collapse — Smart Environment Detection
q-ring auto-detects your environment without explicit flags. Resolution order:
--envflagQRING_ENVenvironment variableNODE_ENVenvironment variableGit branch heuristics (
main/master→ prod,develop→ dev).q-ring.jsonproject configDefault environment from the secret
# See what environment q-ring detects
qring env
# Project config (.q-ring.json)
echo '{"env": "staging", "branchMap": {"release/*": "staging"}}' > .q-ring.jsonQuantum Decay — Secrets with TTL
Secrets can have a time-to-live. Expired secrets are blocked from reads. Stale secrets (75%+ lifetime) trigger warnings.
# Set a secret that expires in 1 hour
qring set SESSION_TOKEN "tok-..." --ttl 3600
# Set with explicit expiry
qring set CERT_KEY "..." --expires "2026-06-01T00:00:00Z"
# Health check shows decay status
qring healthObserver Effect — Audit Everything
Every secret read, write, and delete is logged with a tamper-evident hash chain. Access patterns are tracked for anomaly detection.
# View audit log
qring audit
qring audit --key OPENAI_KEY --limit 50
# Detect anomalies (burst access, unusual hours, chain tampering)
qring audit --anomalies
# Verify audit chain integrity
qring audit:verify
# Export audit log
qring audit:export --format json --since 2026-03-01
qring audit:export --format csv --output audit-report.csvQuantum Noise — Secret Generation
Generate cryptographically strong secrets in common formats.
qring generate # API key (default)
qring generate --format password -l 32 # Strong password
qring generate --format uuid # UUID v4
qring generate --format token # Base64url token
qring generate --format hex -l 64 # 64-byte hex
qring generate --format api-key --prefix "sk-live-" --save STRIPE_KEYEntanglement — Linked Secrets
Link secrets across projects. When you rotate one, all entangled copies update automatically.
# Entangle two secrets
qring entangle API_KEY API_KEY_BACKUP
# Now updating API_KEY also updates API_KEY_BACKUP
qring set API_KEY "new-value"
# Unlink entangled secrets
qring disentangle API_KEY API_KEY_BACKUPTunneling — Ephemeral Secrets
Create secrets that exist only in memory. They never touch disk. Optional TTL and max-read self-destruction.
# Create an ephemeral secret (returns tunnel ID)
qring tunnel create "temporary-token-xyz" --ttl 300 --max-reads 1
# Read it (self-destructs after this read)
qring tunnel read tun_abc123
# List active tunnels
qring tunnel listTeleportation — Encrypted Sharing
Pack secrets into AES-256-GCM encrypted bundles for secure transfer between machines. Keys are derived with PBKDF2-HMAC-SHA512 (210 000 iterations) from your passphrase; each bundle records its iteration count, so bundles produced by older versions still unpack.
# Pack secrets (prompts for passphrase)
qring teleport pack --keys "API_KEY,DB_PASS" > bundle.txt
# On another machine: unpack (prompts for passphrase)
cat bundle.txt | qring teleport unpack
# Preview without importing
qring teleport unpack <bundle> --dry-runImport — Bulk Secret Ingestion
Import secrets from .env files directly into q-ring. Supports standard dotenv syntax including comments, quoted values, and escape sequences. The CLI accepts either a file path or raw content; the import_dotenv MCP tool only accepts raw content (it never reads files from disk) so an agent can't coerce it into reading arbitrary local files.
# Import all secrets from a .env file
qring import .env
# Import to project scope, skipping existing keys
qring import .env --project --skip-existing
# Preview what would be imported
qring import .env --dry-runSelective Export
Export only the secrets you need using key names or tag filters.
# Export specific keys
qring export --keys "API_KEY,DB_PASS,REDIS_URL"
# Export by tag
qring export --tags "backend"
# Combine with format
qring export --keys "API_KEY,DB_PASS" --format jsonSecret Search and Filtering
Filter qring list output by tag, expiry state, or key pattern.
# Filter by tag
qring list --tag backend
# Show only expired secrets
qring list --expired
# Show only stale secrets (75%+ decay)
qring list --stale
# Glob pattern on key name
qring list --filter "API_*"
# Script-friendly existence check (exit 0 if present, 1 if not; decay-aware)
qring has OPENAI_API_KEY --quiet && echo "configured"Project Secret Manifest
Declare required secrets in .q-ring.json and validate project readiness with a single command.
# Validate project secrets against the manifest
qring check
# See which secrets are present, missing, expired, or stale
qring check --project-path /path/to/projectEnv File Sync
Generate a .env file from the project manifest, resolving each key from q-ring with environment-aware superposition collapse.
# Generate to stdout
qring env:generate
# Write to a file
qring env:generate --output .env
# Force a specific environment
qring env:generate --env staging --output .env.stagingSecret References & Least-Privilege Run
A qring:// reference is a committable pointer to a secret — it goes in your .env file instead of the value. qring run resolves references and manifest keys at spawn time, injecting only what the project declares (unlike exec, which injects the whole scope). Output is auto-redacted.
# .env — safe to commit: these are references, not values
DATABASE_URL=qring://project/DATABASE_URL
OPENAI_API_KEY=qring://global/OPENAI_API_KEY
STRIPE_KEY=qring:///STRIPE_KEY # auto scope: project, then global
SESSION_TTL=3600 # plain values pass through
# Run with declared secrets injected (manifest + .env refs)
qring run -- pnpm dev
# Preview what would be injected, without running
qring run --dry-run -- pnpm dev
# Pin an environment, use a specific env file, or skip the manifest
qring run --env prod --env-file .env.prod --no-manifest -- ./deploy.shThe key lives in the path, never the host (qring://project/KEY, not qring://KEY) — URL hosts are case-insensitive, and env-var keys are not. Malformed references fail loudly instead of leaking a literal qring://… string into the child. A reference pinned to an environment: qring://project/DATABASE_URL?env=prod.
Editor Setup
Wire the q-ring MCP server into an editor's MCP config with one command. Merges non-destructively — other servers are preserved, and an existing q-ring entry is only replaced with --force.
qring setup cursor # .cursor/mcp.json (project) or --global for ~/.cursor
qring setup kiro # .kiro/settings/mcp.json, with read-only autoApprove list
qring setup claude # .mcp.json (project scope)
# Preview without writing
qring setup cursor --dry-runPush to Deployment Platforms
Push manifest secrets to GitHub Actions, Vercel, or Cloudflare Workers through each platform's own authenticated CLI (gh / vercel / wrangler) — q-ring never holds platform tokens, and values travel over stdin, never argv. Every push is recorded in the audit chain.
# Push the .q-ring.json manifest keys to GitHub Actions secrets
qring push github --repo you/your-app
# Push to Vercel environments
qring push vercel --vercel-env production,preview
# Push to Cloudflare Workers secrets
qring push cloudflare
# Explicit keys, preview first
qring push github --keys DATABASE_URL,API_KEY --dry-runCanaries can ride along: qring canary plant KEY --format aws --push github plants a honeytoken locally and seeds it into the platform without reading it back (see Canary Honeytokens).
Secret Liveness Validation
Test if a secret is actually valid with its target service. q-ring auto-detects the provider from key prefixes (sk- → OpenAI, ghp_ → GitHub, etc.) or accepts an explicit provider name.
# Validate a single secret
qring validate OPENAI_API_KEY
# Force a specific provider
qring validate SOME_KEY --provider stripe
# Validate all secrets with detectable providers
qring validate --all
# Only validate manifest-declared secrets
qring validate --all --manifest
# List available providers
qring validate --list-providersBuilt-in providers: OpenAI, Anthropic, OpenRouter, Google AI (Gemini), Groq, Hugging Face, ElevenLabs*, Vercel*, Stripe, GitHub, AWS (format check), Generic HTTP. Keys are only ever sent in headers, never URLs. (*no safe public prefix — select explicitly with --provider or the manifest provider field.)
Output:
✓ OPENAI_API_KEY valid (openai, 342ms)
✗ STRIPE_KEY invalid (stripe, 128ms) — API key has been revoked
⚠ AWS_ACCESS_KEY error (aws, 10002ms) — network timeout
○ DATABASE_URL unknown — no provider detectedHooks — Callbacks on Secret Change
Register webhooks, shell commands, or process signals that fire when secrets are created, updated, or deleted. Supports key matching, glob patterns, tag filtering, and scope constraints.
# Run a shell command when a secret changes
qring hook add --key DB_PASS --exec "docker restart app"
# POST to a webhook on any write/delete
qring hook add --key API_KEY --url "https://hooks.example.com/rotate"
# Trigger on all secrets tagged "backend"
qring hook add --tag backend --exec "pm2 restart all"
# Signal a process when DB secrets change
qring hook add --key-pattern "DB_*" --signal-target "node"
# List all hooks
qring hook list
# Remove a hook
qring hook remove <id>
# Enable/disable
qring hook enable <id>
qring hook disable <id>
# Dry-run test a hook
qring hook test <id>Hooks are fire-and-forget: a failing hook never blocks secret operations. The hook registry is stored at ~/.config/q-ring/hooks.json.
SSRF protection: HTTP hook URLs targeting private/loopback IP ranges (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, ::1, fc00::/7) are blocked by default. DNS is checked up front and re-validated at connect time, so a hostname can't pass the check then rebind to a private address before the socket opens. To allow hooks targeting local services (e.g. during development), set the environment variable Q_RING_ALLOW_PRIVATE_HOOKS=1.
Configurable Rotation
Set a rotation format per secret so the agent auto-rotates with the correct value shape.
# Store a secret with rotation format metadata
qring set STRIPE_KEY "sk-..." --rotation-format api-key --rotation-prefix "sk-"
# Store a password with password rotation format
qring set DB_PASS "..." --rotation-format passwordSecure Execution & Auto-Redaction
Run commands with secrets securely injected into the environment. All known secret values are automatically redacted from stdout and stderr to prevent leaking into terminal logs or agent transcripts. Exec profiles restrict which commands may be run.
# Execute a deployment script with secrets injected
qring exec -- npm run deploy
# Inject only specific tags
qring exec --tags backend -- node server.js
# Run with a restricted profile (blocks network tools and interpreters/shells, 30s timeout)
qring exec --profile restricted -- npm testCodebase Secret Scanner
Migrating a legacy codebase? Quickly scan directories for hardcoded credentials using regex heuristics and Shannon entropy analysis.
# Scan current directory
qring scan .Output:
✗ src/db/connection.js:12
Key: DB_PASSWORD
Entropy: 4.23
Context: const DB_PASSWORD = "..."Composite / Templated Secrets
Store complex connection strings that dynamically resolve other secrets. If DB_PASS rotates, DB_URL is automatically correct without manual updates.
qring set DB_USER "admin"
qring set DB_PASS "supersecret"
qring set DB_URL "postgres://{{DB_USER}}:{{DB_PASS}}@localhost/mydb"
# Resolves embedded templates automatically
qring get DB_URL
# Output: postgres://admin:supersecret@localhost/mydbUser Approvals (Zero-Trust Agent)
Protect sensitive production secrets from being read autonomously by the MCP server without explicit user approval. Each approval token is HMAC-verified, scoped, reasoned, and time-limited. The gate applies to bulk reads too — export_secrets and teleport_pack over MCP skip approval-protected keys that lack a valid grant.
# Mark a secret as requiring approval
qring set PROD_DB_URL "..." --requires-approval
# Temporarily grant MCP access for 1 hour with a reason
qring approve PROD_DB_URL --for 3600 --reason "deploying v2.0"
# List all approvals with verification status
qring approvals
# Revoke an approval
qring approve PROD_DB_URL --revokeWhen an agent is blocked on an approval-protected key, q-ring raises a desktop notification (Linux notify-send, macOS osascript) naming the key and the exact qring approve command — throttled per key, disabled with QRING_NOTIFY=off.
Canary Honeytokens
Plant fake credentials that look and read exactly like real ones. Anything that touches one — a compromised MCP server, an over-curious agent, exfiltrated tooling sweeping the ring — gets the fake value back with no tell, while q-ring fires a desktop alert and writes a canary event into the tamper-evident audit chain.
# Plant a canary shaped like a real AWS access key
qring canary plant AWS_SECRET_ACCESS_KEY --format aws
# Other shapes: aws-secret, github, github-pat, openai, openai-project,
# anthropic, stripe, gitlab, slack, google, npm, generic
qring canary plant GHP_BACKUP_TOKEN --format github-pat
# See what's been tripped
qring canary list
qring audit --action canaryValues are CSPRNG noise in the provider's real token shape (an aws canary matches AKIA[A-Z0-9]{16}, an anthropic one the real sk-ant-api03-…AA layout) — plausible enough to be taken, never valid. Alerts are throttled to one per key per 30 seconds; the audit trail records every read.
Get paged. Desktop notifications only help when you are at the machine. Register webhook channels and every trip reaches them too:
qring canary alert add --discord https://discord.com/api/webhooks/…
qring canary alert add --slack https://hooks.slack.com/services/…
qring canary alert add --ntfy https://ntfy.sh/my-canaries
qring canary alert add --url https://example.com/canary # generic JSON POST
qring canary alert list
qring canary alert test # send a clearly-labelled drillChannels live in ~/.config/q-ring/canary-alerts.json (mode 0600). Sends are fire-and-forget, SSRF-guarded like hooks, throttled with the desktop alert, and never include the fake value — only the key, scope, source, and the agent label that reached for it.
Seed a tripwire into CI. Plant a canary and push it to a deployment platform in one step, so a leaked GitHub Actions / Vercel / Cloudflare environment carries a decoy:
qring canary plant AWS_SECRET_ACCESS_KEY --format aws-secret --push github --repo you/your-appHonest caveat: q-ring only sees reads that go through q-ring. A leaked value used directly on the platform side is not observable here — pair it with the provider's own alerting if you need that.
Canaries are built to stay covert: they carry no identifying description (add an innocuous cover story with --description if you like), their flag never appears in MCP tool responses, and trip records are visible only from the operator's terminal — never to agents via MCP audit tools. Bulk export and delete trip them just like reads, so sweeping the ring or removing the tripwire both ring the bell. Done with one? qring canary disarm <key> turns it back into an ordinary secret (qring set over a canary warns you first — the flag deliberately survives overwrites so an agent can't launder it away).
MCP Airlock
Run a third-party MCP server behind q-ring. The airlock sits between your agent host and the wrapped server, spawns it with a stripped environment (no inherited API keys — opt back in with --inherit-env), records every tool call, resource read, and prompt fetch that crosses it as a wrap event in the audit chain (grouped per session and labeled with the calling client's identity), scrubs known secret values out of every result before it reaches the transcript, and enforces the project's policy.wrap rules. Tool and prompt arguments are never logged — they may contain secrets.
{
"mcpServers": {
"some-server": {
"command": "qring",
"args": ["mcp", "wrap", "--", "npx", "-y", "some-mcp-server"]
}
}
}Tools, resources, and prompts all pass through verbatim (pagination, progress notifications, cancellation, subscriptions, and the list_changed / updated notifications included); the airlock advertises exactly the capabilities the wrapped server has. Long-running tools are governed by the host's own timeout, with a generous airlock ceiling configurable via QRING_WRAP_TIMEOUT_MS.
# Wrap a remote Streamable HTTP server; the Bearer token comes from q-ring (audited read)
qring mcp wrap --url https://mcp.example.com/mcp --auth-secret EXAMPLE_MCP_TOKEN
# Keep results verbatim (default: known secret values are replaced with [QRING:REDACTED])
qring mcp wrap --no-redact -- npx -y some-mcp-serverWrap policy. Govern the wrapped server from .q-ring.json — the same file, the same fail-closed engine:
{
"policy": {
"wrap": {
"allowTools": ["github_*", "search"],
"denyTools": ["github_delete_*"],
"approveTools": ["github_merge_pr"],
"rateLimit": { "maxCalls": 60, "perSeconds": 60 },
"toolRateLimits": { "search": { "maxCalls": 5, "perSeconds": 10 } },
"redactResults": true
}
}
}Denied tools are hidden from tools/list and refused on call with a policy_deny audit event; approveTools are refused until you grant them:
qring mcp approve github_merge_pr --for 900 --reason "release 1.4"
qring mcp approvals
qring mcp approve github_merge_pr --revokeBe clear about what the airlock is: env stripping, a tamper-evident record of every crossing, policy at the tool boundary, and best-effort redaction of secret values the ring knows about. It is not a sandbox — the wrapped process still runs as your user with normal filesystem, network, and OS-keychain access, and tool descriptions pass through uninspected. See docs/threat-model.md for the honest boundary picture.
Just-In-Time (JIT) Provisioning
Instead of storing static credentials, configure q-ring to dynamically generate short-lived tokens on the fly when requested (e.g. AWS STS, generic HTTP endpoints).
# Store the STS role configuration
qring set AWS_TEMP_KEYS '{"roleArn":"arn:aws:iam::123:role/AgentRole", "durationSeconds":3600}' --jit-provider aws-sts
# Resolving the secret automatically assumes the role and caches the temporary token
qring get AWS_TEMP_KEYSProject Context for AI Agents
A safe, redacted overview of the project's secrets, configuration, and state. Designed to be fed into an AI agent's system prompt without ever exposing secret values.
# Human-readable summary
qring context
# JSON output (for MCP / programmatic use)
qring context --jsonSecret-Aware Linter
Scan specific files for hardcoded secrets with optional auto-fix. When --fix is used, detected secrets are replaced with process.env.KEY references and stored in q-ring.
# Lint files for hardcoded secrets
qring lint src/config.ts src/db.ts
# Auto-fix: replace hardcoded values and store in q-ring
qring lint src/config.ts --fix
# Scan entire directory with auto-fix
qring scan . --fixAgent Memory
Encrypted, persistent key-value store that survives across AI agent sessions. Useful for remembering rotation history, project decisions, or context.
# Store a memory
qring remember last_rotation "Rotated STRIPE_KEY on 2026-03-21"
# Retrieve it
qring recall last_rotation
# List all memories
qring recall
# Forget
qring forget last_rotationPre-Commit Secret Scanning
Install a git pre-commit hook that automatically blocks commits containing hardcoded secrets.
# Install the hook
qring hook:install
# Uninstall
qring hook:uninstallSecret Analytics
Analyze usage patterns and get optimization suggestions for your secrets.
qring analyzeOutput includes most accessed secrets, unused/stale secrets, scope optimization suggestions, and rotation recommendations.
Service Setup Wizard
Quickly set up a new service integration with secrets, manifest entries, and hooks in one command.
# Create secrets for a new Stripe integration
qring wizard stripe --keys STRIPE_KEY,STRIPE_SECRET --provider stripe --tags payment
# With a hook to restart the app on change
qring wizard myservice --hook-exec "pm2 restart app"Governance Policy
Define project-level governance rules in .q-ring.json to control which MCP tools can be used, which keys are accessible, which commands can be executed, and what a wrapped MCP server may do behind the airlock. Policy is enforced at the MCP server, keyring, and airlock level.
Over MCP, policy is resolved from the directory the server was launched in — not from the projectPath a caller passes — so an agent can't sidestep restrictions by pointing at a directory with no policy. Launch the MCP server from your project root (where .q-ring.json lives). Edits to .q-ring.json are picked up automatically (the policy cache invalidates on file change), so you don't need to restart the server.
Policy files are schema-validated and fail closed: an invalid policy object (say, a typo like denytools) raises a PolicyConfigError instead of being silently ignored, so a malformed rule can never widen access.
# View the active policy
qring policy
# JSON output
qring policy --jsonExample policy in .q-ring.json:
{
"policy": {
"mcp": {
"denyTools": ["delete_secret"],
"deniedKeys": ["PROD_DB_PASSWORD"],
"deniedTags": ["production"]
},
"exec": {
"denyCommands": ["curl", "wget", "ssh"],
"maxRuntimeSeconds": 30
},
"secrets": {
"requireApprovalForTags": ["production"],
"maxTtlSeconds": 86400
},
"wrap": {
"denyTools": ["*_delete_*"],
"approveTools": ["deploy_*"],
"rateLimit": { "maxCalls": 60, "perSeconds": 60 }
}
}
}Exec Profiles
Restrict command execution with named profiles that control allowed commands, network access, timeouts, and environment sanitization.
# Run with the "restricted" profile (blocks network tools and interpreters/shells; 30s timeout)
qring exec --profile restricted -- npm test
# Run with the "ci" profile (5min timeout, allows network)
qring exec --profile ci -- npm run deploy
# Default: unrestricted
qring exec -- echo "hello"Built-in profiles: unrestricted, restricted (denies network tools and interpreters/shells — python -c, node -e, bash and friends can't exfiltrate injected secrets; 30s limit), ci (5min limit, blocks destructive commands).
Tamper-Evident Audit
Every audit event includes a SHA-256 hash of the previous event, creating a tamper-evident chain. Since v0.14 the chain is also anchored with a keyed HMAC stored in the OS keyring, so qring audit:verify detects truncation and whole-file rewrites — not just in-place edits. Verify integrity and export logs in multiple formats. Events from MCP sessions are additionally stamped with the connecting client's self-reported identity (clientInfo name@version) — shown in qring audit output and filterable with qring audit --agent <label>. It's an audit label for "which agent did this", never an authorization boundary, since clients choose what to report.
# Verify the entire audit chain
qring audit:verify
# Export as JSON
qring audit:export --format json --since 2026-03-01
# Export as CSV
qring audit:export --format csv --output audit-report.csvAgent Session Timeline
Every MCP session is stamped with the client's identity (clientInfo name@version) and every airlock session with a correlation id. audit:sessions folds the flat audit feed back into one timeline per agent process, so "what did Cursor do in that session?" is one command instead of a grep.
# One block per session: agent, source, window, event + denial counts, keys touched
qring audit:sessions
# Narrow to one client, widen the window, print every event line
qring audit:sessions --agent "Cursor@1.2.3" --since 7d --verbose
# Machine-readable
qring audit:sessions --jsonAirlock sessions (qring mcp wrap) show up as airlock: <wrapped command> with every proxied call in order. The status dashboard (qring status) renders the same data as an expandable Agent Sessions (24h) card.
Agents can look at their own history too — as MCP resources, not tools: qring://sessions lists session summaries and qring://sessions/{id} returns one timeline (key names and actions only, never values). Two guarantees hold on the agent side: canary trips are stripped before anything is summarised, so a honeytoken can never be discovered from a session view, and denying the audit_log tool in .q-ring.json policy hides the resources as well — one switch controls audit visibility for agents.
Encrypted File Backend (Headless / CI)
Hosts with no OS keyring at all (headless Linux, containers, CI) can opt into an encrypted file store. Everything — secrets, the audit anchor, the agent-memory key — routes through it.
export QRING_BACKEND=file
export QRING_FILE_PASSPHRASE="a strong passphrase" # required — no passphrase, no access
qring set CI_TOKENThe store is AES-256-GCM at ~/.config/q-ring/file-backend.enc (mode 0600, path override via QRING_FILE_BACKEND_PATH), keyed by PBKDF2 from the passphrase. It is explicit-only: a missing OS keyring never falls back to it silently, and without the passphrase every operation fails closed — q-ring never encrypts under a machine-derivable key.
Team & Org Scopes
Extend beyond global and project scopes with team and org scopes for shared secrets across groups. Resolution order: project → team → org → global (most specific wins).
# Store a secret in team scope
qring set SHARED_API_KEY "sk-..." --team my-team
# Store in org scope
qring set ORG_LICENSE "lic-..." --org acme-corp
# Resolution cascades: project > team > org > global
qring get API_KEY --team my-team --org acme-corpIssuer-Native Rotation
Attempt provider-native secret rotation (for providers that support it) or fall back to local generation.
# Rotate via the detected provider
qring rotate STRIPE_KEY
# Force a specific provider
qring rotate API_KEY --provider openaiCI Secret Validation
Batch-validate all secrets against their providers in a CI-friendly mode. Returns a structured pass/fail report with exit code 1 on failure.
# Validate all secrets (CI mode)
qring ci:validate
# JSON output for pipeline parsing
qring ci:validate --jsonAgent Mode — Autonomous Monitoring
A background daemon that continuously monitors secret health, detects anomalies, and optionally auto-rotates expired secrets.
# Start the agent
qring agent --interval 60 --verbose
# With auto-rotation of expired secrets
qring agent --auto-rotate
# Single scan (for CI/cron)
qring agent --onceQuantum Status Dashboard — Live Monitoring
Launch a real-time dashboard in your browser that turns the entire quantum subsystem into one glanceable page. It's a single self-contained HTML page served locally — no cloud, no config, fully offline — built as a Preact + htm app (runtime bundled and inlined). It streams updates every 5 seconds via Server-Sent Events and diffs the DOM in place, so data refreshes without re-running entrance animations and your search input, caret, and scroll position are preserved across ticks.
What you get:
KPI strip — total secrets, detected environment, protected count, active approvals, hooks, 24-hour reads, and live anomaly count.
Health summary — donut chart of healthy / stale / expired / no-decay secrets plus per-scope counts (global / project / team / org).
Environment — wavefunction collapse details: detected env, source, branch, and any project context.
Manifest —
.q-ring.jsonsummary with declared / required / missing / expired / stale keys.Policy — at-a-glance view of MCP, exec, and secret policies (allow/deny tools, deny keys/tags, allow/deny commands, approval & rotation requirements).
Secrets table — searchable, sortable view of every secret (key, scope, env, type, decay, tags, last read), with quick chips for
expired,stale, andprotectedfilters. Press/to focus the search box.Quantum cards — decay timers, superposition states, entanglement pairs, and active quantum tunnels.
Approvals & hooks — live list of valid (and tampered) approval grants and every registered hook with its match summary.
Agent sessions (24h) — one expandable row per MCP client or airlock session: agent label, source, window, event and denial counts, recent events.
Agent memory — count of encrypted memory keys persisted at
~/.config/q-ring/agent-memory.enc.Anomaly alerts — burst reads, off-hours access, tampered audit chain, and other suspicious patterns.
Audit log (24h) — filterable feed with action chips (
read/write/delete/export), source chips (cli/mcp/hook/agent), and a free-text filter.
Top-bar controls let you pause SSE updates (handy while reading the audit feed), refresh on demand, or jump to the raw JSON snapshot at /api/status. Keyboard shortcuts: / focus secrets search · P pause · R refresh.
The dashboard binds to 127.0.0.1 only and never exposes secret values, but it does surface key names, the audit log, and approval grants — so every route is gated by a random, per-launch token. qring status prints (and opens) the full URL including ?token=…; requests without the token get a 403. Stop the server to invalidate the token.
# Open the dashboard (auto-launches your browser at http://127.0.0.1:9876/?token=…)
qring status
# Specify a custom port
qring status --port 4200
# Don't auto-open the browser (copy the printed tokenized URL yourself)
qring status --no-openMCP Server
q-ring includes a full MCP server with 44 tools for AI agent integration.
Core Tools
Tool | Description |
| Read a secret value (collapses superposition, audits the read) |
| List keys + metadata in scope (values never exposed); filter by tag, expiry, glob |
| Create or overwrite a single secret with optional TTL, per-env state, tags, rotation format |
| Permanently remove a secret value (not undoable from q-ring) |
| Boolean existence check that respects decay (no audit read) |
| Render multiple secrets as |
| Parse |
| Compare |
| Render a complete |
Quantum Tools
Tool | Description |
| Show metadata for one key (states, decay, entanglement, access count) without revealing the value |
| Resolve which env slug should drive superposition collapse for the current context |
| Generate a CSPRNG-backed value in a chosen format and optionally store it |
| Link two keys so future writes/rotations propagate the same value |
| Break the sync link between two keys (does not delete values) |
Tunneling Tools
Tool | Description |
| Stash a value in process memory and return an opaque ID (never touches disk) |
| Fetch a tunneled value by ID — may self-destruct on read |
| Enumerate active tunnels with remaining read budget and TTL (IDs only) |
| Immediately remove a tunnel from memory before its TTL/reads run out |
Teleportation Tools
Tool | Description |
| Encrypt selected secrets into a passphrase-protected AES-256-GCM bundle |
| Decrypt a teleport bundle and import each secret (with optional dry-run) |
Validation Tools
Tool | Description |
| Hit the upstream service (OpenAI/Stripe/GitHub/AWS/HTTP) to confirm a single key is still live |
| Enumerate built-in validation providers and their auto-detect prefixes |
Hook Tools
Tool | Description |
| Register a shell/HTTP/signal side-effect that fires on write/delete/rotate |
| Show every registered hook with match criteria, type, and enabled flag |
| Detach a single hook by ID without touching any secrets |
Execution & Scanning Tools
Tool | Description |
| Run a child command with secrets injected as env vars and any leaked values redacted from output |
| Walk a directory tree and flag hardcoded secrets via regex + entropy heuristics |
| Inspect a specific file list for hardcoded secrets with optional auto-fix to |
AI Agent Tools
Tool | Description |
| Single redacted snapshot of secrets, env, manifest, hooks, and recent audit activity |
| Persist a non-secret note in encrypted agent memory across sessions |
| Read a memory value, or list every stored key when no key is supplied |
| Permanently delete a key from agent memory |
| Usage profile: most-accessed, stale, never-accessed, no-rotation candidates |
Observer & Health Tools
Tool | Description |
| Query the tamper-evident audit log filtered by key, action, and limit |
| Surface burst-read and off-hours findings from audit history |
| Recompute the audit hash chain and report the first break point if tampered |
| Export audit events as jsonl, json, or csv for archival/SIEM |
| Read-only scope sweep: decay/stale/expired counts plus current anomalies |
| Start a local SSE dashboard with live KPIs, secrets, hooks, and audit feed (returns a token-gated |
| Multi-project health pass with optional |
Governance & Policy Tools
Tool | Description |
| Dry-run a tool/key/exec action against |
| High-level overview of policy rule counts and approval/rotation requirements |
| Ask the upstream provider to issue a new credential and store it back in the keyring |
| Batch-validate every accessible secret in scope and return a structured pass/fail report |
Cursor / Kiro Configuration
Add to .cursor/mcp.json or .kiro/settings/mcp.json (or let qring setup cursor / qring setup kiro write it):
If q-ring is installed globally (e.g. pnpm add -g @i4ctime/q-ring):
{
"mcpServers": {
"q-ring": {
"command": "qring-mcp"
}
}
}If using a local clone:
{
"mcpServers": {
"q-ring": {
"command": "node",
"args": ["/path/to/q-ring/dist/mcp.js"]
}
}
}Claude Code Configuration
Add to .mcp.json in the project root — or run qring setup claude, or claude mcp add q-ring -- qring-mcp (Claude Desktop is the app that uses claude_desktop_config.json, not Claude Code):
Global install:
{
"mcpServers": {
"q-ring": {
"command": "qring-mcp"
}
}
}Local clone:
{
"mcpServers": {
"q-ring": {
"command": "node",
"args": ["/path/to/q-ring/dist/mcp.js"]
}
}
}VS Code Configuration
VS Code speaks MCP natively — add to .vscode/mcp.json (note the servers key, not mcpServers):
{
"servers": {
"q-ring": {
"command": "qring-mcp"
}
}
}qring setup does not write this file yet — VS Code is config-only (no first-party plugin bundle).
Editor Plugins
The q-ring repo ships three first-party editor packs — each one adds rules/steering, agents, commands, skills, hooks, and the MCP connector to its host editor.
Plugin | Editor | Highlights |
3 rules, 5 skills, 2 agents, 8 slash commands, 3 hooks, MCP autoconnect | ||
Official Power layout: | ||
|
Cursor Plugin
The q-ring Cursor Plugin brings quantum secret management directly into your IDE with rules, skills, agents, commands, hooks, and a built-in MCP connector.
Component | What it does |
3 Rules | Always-on guidance: never hardcode secrets, use q-ring for all ops, warn about |
5 Skills | Auto-triggered by context: secret management, scanning, rotation, project onboarding, exec-with-secrets |
2 Agents |
|
8 Commands |
|
3 Hooks |
|
MCP Connector | Auto-connects to |
Install from the Cursor marketplace or see cursor-plugin/README.md for manual setup.
Kiro Plugin (Power)
The kiro-plugin/ directory is a Kiro Power per Create powers: POWER.md (metadata, onboarding, steering map), root mcp.json (MCP server must match the server name referenced in the power), and steering/ for workflows. Install from Kiro → Powers → Add power from Local Path and select kiro-plugin, or publish the folder on GitHub and use Add power from GitHub.
Always-on steering blocks hardcoded secrets and routes everything through q-ring; manual steering files act as agent personas (#qring-secret-ops, #qring-security-auditor), skill packs, and slash-style commands (#qring-cmd-scan-secrets, etc.). Optional hooks live in hooks/ for copy into .kiro/hooks/.
# Alternative: flatten into ~/.kiro (settings + steering + hooks)
pnpm run plugin:sync:kiro
# Or scope to a single project
pnpm run plugin:sync:kiro -- /path/to/your/project/.kiroSee kiro-plugin/README.md for the full breakdown.
Claude Code Plugin
For Claude Code, q-ring ships a CLAUDE.md memory file, a project-scoped .mcp.json, two subagents (secret-ops, security-auditor), eight slash commands (/qring-scan-secrets, /qring-health-check, …), six skills, and three hooks (post-edit lint reminder, pre-Bash .env guard, session-start context primer).
# Install into the current project ($PWD)
pnpm run plugin:sync:claude
# Install agents/commands/skills/hooks at user scope (~/.claude)
pnpm run plugin:sync:claude -- --user
# Or target a specific project
pnpm run plugin:sync:claude -- /path/to/your/projectExisting CLAUDE.md, .mcp.json, or .claude/settings.json files are never silently overwritten — the script writes a <filename>.qring-template next to them so you can merge by hand. Pass --force to overwrite.
See claude-code-plugin/README.md for the full breakdown.
Architecture
qring CLI ─────┐
├──▶ Core Engine ──▶ @napi-rs/keyring ──▶ OS Keyring
MCP Server ────┘ │
├── Envelope (quantum metadata)
├── Scope Resolver (global / project / team / org)
├── Collapse (env detection + branchMap globs)
├── Observer (tamper-evident audit chain)
├── Policy (governance-as-code engine)
├── Noise (secret generation)
├── Entanglement (cross-secret linking)
├── Validate (provider-based liveness + rotation)
├── Hooks (shell/HTTP/signal callbacks)
├── Import (.env file ingestion)
├── Exec (profile-restricted injection + redaction)
├── Scan (codebase entropy heuristics)
├── Provision (JIT ephemeral credentials)
├── Approval (HMAC-verified zero-trust tokens)
├── Context (safe redacted project view)
├── Linter (secret-aware code scanning)
├── Memory (encrypted agent persistence)
├── Tunnel (ephemeral in-memory)
├── Teleport (encrypted sharing)
├── Agent (autonomous monitor + rotation)
└── Dashboard (live status via SSE)Project Config (.q-ring.json)
Optional per-project configuration:
{
"env": "dev",
"defaultEnv": "dev",
"branchMap": {
"main": "prod",
"develop": "dev",
"staging": "staging",
"release/*": "staging",
"feature/*": "dev"
},
"secrets": {
"OPENAI_API_KEY": { "required": true, "description": "OpenAI API key", "format": "api-key", "prefix": "sk-", "provider": "openai" },
"DATABASE_URL": { "required": true, "description": "Postgres connection string", "validationUrl": "https://api.example.com/health" },
"SENTRY_DSN": { "required": false, "description": "Sentry error tracking" }
},
"policy": {
"mcp": {
"denyTools": ["delete_secret"],
"deniedKeys": ["PROD_DB_PASSWORD"],
"deniedTags": ["production"]
},
"exec": {
"denyCommands": ["curl", "wget"],
"maxRuntimeSeconds": 60
}
}
}branchMapsupports glob patterns with*wildcards (e.g.,release/*matchesrelease/v1.0)secretsdeclares the project's required secrets — useqring checkto validate,qring env:generateto produce a.envfileproviderassociates a liveness validation provider with a secret (e.g.,"openai","stripe","github") — useqring validateto testvalidationUrlconfigures the generic HTTP provider's endpoint for custom validationpolicydefines governance rules for MCP tool gating, key access restrictions, exec allowlists, and secret lifecycle requirements
📚 Docs
Troubleshooting — keyring backends, MCP connection, approval gate, policy pinning
CLI ↔ MCP parity — every command mapped to its MCP tool
Releasing — tag-driven release flow
Contributing
See CONTRIBUTING.md for the full guide (dev environment, conventions, files to keep in sync). The short version:
Run
pnpm run lint,pnpm run typecheck, andpnpm run test:cibefore opening a PR.Tests or sandboxes can point the audit log elsewhere with
QRING_AUDIT_DIR(directory is created if missing); default is~/.config/q-ring/audit.jsonl.Optional local pre-commit:
qring hook:install(uses this package’sprecommithook whenqringis on yourPATH).After changing one of the editor plugins:
Cursor:
pnpm run plugin:synccopiescursor-plugin/to~/.cursor/plugins/local/my-plugin(or pass a custom path).Kiro:
pnpm run plugin:sync:kirocopieskiro-plugin/mcp.json→~/.kiro/settings/mcp.json, plussteering/andhooks/(or pass a project.kiropath). Prefer addingkiro-plugin/as a Power from the Powers panel instead.Claude Code:
pnpm run plugin:sync:claudecopiesclaude-code-plugin/into the current directory (or pass a project path; add--userto install at~/.claude/).
See also docs/cli-mcp-parity.md.
🔒 Security
Local-first. Core storage is your OS keychain — there is no q-ring cloud and no account. The MCP surface, audit log, and agent memory live on your machine (audit and memory files are written owner-only,
0600).Written-down threat model. What q-ring protects, what it doesn't, and where the residual risk lives — including an honest answer to the agent-exfiltration question — in docs/threat-model.md.
Hardened by adversarial review. v0.14.0 shipped the results of an internal adversarial audit — policy-bypass, approval-scoping, and exec-profile findings all fixed, each with regression tests. Details are in the CHANGELOG
Securitysections (house style since 0.12.0: fix first, then disclose there).Reporting a vulnerability. Use GitHub private vulnerability reporting — see SECURITY.md for the supported-versions table and response commitments (48-hour acknowledgement, 7-day assessment).
📜 License
AGPL-3.0 - Free to use, modify, and share. Any derivative work or hosted service must release its source code under the same license.
Available Tools
44 toolsagent_forgetADestructiveIdempotent
[agent] Permanently delete a single key from encrypted agent memory. Use to retract obsolete or misremembered context; prefer overwriting via agent_remember when you just want to update the value, and use delete_secret for actual credentials (which never live in agent memory). Destructive: there is no recycle bin. Returns 'Forgot "KEY"' on success or a not-found error if the key was already absent.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Memory key to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context beyond that: there is no recycle bin, deletion is permanent, what the success string looks like, and that an already-absent key yields a not-found error rather than a silent success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the destructive action and its scope, then the routing guidance, then the return contract. Every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully documents the return contract ('Forgot "KEY"' / not-found error), and for a one-parameter destructive tool the combination of annotations plus the permanent/no-recycle-bin note is fully sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'key' parameter, so the schema already carries the meaning. The description adds only 'from encrypted agent memory' as scope context, with no key-format or naming-convention guidance. Baseline 3 applies when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a single key from encrypted agent memory') and explicitly distinguishes itself from the two most confusable siblings, agent_remember and delete_secret. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('retract obsolete or misremembered context') and when-not-to-use, naming both alternatives with the condition that selects each (agent_remember for value updates, delete_secret for real credentials). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_recallARead-onlyIdempotent
[agent] Read a value from encrypted agent memory, or list every stored key when no specific key is supplied. Use at the start of an agent loop to rehydrate prior context, or to look up a single remembered fact; prefer get_project_context for a redacted overview of secrets and get_secret for actual credential values. Read-only. With a key argument: returns JSON { ok, data: { key, value } } or a not-found error. Without key: returns a JSON listing of every stored key (no values), or 'Agent memory is empty'.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Memory key to read. Omit to list every stored key (without values). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so 'Read-only' is redundant. However, with no output schema, the description adds real value by specifying the return shapes ({ ok, data: { key, value } } vs. a key listing with no values), the not-found error path, and the 'Agent memory is empty' state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core verb and dual mode, then layers usage and return details efficiently. Dense but every clause carries information; only the redundant 'Read-only' line could be trimmed against the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully covers what the tool returns and its error/empty states, and it names the siblings to use for credential or overview needs. An agent has everything required to select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `key` parameter is documented there, so the baseline is 3. The description restates that omitting key lists keys without values, adding little beyond the schema's own wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (encrypted agent memory) and covers both modes: value lookup with a key and key listing without one. It is immediately distinguishable from siblings like agent_remember and agent_forget, and the dual behavior is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('start of an agent loop to rehydrate prior context', 'look up a single remembered fact') and routes to alternatives ('prefer get_project_context for a redacted overview of secrets and get_secret for actual credential values'). Both the trigger and the exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_rememberADestructiveIdempotent
[agent] Persist a non-secret key/value note in encrypted, on-disk agent memory that survives across MCP sessions. Use to record stable agent context — last rotation date for a key, the user's deployment preferences, decisions taken in earlier sessions; do NOT use this to store secrets (use set_secret instead) and prefer chat scratchpad for purely transient state. Mutates the encrypted memory store. Idempotent: rewriting the same key with a new value simply overwrites. Returns 'Remembered "KEY"' on success.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Memory key (free-form string). Convention: lowercase dotted namespaces, e.g. 'project.lastDeploy'. | |
| value | Yes | Plain-string value to store. JSON-stringify structured data on the caller side if needed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=true), and the description adds context beyond them: persistence across MCP sessions, encrypted on-disk storage, that overwriting the same key destroys the prior value, and the exact success return string.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage constraints, then behavioral notes; every clause carries information (persistence, secrecy exclusion, idempotency, return value) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A two-parameter, no-output-schema tool whose full behavioral contract — storage location, persistence, mutation semantics, return value, and correct-vs-wrong usage — is stated, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented there, including a naming convention. The description adds no syntax or format detail for key/value, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Persist a non-secret key/value note in encrypted, on-disk agent memory') and immediately distinguishes itself from set_secret and the chat scratchpad, so an agent can identify it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use examples ('last rotation date for a key', 'deployment preferences', 'decisions taken in earlier sessions'), an explicit when-not ('do NOT use this to store secrets'), and names the alternative tools (`set_secret`, chat scratchpad) with the condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_scanADestructive
[agent] Run a multi-project health pass that gathers decay status, audit anomalies, and .q-ring.json manifest gaps across one or more project paths and (optionally) auto-rotates expired secrets with freshly generated values. Use as the canonical 'agent maintenance loop' across a portfolio of repos; prefer health_check for a single read-only scope, detect_anomalies for audit-only triage, and check_project for a single-project manifest check. With autoRotate=false (default) this is read-only. With autoRotate=true it OVERWRITES expired secret values in the keyring with generated replacements — credential changes that may break upstream integrations until they are propagated. Subject to tool policy. Returns a JSON report of per-project findings and any rotations performed.
| Name | Required | Description | Default |
|---|---|---|---|
| autoRotate | No | If true, replace expired secrets with newly generated values (using each secret's `rotationFormat`/`rotationPrefix`). Only enable when intentional rotation is desired — this is destructive on the upstream side. | |
| projectPaths | No | List of absolute project roots to scan. Defaults to `[server.cwd]` when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that autoRotate=false (default) is read-only, that autoRotate=true OVERWRITES expired secret values with generated replacements, and that this may break upstream integrations until propagated. It also flags 'Subject to tool policy' and describes the return payload, adding real behavioral context over the destructiveHint/readOnlyHint flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The sentence is long but front-loads the core action and scoping, then layers alternatives and the destructive caveat. Density is high with little filler, though the single-sentence structure is heavy and could be broken up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description still states what is returned ('a JSON report of per-project findings and any rotations performed'). Combined with the safety, scope, and alternative guidance, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it clarifies that autoRotate's default keeps the call read-only and that enabling it is destructive on the upstream side, reinforcing the schema's own note. projectPaths defaults are already documented in the schema, so the gain is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('multi-project health pass' gathering decay status, audit anomalies, manifest gaps) with an explicit optional mutation mode. It names the sibling tools it is not (health_check, detect_anomalies, check_project) and the scoping difference, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as the canonical 'agent maintenance loop' for a portfolio of repos, then routes the agent to three alternatives with the condition that selects each ('single read-only scope', 'audit-only triage', 'single-project manifest check'). When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_secretsARead-onlyIdempotent
[agent] Cross-reference the secrets in scope with recent audit events to produce a usage profile and rotation/retirement suggestions. Use as a quarterly hygiene check or as input to a planner that decides what to rotate or delete; prefer health_check for decay-only triage and audit_log to inspect access timelines for one key. Read-only; uses the most recent ~500 audit events. Returns JSON { total, expired, stale, neverAccessed: [...], noRotationFormat: [...], mostAccessed: [{ key, reads }] }. neverAccessed and noRotationFormat are good candidates for cleanup or for adding rotation hints.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds meaningful context beyond them: the read-only nature plus the specific data window ('most recent ~500 audit events'). It does not mention rate limits or refresh/ordering semantics, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then usage, then return shape. It is dense but each sentence carries weight; the single long final section is slightly packed but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analysis tool with 100% schema coverage and no output schema, the description supplies the missing return shape ('{ total, expired, stale, neverAccessed... }'), the data window, and guidance on interpreting results, which is everything an agent needs to select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already fully documented in the schema (scope enum, orgId, teamId, projectPath with conditions). The description only alludes to 'secrets in scope' and adds no syntax beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('cross-reference the secrets in scope with recent audit events') and the concrete output ('usage profile and rotation/retirement suggestions'). It is clearly distinguishable from siblings like health_check and audit_log.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('quarterly hygiene check or input to a planner') plus named alternatives and the conditions that select them ('prefer health_check for decay-only triage and audit_log to inspect access timelines for one key'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_logARead-onlyIdempotent
[audit] Query the q-ring audit log — a tamper-evident record of every read/write/delete touching a secret. Use to investigate 'who accessed KEY recently?' or to feed an agent the access timeline for a specific credential; prefer detect_anomalies for automated unusual-pattern detection and health_check for decay-state-plus-anomalies in one call. Read-only. Returns one line per event in chronological order, formatted timestamp | action | key | [scope] | env:NAME | detail. Returns 'No audit events found' when the filter matches nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Limit to events touching this exact key. Omit for the full log. | |
| agent | No | Limit to events stamped with this agent label (clientInfo name@version). Omit for all agents. | |
| limit | No | Maximum events to return, newest first. Defaults to 20. Increase for deeper investigations. | |
| action | No | Limit to a single action verb (e.g. 'read' to see only reads). Omit for all actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered by structured data. The description nevertheless adds the tamper-evident nature, chronological one-line-per-event format, and the exact empty-result string. It doesn't mention pagination behavior, which is a minor remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no wasted words; the core definition leads, then usage routing, then behavioral details. Slightly packed but well front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only filtered-list tool with no output schema: it defines scope, routes to two alternatives, declares read-only, specifies the return line format and the empty-result message. An agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already documents omit-for-all semantics, so the schema does the heavy lifting. The description adds only the example 'read' for the action filter, which is marginal value. Baseline 3 is appropriate when the schema is fully documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Query) and resource (the q-ring audit log), and immediately characterizes it as 'a tamper-evident record of every read/write/delete touching a secret'. The bracket prefix '[audit]' and the framing make it unmistakably distinct from siblings like export_audit, verify_audit_chain, or detect_anomalies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use examples ('who accessed KEY recently?', feeding an access timeline) and explicitly routes to alternatives: 'prefer detect_anomalies for automated unusual-pattern detection and health_check for decay-state-plus-anomalies'. Names two siblings and the condition selecting each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_policyARead-onlyIdempotent
[policy] Ask whether a single intended action would be allowed by the project's .q-ring.json policy without actually performing it. Use as a dry-run before calling a potentially-blocked tool, attempting to read a sensitive key, or invoking exec_with_secrets with a non-trivial command; prefer get_policy_summary for a one-shot overview of the entire policy. Read-only. Returns JSON { allowed, reason?, policySource } describing the decision. Returns an error 'Missing required parameter for the selected action type' if the matching argument for the chosen action is not supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Secret key name to evaluate. Required when `action` is 'key_read'. | |
| action | Yes | Which policy surface to query. 'tool' = MCP tool gate (needs `toolName`); 'key_read' = secret read gate (needs `key`); 'exec' = exec_with_secrets command gate (needs `command`). | |
| command | No | Command to evaluate against the exec allowlist/denylist. Required when `action` is 'exec'. | |
| toolName | No | Tool id to evaluate, e.g. 'rotate_secret'. Required when `action` is 'tool'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so 'Read-only' adds little; the real value is the disclosed return shape `{ allowed, reason?, policySource }` and the documented error 'Missing required parameter for the selected action type'. It could go further on performance or resolution nuances, but it meaningfully extends beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then usage guidance, then return/error behavior in a logical order. Slightly dense with a few overlapping clauses (the redundant 'Read-only' plus the long error sentence), but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return shape and the key error case, and the routing to `get_policy_summary` closes the main sibling-selection gap. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter and its action-specific requirement is already fully documented in the schema. The description only restates that the matching argument must be supplied for the chosen `action`, adding no new syntax or format detail beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: ask whether a single intended action would be allowed by the project's `.q-ring.json` policy without performing it. It explicitly distinguishes itself from the sibling `get_policy_summary` by contrasting a single-action dry-run with a whole-policy overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers (before calling a potentially-blocked tool, reading a sensitive key, or invoking `exec_with_secrets` with a non-trivial command) and names the alternative (`get_policy_summary`) with the condition that selects it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_projectARead-onlyIdempotent
[project] Compare the keys declared in the project's .q-ring.json manifest against what is actually present in the keyring. Use as the canonical 'is this project ready to run' gate before starting a dev server, deploying, or onboarding a teammate; prefer health_check for a scope-wide decay sweep (no manifest), and agent_scan for multi-project scans with optional auto-rotation. Read-only; does not mutate the keyring or audit log materially beyond a 'list' read. Returns JSON { total, present, missing, expired, stale, ready, secrets: [...] } where ready is true only when nothing is missing or expired. Errors with 'No secrets manifest found in .q-ring.json' if the project has no manifest.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces this while adding genuinely new context: it does not mutate the keyring or audit log beyond a 'list' read, and it documents the exact error when no manifest exists. It stops short of describing pagination or the semantics of every returned field, but adds meaningful behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then routing guidance, behavior, and return shape in that order. It is dense and effective; slightly long, but each sentence carries distinct information rather than restating the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, safety profile, return payload shape (including the meaning of `ready`), and the failure case. With annotations covering read-only safety and the return values described inline in the absence of an output schema, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `projectPath` parameter is fully documented in the schema, so the baseline is 3. The description adds no format or default detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: comparing keys declared in the project's `.q-ring.json` manifest against the actual keyring. It explicitly distinguishes itself from `health_check` (scope-wide decay sweep, no manifest) and `agent_scan` (multi-project scans), so an agent can select it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context ('is this project ready to run' gate before dev server, deploy, or onboarding) and names the two alternatives with the conditions that select them. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ci_validate_secretsARead-onlyIdempotent
[validation] Validate every accessible secret in the requested scope against its detected provider in a single batch and return a structured pass/fail report. Use as a CI gate ('do all our credentials still work before deploy?') or as a pre-rotation health pass; prefer validate_secret for a single key. Side effects: one outbound request per validatable secret (cost scales with N). Reads each secret value (records 'read' audit events). Returns JSON { total, valid, invalid, results: [...] } listing per-key status, provider, and error messages where applicable. Returns 'No secrets to validate' if nothing in scope has a provider mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing cost scaling ('one outbound request per validatable secret'), audit side effects ('records read audit events'), the exact JSON return shape, and the 'No secrets to validate' empty-scope case. This is rich behavioral context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then usage, then side effects, then return contract. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-param, zero-required tool with no output schema, the description supplies the return structure, side-effect cost, audit implications, and empty-result behavior — everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents orgId/scope/teamId/projectPath and their conditional requirements. The description only alludes to 'the requested scope' without adding format or constraint detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Validate every accessible secret ... against its detected provider in a single batch') plus the output artifact. It explicitly differentiates itself from the sibling validate_secret for single-key use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases (CI gate before deploy, pre-rotation health pass) and names the alternative tool with the condition that selects it ('prefer validate_secret for a single key'). No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_secretADestructiveIdempotent
[secrets] Permanently remove a secret value (and all its env states) from the keyring for the given scope. Use when a credential is being retired or was created in error; prefer disentangle_secrets to break a sync link without erasing values, remove_hook to detach lifecycle callbacks, and tunnel_destroy for ephemeral tunnels. Destructive and not undoable from q-ring (no built-in trash). Writes a 'delete' event to the audit log and fires matching hooks. Returns 'Deleted "KEY"' on success or a not-found error if the key did not exist in the requested scope. Subject to tool policy.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Exact secret key name to delete. Example: 'OLD_API_KEY'. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint/readOnlyHint/idempotent, but the description adds substantial value beyond them: no undo and no built-in trash, all env states removed, an audit-log 'delete' event is written, matching hooks fire, and it is subject to tool policy. This is exactly the behavioral context a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive action and constraint, then routing, then side effects, then return values. Dense but every sentence earns its place; slightly long, keeping it just below a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return contract ('Deleted "KEY"' or a not-found error), the side effects (audit event, hooks), and the irreversibility caveat. Complete for a 5-parameter destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (key, scope, orgId, teamId, projectPath) is already documented in the schema. The description reinforces scope-based behavior ('for the given scope', not-found 'in the requested scope') but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Permanently remove a secret value ... from the keyring for the given scope'), scopes it, and explicitly distinguishes itself from three siblings by naming conditions under which each alternative is preferred. An agent can select this over disentangle_secrets/remove_hook/tunnel_destroy without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both when-to-use ('credential is being retired or was created in error') and when-not-to-use with named alternatives and their selecting conditions (disentangle_secrets for breaking sync links without erasing, remove_hook for callbacks, tunnel_destroy for ephemeral tunnels). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_anomaliesARead-onlyIdempotent
[audit] Scan the audit history for suspicious access patterns — burst reads of the same key, off-hours access, and other heuristics. Use as a quick triage signal when investigating a single key or before letting an agent rotate credentials; prefer health_check for a scope-wide decay+anomaly summary, and agent_scan for multi-project JSON reports with optional auto-rotation. Read-only; never mutates secrets or the audit log. Returns one line per finding formatted [type] description, or 'No anomalies detected' when the log looks clean.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | If provided, narrow the scan to this exact key. Omit to scan across every key in the audit log. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is largely covered; the description still reinforces 'Read-only; never mutates secrets or the audit log' and discloses the output shape ('one line per finding formatted [type] description', or a clean-log message). It could say more about scan cost or log-window limits, but it goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the '[audit]' tag and the core action front-loaded, followed by routing guidance and the return contract. Slightly packed but every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by specifying the return format and the empty-case message, and it covers routing and safety. An agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'key' parameter is fully documented in the schema (narrow-to-key vs scan-all), so the description adds no syntax or format detail beyond it. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scan the audit history') and enumerates the concrete patterns detected ('burst reads of the same key, off-hours access'). It also explicitly distinguishes itself from siblings health_check and agent_scan, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('quick triage signal when investigating a single key or before letting an agent rotate credentials') and names two alternatives with the conditions that select them (health_check for scope-wide decay+anomaly summary, agent_scan for multi-project JSON with auto-rotation). No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_environmentARead-onlyIdempotent
[project] Resolve which environment slug (e.g. 'dev', 'staging', 'prod') the current invocation should collapse to. Use before reading secrets when you want to mirror the same env q-ring would auto-pick (e.g. to log it, or to pass through to another tool); prefer passing an explicit env to get_secret/env_generate when you already know which env you want. Read-only; checks the QRING_ENV env var, NODE_ENV, the project's .q-ring.json, and the current git branch in priority order. Returns JSON { env, source } (e.g. { env: 'dev', source: 'NODE_ENV' }), or a plain message indicating that no env could be detected.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world. The description adds specific detection sources in priority order (QRING_ENV, NODE_ENV, .q-ring.json, git branch) and the return format, which are valuable behavioral details beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then usage guidance, detection logic, and return format. Each sentence contributes necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's detection complexity and the absence of an output schema, the description fully explains the resolution process, priority order, and return values. No critical information is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the single optional projectPath parameter. The description adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb 'Resolve' and resource 'environment slug', and clarifies it detects the env the invocation should collapse to. It distinguishes itself from sibling tools like get_secret and env_generate by suggesting when to prefer those instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use before reading secrets to mirror the auto-picked env, and to prefer passing explicit env to get_secret/env_generate when known. This gives clear when-to-use and when-to-use-alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disentangle_secretsAIdempotent
[secrets] Break the sync link between two previously entangled keys so future rotations no longer propagate. Use when one of the keys is being retired or should diverge intentionally; pair with delete_secret if you also want to erase one of the values, and use entangle_secrets to recreate the link. Mutates only metadata; the current values remain untouched. Safe and idempotent — running on a pair that was never linked returns success without effect. Subject to tool policy. Returns 'Disentangled: SOURCE </> TARGET'.
| Name | Required | Description | Default |
|---|---|---|---|
| sourceKey | Yes | First key in the previously linked pair. | |
| targetKey | Yes | Second key in the previously linked pair. | |
| sourceScope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| targetScope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| sourceProjectPath | No | Project root for sourceKey when sourceScope='project'. | |
| targetProjectPath | No | Project root for targetKey when targetScope='project'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, idempotent, non-destructive, but the description goes beyond them by specifying that only metadata mutates and values stay untouched, that running on an unlinked pair succeeds with no effect, and that the operation is subject to tool policy. It even names the exact return string.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then eligibility, alternatives, mutation scope, and idempotency. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a metadata-only mutation with no output schema, the description covers when to use it, what changes, what does not change, idempotency, and the return value, leaving no practical gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so sourceKey/targetKey and the scope/path parameters are already documented. The description adds no additional parameter semantics (e.g., whether sourceKey and targetKey may be swapped), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Break the sync link between two previously entangled keys') plus the downstream consequence ('future rotations no longer propagate'), which distinguishes it from entangle_secrets and delete_secret without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers (retiring a key, intentional divergence) and names the two alternatives that select different behaviors: delete_secret for erasing values and entangle_secrets for recreating the link. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entangle_secretsAIdempotent
[secrets] Link two keys (across the same or different scopes) so future writes/rotations of either propagate the same value to the other. Use when one logical credential lives under multiple names (e.g. STRIPE_SECRET_KEY global and project) and should never drift; prefer set_secret for unrelated values, and reverse the link with disentangle_secrets (does not delete values). Mutates only the metadata of both envelopes — the values themselves are not changed by this call. Idempotent: re-running on an already-entangled pair is a no-op. Subject to tool policy. Returns a short confirmation: 'Entangled: SOURCE <-> TARGET'.
| Name | Required | Description | Default |
|---|---|---|---|
| sourceKey | Yes | First secret key in the pair. Example: 'STRIPE_SECRET_KEY'. | |
| targetKey | Yes | Second secret key to keep in lockstep with the source. | |
| sourceScope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| targetScope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| sourceProjectPath | No | Project root for sourceKey when sourceScope='project'. Defaults to the server cwd. | |
| targetProjectPath | No | Project root for targetKey when targetScope='project'. Defaults to the server cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint, destructiveHint=false, and readOnlyHint=false, but the description adds meaningful non-structured context: it mutates only envelope metadata (values untouched), is subject to tool policy, and returns a specific confirmation string. The idempotency claim duplicates the annotation rather than extending it, keeping this just below a top score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and routing guidance are front-loaded, and most sentences earn their place. Slightly dense with multiple parenthetical asides, but nothing is wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description states the return value explicitly, covers mutation scope, idempotency, and the sibling-based reversal path. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema, including scope semantics and projectPath defaults. The description adds no new parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Link two keys') and clarifies scope ('across the same or different scopes') plus the propagation semantics. An agent can immediately distinguish this from set_secret and disentangle_secrets, which are named directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it (one logical credential under multiple names that should never drift), names the preferred alternative for unrelated values (set_secret), and points to the reverse operation (disentangle_secrets) with the note that it does not delete values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
env_generateARead-onlyIdempotent
[project] Render a complete .env file body from the project's .q-ring.json manifest, resolving each declared key from the keyring. Use when a build step or local runtime needs a real .env materialized on disk and you want exactly the keys the manifest declares; prefer export_secrets when you want every key in scope (manifest-agnostic) and exec_with_secrets to inject secrets into a child process without writing them to a file. Reads values (records 'read' audit events) and collapses superposition for the requested env. Returns the raw .env text, with # MISSING (required): KEY / # EXPIRED: KEY / # STALE: KEY warnings appended as comments. Missing keys appear as commented-out # KEY= placeholders so the file remains a valid drop-in.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment slug used to collapse superposition when a secret has multiple per-env states. Examples: 'dev', 'staging', 'prod'. If omitted, the secret's defaultEnv is used. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only, idempotent, non-destructive, closed-world. The description adds substantial behavioral detail beyond that: it records 'read' audit events, collapses superposition for the requested env, describes return value format (raw `.env` text), and details warning/placeholder behavior for MISSING/EXPIRED/STALE keys so the file remains valid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core operation, then usage guidance with alternatives, then behavioral details. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a tool with no output schema and full schema coverage: it explains purpose, usage, audit behavior, env-collapse semantics, and exactly what the returned text contains including warning markers and placeholder formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are well-documented by the schema itself. The description mentions the env and project concepts in narrative context but adds no syntax or format beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: 'Render a complete `.env` file body from the project's `.q-ring.json` manifest, resolving each declared key from the keyring.' It clearly distinguishes itself from siblings export_secrets and exec_with_secrets by naming them and their differing behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when a build step or local runtime needs a real `.env` materialized on disk') and when-to-prefer-alternatives ('prefer `export_secrets` when you want every key in scope... and `exec_with_secrets` to inject secrets into a child process without writing them to a file').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exec_with_secretsADestructive
[exec] Run a child shell command with project secrets injected as environment variables and any leaked secret values redacted from captured stdout/stderr before they return to the agent. Use to let an agent run a script that needs credentials (npm run db:migrate, terraform plan, vercel deploy) without ever putting plaintext values in the chat; prefer env_generate if you need to write a .env file to disk and validate_secret for upstream liveness checks. Spawns a real child process — has whatever side effects the command itself causes (writes, network, exec). Subject to BOTH tool policy and exec policy (allowlist/denylist). Returns a text body with Exit code: N then STDOUT: and STDERR: blocks; both streams are scrubbed against the secret values that were injected.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Positional arguments passed to `command`. Example: ['run', 'db:migrate']. Each element is passed verbatim with no extra shell parsing. | |
| keys | No | Whitelist of exact key names to inject. Omit to inject every secret in scope (subject to `tags`). | |
| tags | No | Inject only secrets carrying at least one of these tags. Combinable with `keys` as an AND filter. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| command | Yes | Executable name or full command to run. Example: 'pnpm', 'node', '/usr/bin/env'. Must be allowed by exec policy. | |
| profile | No | Exec sandbox profile. 'restricted' (default) denies network-tool binaries (curl, wget, ssh, scp, nc, netcat, ncat) AND common interpreters/shells (python, node, deno, bun, perl, ruby, php, sh, bash, zsh) — since those could otherwise egress the injected secrets — strips proxy env vars, and caps runtime at 30s. It still is NOT a real OS sandbox (it does not restrict PATH, and some allowed binary could in principle make network calls); for genuinely untrusted commands use OS-level isolation (containers, network namespaces). 'ci' allows network and interpreters with a 300s cap and blocks a few destructive commands; 'unrestricted' inherits the full server environment. Define a custom profile in .q-ring.json to allow specific interpreters with secrets. | restricted |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it destructive/openWorld, but the description adds the crucial context that is not in structured fields: it spawns a real child process with the command's own side effects, it is subject to BOTH tool policy and exec policy (allowlist/denylist), and both output streams are scrubbed against injected values. That is exactly the behavioral detail an agent needs before invoking a destructive executor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and both key behaviors, and every sentence carries a distinct fact (use cases, alternatives, side effects, policy, return format). It is on the long side with some dense clauses, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by specifying the return format (`Exit code: N`, then `STDOUT:`/`STDERR:` blocks) and stating the scrubbing applies to both streams. Side effects, policy gating, and secret scope are all covered, so nothing an agent needs to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters including the security-relevant `profile` semantics. The description adds redaction and policy context but does not extend param meaning beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (run) and resource (child shell command) plus the two defining mechanisms: secret injection as env vars and redaction of leaked values from stdout/stderr. It explicitly distinguishes itself from siblings env_generate and validate_secret, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use scenarios (`npm run db:migrate`, `terraform plan`, `vercel deploy`) and a when-not: use `env_generate` to write a .env to disk and `validate_secret` for liveness checks. Both alternatives and their selecting conditions are named explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_auditARead-onlyIdempotent
[audit] Export the audit log as a portable text artifact suitable for archiving or feeding into another SIEM/analyzer. Use for compliance exports, after-the-fact investigations, or to hand the trail to a non-MCP consumer; prefer audit_log for an in-conversation tail and verify_audit_chain to confirm integrity before exporting. Read-only. Returns the rendered text directly (no JSON wrapper). 'jsonl' is one event per line; 'json' is a single array; 'csv' is a header row plus events. Time filters are applied to the event timestamps before formatting.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Inclusive lower bound on event timestamp, ISO 8601. Example: '2026-04-01T00:00:00Z'. Omit for no lower bound. | |
| until | No | Inclusive upper bound on event timestamp, ISO 8601. Omit for now/no upper bound. | |
| format | No | Output format. 'jsonl' (default) is most stream-friendly; 'json' is a single array; 'csv' is spreadsheet-friendly. | jsonl |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/destructive=false, so 'Read-only' adds little; however, the description adds real context: output is returned as rendered text with no JSON wrapper, and time filters are applied to event timestamps before formatting. Those behavior nuances are not expressible in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the core action and artifact lead, followed by routing guidance, safety, return shape, and format semantics. Slightly dense and mildly overlaps the enum descriptions in the schema, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by describing the return (rendered text, no JSON wrapper) and format-specific rendering. Combined with annotations covering safety, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning by spelling out the concrete shape of each format ('jsonl' one event per line, 'json' a single array, 'csv' a header row plus events) and clarifying filter-then-format ordering, which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (export the audit log) and the artifact type (portable text, no JSON wrapper). It explicitly names the sibling alternatives `audit_log` and `verify_audit_chain`, so an agent can differentiate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates when to use it (compliance exports, after-the-fact investigations, handing off to a non-MCP consumer) and when to prefer alternatives (`audit_log` for an in-conversation tail, `verify_audit_chain` to confirm integrity first). This is a textbook when/when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_secretsARead-onlyIdempotent
[secrets] Render multiple secrets as a single .env or JSON document for piping into another tool or file. Use to materialize secrets for a one-off export or copy; prefer env_generate when you want output driven by the project's .q-ring.json manifest, and teleport_pack for an encrypted bundle to share between machines. Reads values (collapses superposition for the requested env) and writes one 'export' event per included secret to the audit log. Returns the rendered text directly (no JSON wrapper). Returns an error if no secrets matched the filters. Values are surfaced in plaintext — handle with care.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment slug used to collapse superposition when a secret has multiple per-env states. Examples: 'dev', 'staging', 'prod'. If omitted, the secret's defaultEnv is used. | |
| keys | No | Whitelist of exact key names to include. If omitted, every key in scope is considered (subject to `tags`). | |
| tags | No | Include only secrets tagged with at least one of these tags. Combined with `keys` as an AND filter when both are supplied. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| format | No | 'env' renders KEY="value" lines suitable for a .env file; 'json' renders an object keyed by secret name. Defaults to 'env'. | env |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: it reads values and collapses per-env superposition, writes one 'export' audit event per included secret, returns raw text with no JSON wrapper, errors when no secrets match, and surfaces plaintext values. Annotations only cover the safety profile; the description supplies the audit-write side effect, output shape, and error condition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then alternatives, then behavioral traits and caveats. Though multi-sentence, every sentence carries distinct information (alternatives, audit side effects, return shape, error case, plaintext warning) with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the return value ('returns the rendered text directly, no JSON wrapper') as well as the failure mode. Combined with the alternative routing and behavioral disclosure, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all eight parameters are documented there, so the schema does the heavy lifting. The description reinforces superposition collapsing for `env` and format behavior, but adds little syntax or format detail beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render multiple secrets as a single .env or JSON document') and clarifies the goal ('for piping into another tool or file'). It explicitly distinguishes itself from env_generate and teleport_pack, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the use case ('one-off export or copy') and then gives explicit alternatives with the conditions that select them: env_generate when output is driven by the .q-ring.json manifest, teleport_pack for an encrypted shareable bundle. This is exactly the when/when-not/alternatives guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_secretADestructive
[secrets] Generate a cryptographically random secret using Node's CSPRNG and optionally store it in the keyring in one step. Use to create new credentials that you control (signing keys, internal tokens, passwords); for issuer-issued credentials (Stripe/OpenAI etc.) use rotate_secret to ask the upstream provider for a fresh key, and use set_secret for values you already have in hand. If saveAs is provided this mutates the keyring (one 'write' event) and returns a summary like 'Generated and saved as "KEY" (FORMAT, ~N bits entropy)'. Without saveAs the call is read-only and returns JSON { ok, data: { value } } containing the freshly generated string.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| format | No | Output shape. 'hex' / 'base64' / 'alphanumeric' = raw random string of `length` characters; 'uuid' = RFC4122 v4; 'api-key' / 'token' = random alphanumeric with optional `prefix`; 'password' = mixed-case alphanumeric with symbols. Defaults to 'api-key'. | api-key |
| length | No | Number of characters (or bytes for hex/base64) to generate. Ignored for 'uuid'. Defaults to a sensible per-format value (e.g. 32 for api-key). | |
| prefix | No | Literal prefix prepended to the random portion. Only meaningful for 'api-key' and 'token'. Example: 'sk-' or 'svc_'. | |
| saveAs | No | If provided, store the generated value at this key name in the keyring (one mutation). Omit to just return the value without persisting. | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true; the description adds value beyond them by clarifying that the call is read-only without `saveAs`, mutates with one 'write' event when `saveAs` is set, and describing both return shapes. It does not state whether `saveAs` overwrites an existing keyring entry, which is a relevant destructive-behavior gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage guidance, then behavioral detail. It is fairly long but every sentence carries information; minor redundancy between the intro's 'optionally store' and the later `saveAs` explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description documents both return modes (a summary string with `saveAs`, JSON `{ ok, data: { value } }` without). With zero required parameters, 100% schema coverage, and clear mutation semantics, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all 8 parameters including formats, scopes, and defaults. The description reinforces `saveAs` semantics but adds little syntax or meaning beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (generate) and resource (cryptographically random secret), names the mechanism (Node's CSPRNG), and clarifies the optional store step. It also actively distinguishes itself from `rotate_secret` and `set_secret`, so an agent can pick correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('credentials that you control'), when to prefer `rotate_secret` (issuer-issued credentials), and when to prefer `set_secret` (values already in hand). Alternatives and their selecting conditions are named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_policy_summaryARead-onlyIdempotent
[policy] Return a high-level summary of the project's .q-ring.json governance policy — counts of allow/deny rules for tools, key reads, exec commands, plus approval and rotation requirements. Use to orient an agent (or the user) on what guardrails are active before attempting policy-restricted actions; prefer check_policy for a precise per-action verdict. Read-only. Returns pretty-printed JSON; missing policy file returns an empty/default summary rather than an error so callers can branch on the counts.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds behavior beyond that: pretty-printed JSON output and, notably, that a missing policy file returns an empty/default summary rather than an error so callers can branch on counts — a non-obvious error-handling contract that usefully informs invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by usage/alternative routing and then behavioral notes. Every sentence carries distinct, non-redundant information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return shape (pretty-printed JSON with allow/deny counts) and the missing-file fallback, which is exactly the return-value context an agent needs. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single `projectPath` parameter, and the schema already documents the absolute-path semantics and the CWD default. The description adds no further parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return a high-level summary of the project's `.q-ring.json` governance policy') and enumerates the contents (allow/deny rule counts for tools, key reads, exec commands, approval/rotation requirements). It also names the sibling it is not ('prefer `check_policy` for a precise per-action verdict'), so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('to orient an agent... before attempting policy-restricted actions') and when to prefer the alternative ('prefer `check_policy` for a precise per-action verdict'). The routing condition between summary vs. per-action verdict is fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_contextARead-onlyIdempotent
[agent] Return a single redacted snapshot of everything an AI agent typically wants to know about this project: secrets present (keys + metadata only), detected env, manifest declarations, configured providers, registered hooks, and recent audit activity. Use this as the very first call in a session to orient the agent before it asks for any individual secret; prefer list_secrets for a flat key listing, check_project for manifest-vs-keyring drift, and audit_log for a deeper access trail. Read-only and value-safe — no plaintext secret values are ever included. Returns a single pretty-printed JSON document; shape is intentionally broad and may grow over time, so read defensively.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it explicitly states no plaintext secret values are ever returned, the return is pretty-printed JSON, and the shape is intentionally broad and may grow, advising defensive reading. It doesn't cover access/auth requirements or rate limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then usage, then safety, then return shape. It is dense but each sentence carries distinct information. It runs slightly long with the enumeration of snapshot contents, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema, zero-required-param aggregate tool, the description covers purpose, usage routing, exclusions, safety guarantees, and return-shape expectations. An agent has everything needed to call it correctly and interpret the response defensively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter with examples, enums, and scope-dependency rules. The description adds no parameter-level detail, so baseline would be 3; it earns a 4 only because it establishes the session-orientation frame and value-safety scope that give the parameters their intended context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Return a single redacted snapshot') and enumerates the exact contents (secrets present, detected env, manifest declarations, providers, hooks, audit activity). It explicitly distinguishes itself from siblings list_secrets, check_project, and audit_log, so an agent can route correctly without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precise usage condition ('Use this as the very first call in a session to orient the agent') and gives three named alternatives with the condition that selects each. There is no ambiguity about when this tool is preferred over the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_secretARead-onlyIdempotent
[secrets] Read the plaintext value of a single secret from the q-ring keyring. Use when an agent needs the actual credential to call an external API or inject into a runtime; prefer inspect_secret to see metadata only, has_secret for presence-only checks, and exec_with_secrets to run a command without exposing the value to chat. Side effects: collapses superposition (selects the per-env state) and writes a 'read' event to the audit log (observer effect). Subject to project tool/key policy and may be denied with a 'Policy Denied' message. Returns JSON { ok, data: { key, value } } on success or an error message if missing/blocked.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment slug used to collapse superposition when a secret has multiple per-env states. Examples: 'dev', 'staging', 'prod'. If omitted, the secret's defaultEnv is used. | |
| key | Yes | Exact secret key name as stored in the keyring (case-sensitive). Example: 'OPENAI_API_KEY'. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that it collapses superposition, writes a 'read' audit event, is subject to policy that may return 'Policy Denied', and returns a specific JSON shape. These are non-obvious behavioral traits the annotations (readOnly/idempotent/non-destructive) do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose followed by alternatives and side effects; every sentence earns its place. It is dense but not padded, though slightly long for a read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description supplies the return contract ('Returns JSON { ok, data: { key, value } }') and error behavior, plus policy and audit side effects. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already well documented in the schema. The description adds only the general notion of per-env superposition, which the env schema field already explains. Baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the plaintext value of a single secret') and immediately distinguishes itself from siblings by naming inspect_secret, has_secret, and exec_with_secrets. An agent knows exactly what this tool returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger condition ('when an agent needs the actual credential to call an external API or inject into a runtime') and routes to the right alternative for each other need (metadata, presence check, indirect execution). This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
has_secretARead-onlyIdempotent
[secrets] Check whether a secret exists in the requested scope without reading the value. Use as a cheap precondition before reading or writing — for example, to skip prompting the user for a key that is already configured. Prefer inspect_secret when you also need metadata. Read-only; does not record a 'read' in the audit log. Decay-aware: returns 'false' for expired secrets even though the value is still in the store. Returns the literal text 'true' or 'false'.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Exact secret key name. Example: 'GITHUB_TOKEN'. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds traits annotations cannot convey: it does not record a 'read' in the audit log, and it is decay-aware, returning 'false' for expired secrets while the value remains in the store. These are non-obvious behaviors that materially affect how an agent interprets the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then layers usage, alternative routing, and behavioral caveats in tight sentences. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by specifying the return format ('the literal text true or false') and the decay caveat. For a boolean existence check, nothing an agent needs to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents key, scope, orgId, teamId, and projectPath in detail. The description only references 'the requested scope' and adds no syntax or format meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Check whether a secret exists') with an explicit scope qualifier ('in the requested scope without reading the value'). This distinguishes it clearly from get_secret and inspect_secret, so an agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('cheap precondition before reading or writing... to skip prompting the user for a key that is already configured') and names the alternative with its selecting condition ('Prefer inspect_secret when you also need metadata'). Both the use case and the sibling routing are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkARead-onlyIdempotent
[health] Run a single read-only sweep over every secret in the requested scope and report counts of healthy/stale/expired secrets plus any current audit anomalies. Use as the default 'is everything OK?' command for an agent or operator; prefer check_project to validate manifest compliance specifically, detect_anomalies for audit-only triage, and agent_scan for multi-project JSON output or optional auto-rotation. Read-only — never writes. Returns a multi-line text summary: header counts (Total / Healthy / Stale / Expired / No decay / Anomalies), then per-secret EXPIRED: / STALE: issue lines, then per-anomaly [type] description lines.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered; the description reinforces it with 'Read-only — never writes' and, more valuably, discloses the return shape in detail since no output schema exists. It doesn't add permission/auth or rate-limit context, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, followed by alternatives and then return behavior, with no wasted sentences. The return-format enumeration is the longest part but earns its place because no output schema exists; it is slightly dense but well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four optional params, a 100%-covered schema, and no output schema, the description supplies exactly the missing piece: the structure of the multi-line text summary (header counts, EXPIRED/STALE lines, anomaly lines). An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself documents orgId, teamId, projectPath, and the scope enum with defaults and required-when conditions. The description adds no parameter-level detail, so this is the baseline 3 where structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Run a single read-only sweep over every secret') plus the exact output content (healthy/stale/expired counts and audit anomalies). It actively distinguishes itself from siblings by naming check_project, detect_anomalies, and agent_scan and the conditions that separate them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly positions the tool as the default 'is everything OK?' command, then routes agents to alternatives with reasons: check_project for manifest compliance, detect_anomalies for audit-only triage, agent_scan for multi-project JSON or auto-rotation. This is exactly the when/when-not/alternatives coverage the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_dotenvAIdempotent
[secrets] Parse standard dotenv-formatted text and store each key/value pair into the keyring in one batch. Use when migrating an existing .env file into q-ring or onboarding a new project; prefer set_secret for a single key, and teleport_unpack to import an encrypted bundle. Mutates the keyring (one write per parsed key) and emits a 'write' audit event for each. Supports comments, single/double quotes, and \n escapes. Returns a multiline summary listing imported keys and any skipped (existing) keys; in dryRun mode no writes happen and the same summary is produced for review.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| dryRun | No | If true, parse and report what would happen but do not write to the keyring. Useful for previewing imports before committing. | |
| content | Yes | Raw .env file content as a single string (newline-separated KEY=VALUE lines, comments allowed). | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. | |
| skipExisting | No | If true, leave already-present keys untouched and add them to the 'skipped' list instead of overwriting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds substantial beyond-schema context: one write per parsed key, a 'write' audit event per key, skipExisting/overwrite semantics, and dryRun producing the same summary with no writes. It also discloses the parsing features supported (comments, quotes, \n escapes). Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but organized: purpose first, then routing, then mutation/audit behavior, then parsing and return semantics. Every clause carries information, though the run-on middle sentence could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still documents the return value (multiline summary of imported and skipped keys) and dryRun's parallel output. For a 5-param batch-import tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it by explaining the observable effect of skipExisting (keys land in the 'skipped' list rather than overwritten) and dryRun (no writes, same summary). Scope/format details still rest on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Parse dotenv-formatted text and store each key/value pair into the keyring') and explicitly names the sibling alternatives set_secret and teleport_unpack. An agent can distinguish it from other import/write tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the two concrete trigger scenarios (migrating a .env file, onboarding a project) and routes the agent: prefer set_secret for a single key, teleport_unpack for encrypted bundles. Explicit when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_secretARead-onlyIdempotent
[secrets] Show full metadata for a single secret — env states, decay window, entanglement links, access counters — without ever revealing the value. Use when you need to understand the shape of a key before reading it or to debug 'why is this expired/stale'; prefer get_secret for the actual value, list_secrets for a many-key overview, and audit_log for the full access timeline. Read-only; does not write a 'read' event since the value is not exposed. Returns pretty-printed JSON with fields: key, scope, type ('superposition'|'collapsed'), created, updated, accessCount, lastAccessed, environments, defaultEnv, decay { expired, stale, lifetimePercent, timeRemaining }, entangled, description, tags. Errors with not-found if the key is absent.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Exact secret key name to inspect. Example: 'OPENAI_API_KEY'. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), but the description adds non-obvious behavior: it never exposes the value and does not write a 'read' event for that reason, plus an explicit not-found error case. This is meaningful context beyond the annotations, though auth/permission requirements are not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then alternatives, then behavior, then return shape. The field enumeration is long but earns its place since no output schema exists; a single sentence of it is arguably expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (key, scope, type, decay, entangled, etc.), and it covers alternatives, side effects, and error behavior. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (key, orgId, scope, teamId, projectPath) is fully documented in the schema, including scope-conditional requirements. The description adds no parameter-level syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Show full metadata for a single secret') and immediately scopes it by what it does NOT do ('without ever revealing the value'). It explicitly names and differentiates from siblings get_secret, list_secrets, and audit_log, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions ('to understand the shape of a key before reading it or to debug why is this expired/stale') and names the three alternatives with the condition that selects each. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lint_filesADestructiveIdempotent
[scan] Inspect a specific list of files for hardcoded secrets and, when fix is true, replace each finding with process.env.KEY while storing the extracted value into the keyring. Use to migrate a known set of files (e.g. just-changed files in a pre-commit hook) into q-ring; prefer scan_codebase_for_secrets for a whole-tree audit and import_dotenv to ingest an existing .env. With fix: false this is read-only. With fix: true this MUTATES the listed source files in place (review with git diff!) and writes one new secret per finding to the keyring. Returns a JSON array of { file, line, key, value, kind } findings, or 'No hardcoded secrets found in the specified files.'.
| Name | Required | Description | Default |
|---|---|---|---|
| fix | No | If true, rewrite the source files to read `process.env.KEY` and store the extracted value in the keyring. If false (default), only report findings. | |
| files | Yes | Absolute or relative paths to lint. Non-existent paths surface as scan errors. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, but the description adds materially: fix:false is read-only, fix:true mutates listed source files in place, writes one new secret per finding to the keyring, advises reviewing with git diff, and discloses the return shape. This is rich behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the primary action, then routes to alternatives, then covers the mutation/read-only split and the return value. Dense but every sentence carries information relevant to calling it correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers action, alternatives, the risky fix flag semantics, and the return format (with the empty-result string). For a destructive, six-parameter tool with no output schema, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema. The description reinforces the fix flag's dual behavior but adds no syntax or format detail beyond what the schema fields already provide, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Inspect/scan) and resource (a specific list of files) plus the conditional mutation behavior. It also explicitly distinguishes itself from scan_codebase_for_secrets and import_dotenv, so the agent can tell them apart without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('migrate a known set of files, e.g. just-changed files in a pre-commit hook') and names two alternatives with the conditions that select them (whole-tree audit vs. .env ingestion). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hooksARead-onlyIdempotent
[hooks] Enumerate every registered lifecycle hook with its match criteria, delivery type, enabled flag, and description. Use to find a hook's id before calling remove_hook, audit what side effects are wired up, or diagnose why a hook did not fire. Read-only. Returns pretty-printed JSON array of hook entries, or 'No hooks registered' when the registry is empty.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered; the description's 'Read-only' is largely redundant. It does add value by disclosing the return shape (pretty-printed JSON array) and the empty-registry sentinel string, which annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then usage routing, then return format. No filler, and the routing guidance is front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the return-value burden and does so, covering both the populated array and the empty case. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate beyond what the empty schema shows. Baseline 4 applies since no parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Enumerate every registered lifecycle hook') and enumerates the returned fields (match criteria, delivery type, enabled flag, description). It is clearly distinguishable from siblings like register_hook and remove_hook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete use cases (find a hook id before remove_hook, audit wired-up side effects, diagnose a hook that did not fire) and explicitly names the dependent sibling tool. Both when-to-use and the alternative are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_providersARead-onlyIdempotent
[validation] Enumerate the secret-validation providers q-ring knows how to call (OpenAI, Stripe, GitHub, …) along with their auto-detect prefixes. Use to discover what provider string to pass to validate_secret/rotate_secret, or to check whether your custom provider is registered. Read-only. Returns JSON array of { name, description, prefixes } objects. prefixes are the literal key-value prefixes (e.g. 'sk-' for OpenAI) used for auto-detection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, and the description reinforces 'Read-only.' More valuably, it discloses the return shape (JSON array of {name, description, prefixes}) and explains that `prefixes` are literal key prefixes used for auto-detection – behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then usage, then read-only note, then return shape – in that priority order. Every sentence carries distinct information; nothing is redundant with structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return payload, which it does fully ({name, description, prefixes} and what prefixes mean). Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description nonetheless explains the semantics of the returned `prefixes` field (e.g. 'sk-' for OpenAI), which is the closest analogue to parameter meaning for a zero-arg discovery tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Enumerate') and resource ('secret-validation providers q-ring knows how to call') with concrete examples (OpenAI, Stripe, GitHub). It also names the sibling tools (validate_secret/rotate_secret) that consume the output, so an agent can distinguish it from the many other list_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states two use cases: discovering the `provider` string to pass to validate_secret/rotate_secret, and checking whether a custom provider is registered. This routes the agent correctly relative to siblings without requiring inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_secretsARead-onlyIdempotent
[secrets] List secret keys and quantum metadata in the requested scope, never the values. Use to discover what secrets exist before reading or writing; pair with inspect_secret for full metadata on one key, analyze_secrets for usage trends, or health_check for decay/anomaly summaries. Read-only; safe to call repeatedly. Returns JSON { ok, data: { entries: [...] } } where each entry has scope, key, stateKeys (env names if superposed), expired, stale, lifetimePercent, timeRemaining, entangledCount, accessCount.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Return only secrets that include this exact tag (case-sensitive). Example: 'production'. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| stale | No | If true, return only secrets in the stale window (lifetimePercent >= 75 and not yet expired). | |
| filter | No | Glob pattern matched against the key name. Supports `*` and `?`. Examples: 'API_*', 'STRIPE_?_KEY'. | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| expired | No | If true, return only secrets whose decay TTL has elapsed (lifetimePercent >= 100). | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive, and closed-world. The description adds the crucial non-obvious constraint that values are NEVER returned, plus a full return-shape contract, which is real added context despite no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded with the verb/resource and the value caveat, but the return-shape sentence is long. Nothing is wasted; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 params (all optional) with full schema coverage, read-only annotations, and no output schema, the description supplies the missing return contract and value-safety guarantee, leaving no gap for an agent to call it incorrectly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is richly documented in the schema; the description adds no parameter-specific guidance. Baseline 3 is appropriate when the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (secret keys and quantum metadata) with clear scope, and explicitly distinguishes itself from siblings by naming inspect_secret, analyze_secrets, and health_check with their distinct purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('discover what secrets exist before reading or writing') and routes to the correct alternatives for different needs, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_hookA
[hooks] Register a side-effect (shell command, HTTP webhook, or process signal) that fires automatically when a matching secret is written, deleted, or rotated. Use to keep external systems in sync (restart a service after rotation, post to Slack on delete, kick a build); prefer agent_remember for storing facts an agent should recall later, and register_hook is not the right tool for time-based scheduled rotation (use agent_scan for that). Mutates the hook registry on disk. At least one match criterion (key, keyPattern, or tag) is required — calls without any return an error. Returns JSON of the registered hook entry including its assigned id (use that id with remove_hook).
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Trigger only on this exact key name. Pick at most one of `key` / `keyPattern` / `tag` (or combine for stricter matching). | |
| tag | No | Trigger on any secret carrying this exact tag. Combinable with key/keyPattern as an AND filter. | |
| url | No | Required when type='http'. Full URL to POST a JSON body `{ id, key, scope, action, timestamp }` to (the value itself is never sent). | |
| type | Yes | Hook delivery mechanism. 'shell' runs a local command, 'http' POSTs JSON to a URL, 'signal' sends an OS signal to a named process. | |
| scope | No | Restrict the hook to secrets in this scope. Omit to fire across both global and project secrets. | |
| actions | No | Which lifecycle actions trigger this hook. Defaults to all three. | |
| command | No | Required when type='shell'. The literal shell command to run; q-ring exposes the matching key as $QRING_HOOK_KEY and action as $QRING_HOOK_ACTION. | |
| keyPattern | No | Trigger on any key matching this glob pattern. Examples: 'DB_*', 'STRIPE_*'. | |
| signalName | No | Signal name to send (e.g. 'SIGHUP', 'SIGUSR1'). Defaults to SIGHUP, which most daemons treat as 'reload config'. | SIGHUP |
| description | No | Free-text human-readable description, surfaced by `list_hooks` and the dashboard. | |
| signalTarget | No | Required when type='signal'. Either a numeric PID or a process name resolvable via `ps`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing the on-disk registry mutation, the hard precondition that at least one of key/keyPattern/tag is required or the call errors, and the return contract (JSON entry including an assigned `id` to be used with `remove_hook`). These are behaviors the readOnlyHint/idempotentHint flags alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose in the first clause, then usage, side effects, preconditions, and return shape — dense but no filler. Every sentence adds a distinct fact an invoking agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no output schema, the description covers side effects, precondition errors, return payload contents, hook environment variables ($QRING_HOOK_KEY/$QRING_HOOK_ACTION), and the follow-up tool (remove_hook). Annotations and schema fill the remaining type/enum details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds a cross-parameter constraint absent from the schema: at least one match criterion (key, keyPattern, or tag) is required or the call fails. It also notes the returned `id`'s purpose with `remove_hook`. Individual parameter meanings remain schema-only, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Register a side-effect (shell command, HTTP webhook, or process signal) that fires automatically when a matching secret is written, deleted, or rotated.' It explicitly distinguishes itself from siblings by naming agent_remember (fact storage) and agent_scan (scheduled rotation) as the wrong tools for those jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete when-to-use scenarios ('restart a service after rotation, post to Slack on delete, kick a build'), explicit alternatives ('prefer agent_remember for storing facts'), and an exclusion ('not the right tool for time-based scheduled rotation — use agent_scan'). This is exactly the when/when-not/alternative triad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_hookADestructiveIdempotent
[hooks] Detach a single lifecycle hook by its registry id so it stops firing. Use to retire a specific webhook/command without touching any secrets; prefer delete_secret to remove a credential and tunnel_destroy for ephemeral tunnels. Mutates the hook registry only — does not touch secret values, audit log, or env states. Idempotent in spirit: removing an already-absent id returns a not-found error rather than partial work. Returns 'Removed hook ID' on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Hook id returned by `register_hook` or visible in `list_hooks` (opaque string). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that: it enumerates untouched surfaces (secret values, audit log, env states) and nuances the idempotency hint by clarifying an already-absent id returns not-found rather than partial work, plus states the success return string.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and effect, then alternatives, then scope guarantees. Every sentence carries information, though the 'idempotent in spirit' clause is slightly wordy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param mutation with no output schema, the description covers the action, the blast radius, the alternative tools, idempotency behavior, and the success return value. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single param already documents its origin (register_hook / list_hooks, opaque string). The description's 'registry id' phrasing reinforces but does not extend that meaning, so the schema is doing the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Detach a single lifecycle hook by its registry id') plus the effect ('so it stops firing'). It explicitly distinguishes itself from nearby siblings delete_secret and tunnel_destroy, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('retire a specific webhook/command without touching any secrets') and names two alternatives with the conditions that select them. Nothing is left to inference about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_secretADestructive
[validation] Ask the upstream provider to issue a fresh credential for this secret and store the new value back into the keyring. Use when a secret is expiring, leaked, or part of a scheduled rotation; prefer generate_secret for self-managed values you fully control, and agent_scan --autoRotate for sweep-style rotation across multiple expired keys. Mutates the keyring with the newly-issued value if rotation succeeds (one 'write' audit event), and makes outbound network requests against the provider's rotation API. Returns JSON { rotated, newValue?, message?, ... }. If rotated is false, the existing value is left untouched.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Exact key to rotate. Must already exist in the keyring. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| provider | No | Force a specific provider id (see `list_providers`). Omit to auto-detect from the current value or the secret's stored provider hint. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the 'write' audit event, outbound provider network calls, the return shape `{ rotated, newValue?, message?, ... }`, and the failure semantics (rotated=false leaves existing value untouched). The annotations cover the safety profile, and the description layers concrete operational detail on top.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then when-to-use, then behavioral side effects and return contract in tightly packed sentences. Every clause carries distinct information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description documents the return fields and the failure state, and it covers mutation effects and network behavior for a destructive operation. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (key, orgId, scope, teamId, provider, projectPath) are already documented with examples and scope conditions. The description adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Ask the upstream provider to issue a fresh credential for this secret and store the new value back into the keyring.' It distinguishes itself from `generate_secret` (self-managed values) and `agent_scan --autoRotate` (sweep rotation), so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger conditions ('expiring, leaked, or part of a scheduled rotation') plus two named alternatives with the conditions that select them. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_codebase_for_secretsARead-onlyIdempotent
[scan] Walk a directory tree and flag plausible hardcoded secrets using regex heuristics plus Shannon-entropy scoring on string literals. Use as a one-shot 'is anything leaking in this repo?' audit before commit/release; prefer lint_files when you already know the specific files to check (and want optional auto-fix). Read-only — never modifies source files. Honors .gitignore. Returns JSON array of { file, line, key, value, kind } findings, or 'No hardcoded secrets found in the specified directory.' when clean. False positives are possible — review before treating as ground truth.
| Name | Required | Description | Default |
|---|---|---|---|
| dirPath | Yes | Directory to scan, absolute or relative to the server cwd. The scan recurses into subdirectories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: it honors `.gitignore`, never modifies source files, returns a defined JSON finding shape, and warns that false positives are possible and require review. The safety profile (read-only) is already covered by the annotations, so the description's additional value is the gitignore behavior and the false-positive caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every sentence earns its place: scope, technique, routing to the alternative, read-only guarantee, gitignore behavior, return shape, and the false-positive caveat. Front-loads what the tool does before the caveats, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the JSON finding fields and the clean-result string. Combined with the routing guidance and caveats, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single `dirPath` parameter, so the schema already documents its semantics and recursion. The description only restates 'walk a directory tree' without adding format or edge-case guidance, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('scan' a directory tree for hardcoded secrets') plus the technique used (regex heuristics plus Shannon-entropy scoring). It also distinguishes itself from the sibling `lint_files`, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as a one-shot 'is anything leaking in this repo?' audit before commit/release and names the alternative (`lint_files`) with the exact condition that should route the agent there (known specific files, optional auto-fix). When-to-use and when-to-prefer-alternatives are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_secretADestructiveIdempotent
[secrets] Create or overwrite a single secret value, optionally with TTL/decay, per-env superposition, description, tags, and rotation hints. Use to add or update one key at a time; prefer import_dotenv for bulk .env ingest, generate_secret (with saveAs) to generate-and-store in one step, and entangle_secrets instead of duplicating the same value under two keys. Mutates the keyring (overwrites any existing value at the same key/scope), writes a 'write' event to the audit log, and triggers any matching hooks. Subject to tool policy. Returns a short confirmation text like '[scope] KEY saved' (or '[scope] KEY set for env:NAME' when env is provided).
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | If set, writes this value to the named per-env state (superposition) instead of the default slot. Existing default value is preserved as state 'default'. Example: 'prod'. | |
| key | Yes | Secret key name (UPPER_SNAKE_CASE recommended). Example: 'STRIPE_SECRET_KEY'. | |
| tags | No | Tag list for filtering and hook matching. Example: ['production', 'payments']. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| value | Yes | The secret value to store. Stored as-is; never logged or echoed. May be empty only when `env` is provided to register a new env without a default. | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| ttlSeconds | No | Quantum decay window in seconds. After this many seconds the secret is marked expired (still readable, but `has_secret` returns false and `health_check` flags it). Omit for no decay. | |
| description | No | Free-text human-readable description shown in `inspect_secret` and the dashboard. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. | |
| rotationFormat | No | Format used by `agent_scan --autoRotate` and `rotate_secret` when this secret expires. Pick the format that matches the upstream service's accepted shape. | |
| rotationPrefix | No | Literal prefix prepended on auto-rotation (only used with rotationFormat 'api-key' or 'token'). Example: 'sk-'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, openWorldHint=false. The description adds rich context beyond these: it specifies that it 'Mutates the keyring (overwrites any existing value at the same key/scope)' confirming the destructive nature, writes a 'write' event to the audit log, triggers any matching hooks, is subject to tool policy, and even describes the return value format. This exceeds the annotation burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: first sentence states purpose and features, second gives usage alternatives, third describes side effects, fourth notes policy, fifth specifies return format. Every sentence earns its place, and information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters with 100% schema coverage, no output schema, and annotations covering safety hints, the description is complete. It covers purpose, usage alternatives, side effects, policy, and return format. An agent has everything needed to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds meaning by explaining how env interacts with default slot ('per-env superposition'), mentions TTL/decay, description, tags, and rotation hints without repeating schema details. However, it does not add syntax or format details beyond what the schema already provides, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or overwrite a single secret value') and explicitly enumerates the features (TTL/decay, per-env superposition, description, tags, rotation hints). It clearly distinguishes itself from siblings by naming import_dotenv, generate_secret, and entangle_secrets as alternatives for different use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('Use to add or update one key at a time') and when-not alternatives with conditions ('prefer import_dotenv for bulk .env ingest, generate_secret (with saveAs) to generate-and-store in one step, and entangle_secrets instead of duplicating'). This is comprehensive routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_dashboardA
[dashboard] Start a local web dashboard (http://127.0.0.1:PORT) that streams live KPIs, secret tables, manifest gaps, hooks, audit events, and anomalies via Server-Sent Events. Use when an operator (or an agent on behalf of one) wants a richer visual surface than chat output; prefer health_check / analyze_secrets for one-shot text summaries inside the conversation. Side effect: binds an HTTP server on the requested port (one process-wide instance — re-running returns the existing URL instead of starting a second server). Never exposes secret values. Returns the URL string to open in a browser.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | TCP port to listen on (default 9876). Pick another port if 9876 is already in use; the call fails if binding errors. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the side effect of binding an HTTP server, the process-wide singleton behavior (re-running returns the existing URL rather than starting a second server), that secret values are never exposed, and that the return value is a URL string. Annotations are absent from the description's remit here except for safety hints, and this text adds substantial operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and resource, then layers usage routing, side effects, and return value in four dense sentences with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description names the return value (URL string), the singleton constraint, the binding side effect, and the secret-safety guarantee. An agent has everything needed to call it correctly and set expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the port parameter is already fully documented in the schema (default, failure mode). The description only echoes 'on the requested port' without adding format or constraint meaning. Baseline 3 is appropriate when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a local web dashboard') plus exactly what it streams (KPIs, secret tables, manifest gaps, hooks, audit events, anomalies via SSE). It explicitly names the siblings it is not, so an agent can distinguish it from health_check/analyze_secrets without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('wants a richer visual surface than chat output') and names the alternatives ('prefer health_check / analyze_secrets for one-shot text summaries'). The routing decision is fully determined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teleport_packARead-onlyIdempotent
[teleport] Encrypt one or more secrets into a single AES-256-GCM bundle string that can be safely transferred between machines. Use to hand off a curated set of credentials to another developer or environment; prefer export_secrets for plaintext .env output (single machine, trusted) and tunnel_create for ephemeral one-shot delivery on the same machine. Reads each secret value (records 'export' audit events) and produces a base64-encoded ciphertext. The bundle is unreadable without the same passphrase via teleport_unpack. Returns the bundle string directly. Errors with 'No secrets to pack' if the filter matched zero secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | No | Whitelist of exact key names to include. Omit to pack every secret in the requested scope. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| passphrase | Yes | Symmetric passphrase used to derive the AES-256-GCM key. The receiver must supply the same string to `teleport_unpack`. Pick something high-entropy and share it out-of-band. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior. The description adds important traits beyond annotations: AES-256-GCM encryption, base64 ciphertext output, audit-event recording, passphrase dependence for unpacking, direct bundle return, and the specific error when no secrets match.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation, then offers alternatives, then covers mechanism, return value, and error behavior. It is dense but every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex crypto handoff tool with no output schema, the description supplies the return type, passphrase requirement, audit side effect, error case, and sibling alternatives. The schema handles parameter details, so an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents keys, scope, orgId, teamId, projectPath, and passphrase. The description reinforces that the passphrase must match teleport_unpack, but adds little parameter syntax beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: encrypt/pack secrets into a single AES-256-GCM bundle. It explicitly distinguishes itself from export_secrets and tunnel_create, so an agent can route correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: hand off a curated set of credentials to another developer or environment. It names the preferred alternatives export_secrets for plaintext .env output and tunnel_create for ephemeral same-machine delivery, and points to teleport_unpack as the reverse operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teleport_unpackADestructiveIdempotent
[teleport] Decrypt a bundle produced by teleport_pack and import each contained secret into the local keyring. Use on the receiving machine after a packer hands you the bundle and passphrase out-of-band; prefer dryRun=true first to preview what will be written. When dryRun is false this mutates the keyring (one 'write' event per imported secret) at the requested scope. Bad passphrase or tampered bundle returns JSON { ok: false, error: { message } } with isError: true. On success returns 'Imported N secret(s) from teleport bundle'; in dryRun mode returns 'Would import N secrets:' followed by a KEY [scope] listing.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | global |
| bundle | Yes | Base64-encoded ciphertext returned by `teleport_pack`. Pass through whitespace untouched if possible. | |
| dryRun | No | If true, decrypt and report what would be written but do not mutate the keyring. Useful for verifying bundle contents before commit. | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| passphrase | Yes | The same passphrase that was used to pack this bundle. Bad passphrases return an authentication error rather than wrong plaintext. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, and the description adds real value beyond them: each imported secret emits a 'write' event, scope is honored, and bad passphrase/tampering yields JSON {ok:false} with isError:true. It does not address whether existing keys at the target scope are overwritten, which is the main destructive risk an agent would want spelled out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the sibling reference, and each later sentence carries condition/return/error information rather than filler. It is somewhat dense and runs long for a single paragraph, but no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully covers the return contract (success string, dryRun listing format, JSON error shape) and the mutation/scope behavior. For a 7-parameter mutation tool with only two required inputs, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all seven parameters (including scope enum, dryRun default, and teamId/orgId/projectPath requirements) are already documented in the schema. The description reinforces dryRun's preview purpose and the scope concept but adds no syntax or format detail beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Decrypt... and import') plus resource ('bundle produced by teleport_pack', 'local keyring'), and explicitly ties itself to its sibling teleport_pack. An agent can distinguish it from import_dotenv or set_secret without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context ('on the receiving machine after a packer hands you the bundle and passphrase out-of-band') and a recommended precondition (prefer dryRun=true first). It does not, however, name alternative import paths (e.g., import_dotenv, set_secret) or state when this tool should not be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tunnel_createA
[tunnel] Stash a one-shot or short-lived secret in the q-ring server's process memory and return an ID that can be used to read it back. Use for handing a one-time value to another tool/process without persisting it (npm OTP codes, magic-link tokens, copy/paste between machines via a relay); prefer set_secret with ttlSeconds when you actually want a tracked, auditable secret. Mutates only in-memory state — the value never touches disk and is lost on server restart. Subject to tool policy. Returns JSON { ok, data: { id } } where id is an opaque string to pass to tunnel_read/tunnel_destroy.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | The plaintext value to tunnel. Held only in process memory; never logged. | |
| maxReads | No | Self-destruct after this many successful `tunnel_read` calls. Use 1 for true one-shot delivery. | |
| ttlSeconds | No | Auto-destroy the tunnel after this many seconds. Omit for no time limit (then a `maxReads` is highly recommended). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds genuinely non-obvious traits: values stay in process memory, never touch disk, are lost on restart, and creation is subject to tool policy. It also names the downstream tools (`tunnel_read`/`tunnel_destroy`) that consume the returned id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then usage, behavior, and return shape in a tight sequence with no filler. It is a single dense block rather than cleanly separated sentences/lines, which slightly hurts scannability for a six-part message.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by specifying the return shape (`{ ok, data: { id } }`) and the opaque-id contract for `tunnel_read`/`tunnel_destroy`. Combined with the in-memory-loss caveat and policy note, an agent has everything needed to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `value`, `maxReads`, and `ttlSeconds` including their self-destruct semantics. The description adds only indirect guidance (mentioning `ttlSeconds` in the `set_secret` comparison and warning that omitting a TTL makes `maxReads` strongly advisable), which is useful but not deep parameter elaboration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('stash a one-shot or short-lived secret in the q-ring server's process memory') plus the concrete artifact returned ('an ID that can be used to read it back'). It explicitly contrasts itself with the sibling `set_secret`, so an agent can pick between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases (npm OTP codes, magic-link tokens, copy/paste relay) and an explicit routing rule: prefer `set_secret` with `ttlSeconds` when a tracked, auditable secret is wanted. This is a clear when-to-use and when-to-use-something-else statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tunnel_destroyADestructiveIdempotent
[tunnel] Immediately remove a tunnel from memory, regardless of remaining reads or TTL. Use when a tunneled value should be cancelled before delivery (e.g. wrong recipient, secret already rotated); prefer letting maxReads/TTL handle cleanup for normal flows. Mutates in-memory state only. Returns 'Destroyed ID' on success or a not-found error if the ID is unknown or already gone.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The opaque tunnel ID to destroy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent annotations by disclosing what is destroyed (in-memory only, not persisted), that it bypasses reads and TTL, and the exact success ('Destroyed ID') and failure (not-found) outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action and scope, then when/when-not, then side effects, then return values. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still supplies the return contract and error behavior, and the mutation scope is clear despite rich annotations. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single `id` parameter, so the schema already carries the contract. The description only adds the state semantics of an unknown/already-gone ID, which is a minor increment over baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Immediately remove a tunnel from memory') with scope qualifiers ('regardless of remaining reads or TTL'), which cleanly separates it from tunnel_read, tunnel_list, and tunnel_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger case (cancelling before delivery, wrong recipient, rotated secret) and the negative case (prefer letting `maxReads`/TTL handle normal cleanup). The alternative-to-this-tool decision is fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tunnel_listARead-onlyIdempotent
[tunnel] Enumerate all currently-active tunnels in the q-ring server with their remaining read budget and time-to-live. Use to audit what is still in memory or to look up an ID you forgot; values are never included in the output. Read-only. Returns one line per tunnel formatted as id | reads:N | max:N | expires:Ns, or the literal text 'No active tunnels' when the list is empty.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, lowering the bar. The description nonetheless adds non-obvious behavior: secret values are never included in the output, and it specifies the exact return line format and the empty-list literal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage before the format details; every sentence carries information. The standalone 'Read-only.' sentence duplicates the readOnlyHint annotation, a minor redundancy that keeps it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly supplies the return shape and the empty-case behavior. For a zero-parameter, read-only listing tool this covers everything an agent needs to call and parse it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is no parameter syntax left for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (enumerate active tunnels in the q-ring server) plus the exact payload returned (remaining read budget and TTL). It is clearly distinguishable from siblings tunnel_create, tunnel_read, and tunnel_destroy by naming its enumeration/audit role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases: auditing what is still in memory and recovering a forgotten tunnel ID. It does not explicitly name an alternative tool or state when not to use it, so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tunnel_readADestructive
[tunnel] Fetch the value stashed by a prior tunnel_create call by its ID. Use exactly once per intended consumer; the value is destructive-by-design and may self-delete after this call. Increments the read counter and may auto-destroy the tunnel if maxReads was set. Returns JSON { ok, data: { id, value } } on success, or an error 'Tunnel "..." not found or expired' if the tunnel has been destroyed, hit its TTL, or never existed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The opaque tunnel ID returned by `tunnel_create`. Case-sensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses self-deletion-by-design, read-counter increment, auto-destroy when maxReads is set, and the exact error string on failure. Annotations already flag destructive/non-idempotent, and the description enriches that with the concrete destruction mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler; the destructive-consumption warning is front-loaded right after the purpose. Slightly redundant in restating the ID provenance and the return shape together, keeping it just under a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the success shape ({ ok, data: { id, value } }) and the failure shape, plus the destruction semantics an agent needs before calling a one-shot destructive read. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is already documented there as the opaque, case-sensitive ID from tunnel_create. The description echoes this without adding format or validation detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the value stashed by a prior tunnel_create call by its ID') and ties itself to the sibling that produces the input, so it is clearly distinguishable from tunnel_create/tunnel_list/tunnel_destroy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit consumption guidance ('Use exactly once per intended consumer') and explains the failure condition (destroyed, TTL expired, never existed). It stops short of naming alternative tools or the alternative action when a tunnel is gone, so it is clear context without full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_secretARead-onlyIdempotent
[validation] Test whether a stored secret is still accepted by its upstream service (OpenAI, Stripe, GitHub, AWS, generic HTTP, etc.) by making a minimal authenticated request. Use to confirm liveness before relying on a credential or as the verification step after rotate_secret; prefer ci_validate_secrets for a batch run across every key in scope. Side effects: makes one outbound network request per call (may incur tiny provider-side rate-limit cost). Records 'read' for the underlying secret value in the audit log; the value itself is never logged. Returns JSON { valid, provider, status?, message?, rateLimit?, ... } (provider-specific shape).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The exact key whose value should be tested upstream. Example: 'OPENAI_API_KEY'. | |
| orgId | No | Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'. | |
| scope | No | Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId). | |
| teamId | No | Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'. | |
| provider | No | Force a specific provider id. Built-ins include 'openai', 'stripe', 'github', 'aws', 'http'. Omit to auto-detect from the value's prefix or the secret's stored provider hint. | |
| projectPath | No | Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only give readOnly/openWorld/idempotent/destructive hints) by disclosing the outbound network request per call, possible provider rate-limit cost, the 'read' audit-log entry, and the guarantee the value itself is never logged. It even sketches the return JSON shape. This is rich, non-redundant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and free of filler, but it is a dense single paragraph bundling usage, side effects, and return shape. All content is useful, though slightly more than is strictly necessary for a scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex network-touching tool with no output schema, the description supplies the missing pieces: the side effect, the audit implication, and an inline return-shape sketch. An agent has everything needed to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including scope, orgId/teamId conditionals, and provider auto-detection. The description mentions providers but adds no syntax or constraint detail beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Test whether a stored secret is still accepted by its upstream service') and explains the mechanism ('minimal authenticated request'). It also distinguishes itself from siblings by naming rotate_secret and ci_validate_secrets, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives when-to-use ('confirm liveness before relying on a credential' or 'verification step after rotate_secret') and names the alternative with its selection condition ('prefer ci_validate_secrets for a batch run across every key in scope'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_audit_chainARead-onlyIdempotent
[audit] Recompute the SHA-256 hash chain over the audit log and confirm no event has been mutated, deleted, or reordered. Use periodically as a tamper-evidence check, or whenever you suspect the audit log has been touched outside q-ring; the result is informational — this tool does not repair the chain if it is broken. Read-only. Returns JSON { ok, valid, brokenAt? } where valid is true for an intact chain and brokenAt (when present) names the first event whose hash did not match.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds real behavioral context beyond them: it is a tamper-evidence check, it does not repair a broken chain, and it documents the return contract { ok, valid, brokenAt? }. That is substantive disclosure, not repetition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first sentence, followed by usage and return contract. Every clause carries information and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, no-output-schema tool, the description supplies the missing return shape and the non-repair caveat, so an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the baseline is 4. The description does not need to compensate for any parameter gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (recompute/verify) and resource (SHA-256 hash chain over the audit log) plus exactly what is being confirmed: no event mutated, deleted, or reordered. This cleanly separates it from siblings like audit_log, export_audit, and detect_anomalies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering contexts: 'use periodically as a tamper-evidence check' and 'whenever you suspect the audit log has been touched outside q-ring,' and clarifies it is informational and does not repair. It does not name an alternative tool (e.g., detect_anomalies) to disambiguate further, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.17.5- Changed
audit_log2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "read", - "write", - "delete", - "list", - "export", - "generate", - "entangle", - "tunnel", - "teleport", - "collapse", - "canary", - "wrap" -]New value: +[ + "read", + "write", + "delete", + "list", + "export", + "generate", + "entangle", + "tunnel", + "teleport", + "collapse", + "approve", + "revoke", + "policy_deny", + "rotate", + "push", + "wrap" +] - added
Input schema / properties / agentAdded value: +{ + "description": "Limit to events stamped with this agent label (clientInfo name@version). Omit for all agents.", + "type": "string" +}
1 tool update
v0.16.1- Changed
audit_log1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "read", - "write", - "delete", - "list", - "export", - "generate", - "entangle", - "tunnel", - "teleport", - "collapse" -]New value: +[ + "read", + "write", + "delete", + "list", + "export", + "generate", + "entangle", + "tunnel", + "teleport", + "collapse", + "canary", + "wrap" +]
3 tool updates
v0.14.2- Added
check_project - Added
get_policy_summary - Added
tunnel_list
2 tool updates
- Removed
check_project - Removed
tunnel_list
2 tool updates
v0.14.1- Changed
exec_with_secrets1 field changed- changed
Input schema / properties / profile / descriptionPrevious value: -"Exec sandbox profile. 'restricted' (default) limits PATH and inheritable env vars; 'ci' is restricted plus CI-friendly defaults (no TTY); 'unrestricted' inherits the full server environment — only pick this when you understand the leak risk."New value: +"Exec sandbox profile. 'restricted' (default) denies network-tool binaries (curl, wget, ssh, scp, nc, netcat, ncat) AND common interpreters/shells (python, node, deno, bun, perl, ruby, php, sh, bash, zsh) — since those could otherwise egress the injected secrets — strips proxy env vars, and caps runtime at 30s. It still is NOT a real OS sandbox (it does not restrict PATH, and some allowed binary could in principle make network calls); for genuinely untrusted commands use OS-level isolation (containers, network namespaces). 'ci' allows network and interpreters with a 300s cap and blocks a few destructive commands; 'unrestricted' inherits the full server environment. Define a custom profile in .q-ring.json to allow specific interpreters with secrets."
- Removed
get_policy_summary
40 tool updates
v0.11.7- Changed
agent_forget1 field changed- changed
Input schema / properties / key / descriptionPrevious value: -"Memory key to forget"New value: +"Memory key to delete."
- Changed
agent_recall1 field changed- changed
Input schema / properties / key / descriptionPrevious value: -"Memory key to recall (omit to list all)"New value: +"Memory key to read. Omit to list every stored key (without values)."
- Changed
agent_remember2 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"Memory key"New value: +"Memory key (free-form string). Convention: lowercase dotted namespaces, e.g. 'project.lastDeploy'." - changed
Input schema / properties / value / descriptionPrevious value: -"Value to store"New value: +"Plain-string value to store. JSON-stringify structured data on the caller side if needed."
- Changed
agent_scan2 fields changed- changed
Input schema / properties / autoRotate / descriptionPrevious value: -"Auto-rotate expired secrets with generated values"New value: +"If true, replace expired secrets with newly generated values (using each secret's `rotationFormat`/`rotationPrefix`). Only enable when intentional rotation is desired — this is destructive on the upstream side." - changed
Input schema / properties / projectPaths / descriptionPrevious value: -"Project paths to monitor"New value: +"List of absolute project roots to scan. Defaults to `[server.cwd]` when omitted."
- Changed
analyze_secrets4 fields changed- changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
audit_log3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Filter by action"New value: +"Limit to a single action verb (e.g. 'read' to see only reads). Omit for all actions." - changed
Input schema / properties / key / descriptionPrevious value: -"Filter by key"New value: +"Limit to events touching this exact key. Omit for the full log." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max events to return"New value: +"Maximum events to return, newest first. Defaults to 20. Increase for deeper investigations."
- Changed
check_policy5 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Type of policy check"New value: +"Which policy surface to query. 'tool' = MCP tool gate (needs `toolName`); 'key_read' = secret read gate (needs `key`); 'exec' = exec_with_secrets command gate (needs `command`)." - changed
Input schema / properties / command / descriptionPrevious value: -"Command to check (for action=exec)"New value: +"Command to evaluate against the exec allowlist/denylist. Required when `action` is 'exec'." - changed
Input schema / properties / key / descriptionPrevious value: -"Secret key to check (for action=key_read)"New value: +"Secret key name to evaluate. Required when `action` is 'key_read'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / toolName / descriptionPrevious value: -"Tool name to check (for action=tool)"New value: +"Tool id to evaluate, e.g. 'rotate_secret'. Required when `action` is 'tool'."
- Changed
check_project1 field changed- changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted."
- Changed
ci_validate_secrets4 fields changed- changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
delete_secret5 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"The secret key name"New value: +"Exact secret key name to delete. Example: 'OLD_API_KEY'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
detect_anomalies1 field changed- changed
Input schema / properties / key / descriptionPrevious value: -"Check anomalies for a specific key"New value: +"If provided, narrow the scan to this exact key. Omit to scan across every key in the audit log."
- Changed
detect_environment1 field changed- changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted."
- Changed
disentangle_secrets6 fields changed- changed
Input schema / properties / sourceKey / descriptionPrevious value: -"Source secret key"New value: +"First key in the previously linked pair." - added
Input schema / properties / sourceProjectPath / descriptionAdded value: +"Project root for sourceKey when sourceScope='project'." - changed
Input schema / properties / sourceScope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / targetKey / descriptionPrevious value: -"Target secret key"New value: +"Second key in the previously linked pair." - added
Input schema / properties / targetProjectPath / descriptionAdded value: +"Project root for targetKey when targetScope='project'." - changed
Input schema / properties / targetScope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)."
- Changed
entangle_secrets6 fields changed- changed
Input schema / properties / sourceKey / descriptionPrevious value: -"Source secret key"New value: +"First secret key in the pair. Example: 'STRIPE_SECRET_KEY'." - added
Input schema / properties / sourceProjectPath / descriptionAdded value: +"Project root for sourceKey when sourceScope='project'. Defaults to the server cwd." - changed
Input schema / properties / sourceScope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / targetKey / descriptionPrevious value: -"Target secret key"New value: +"Second secret key to keep in lockstep with the source." - added
Input schema / properties / targetProjectPath / descriptionAdded value: +"Project root for targetKey when targetScope='project'. Defaults to the server cwd." - changed
Input schema / properties / targetScope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)."
- Changed
env_generate2 fields changed- changed
Input schema / properties / env / descriptionPrevious value: -"Environment for superposition collapse (e.g., dev, staging, prod)"New value: +"Environment slug used to collapse superposition when a secret has multiple per-env states. Examples: 'dev', 'staging', 'prod'. If omitted, the secret's defaultEnv is used." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted."
- Changed
exec_with_secrets9 fields changed- changed
Input schema / properties / args / descriptionPrevious value: -"Command arguments"New value: +"Positional arguments passed to `command`. Example: ['run', 'db:migrate']. Each element is passed verbatim with no extra shell parsing." - changed
Input schema / properties / command / descriptionPrevious value: -"Command to run"New value: +"Executable name or full command to run. Example: 'pnpm', 'node', '/usr/bin/env'. Must be allowed by exec policy." - changed
Input schema / properties / keys / descriptionPrevious value: -"Only inject these specific keys"New value: +"Whitelist of exact key names to inject. Omit to inject every secret in scope (subject to `tags`)." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / profile / descriptionPrevious value: -"Exec profile: unrestricted, restricted, or ci"New value: +"Exec sandbox profile. 'restricted' (default) limits PATH and inheritable env vars; 'ci' is restricted plus CI-friendly defaults (no TTY); 'unrestricted' inherits the full server environment — only pick this when you understand the leak risk." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / tags / descriptionPrevious value: -"Only inject secrets with these tags"New value: +"Inject only secrets carrying at least one of these tags. Combinable with `keys` as an AND filter." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
export_audit3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Output format"New value: +"Output format. 'jsonl' (default) is most stream-friendly; 'json' is a single array; 'csv' is spreadsheet-friendly." - changed
Input schema / properties / since / descriptionPrevious value: -"Start date (ISO 8601)"New value: +"Inclusive lower bound on event timestamp, ISO 8601. Example: '2026-04-01T00:00:00Z'. Omit for no lower bound." - changed
Input schema / properties / until / descriptionPrevious value: -"End date (ISO 8601)"New value: +"Inclusive upper bound on event timestamp, ISO 8601. Omit for now/no upper bound."
- Changed
export_secrets8 fields changed- changed
Input schema / properties / env / descriptionPrevious value: -"Environment for superposition collapse (e.g., dev, staging, prod)"New value: +"Environment slug used to collapse superposition when a secret has multiple per-env states. Examples: 'dev', 'staging', 'prod'. If omitted, the secret's defaultEnv is used." - changed
Input schema / properties / format / descriptionPrevious value: -"Output format"New value: +"'env' renders KEY=\"value\" lines suitable for a .env file; 'json' renders an object keyed by secret name. Defaults to 'env'." - changed
Input schema / properties / keys / descriptionPrevious value: -"Only export these specific key names"New value: +"Whitelist of exact key names to include. If omitted, every key in scope is considered (subject to `tags`)." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / tags / descriptionPrevious value: -"Only export secrets with any of these tags"New value: +"Include only secrets tagged with at least one of these tags. Combined with `keys` as an AND filter when both are supplied." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
generate_secret8 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Output format"New value: +"Output shape. 'hex' / 'base64' / 'alphanumeric' = raw random string of `length` characters; 'uuid' = RFC4122 v4; 'api-key' / 'token' = random alphanumeric with optional `prefix`; 'password' = mixed-case alphanumeric with symbols. Defaults to 'api-key'." - changed
Input schema / properties / length / descriptionPrevious value: -"Length in bytes or characters"New value: +"Number of characters (or bytes for hex/base64) to generate. Ignored for 'uuid'. Defaults to a sensible per-format value (e.g. 32 for api-key)." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / prefix / descriptionPrevious value: -"Prefix for api-key/token format"New value: +"Literal prefix prepended to the random portion. Only meaningful for 'api-key' and 'token'. Example: 'sk-' or 'svc_'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / saveAs / descriptionPrevious value: -"If provided, save the generated secret with this key name"New value: +"If provided, store the generated value at this key name in the keyring (one mutation). Omit to just return the value without persisting." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
get_policy_summary1 field changed- changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted."
- Changed
get_project_context4 fields changed- changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
get_secret6 fields changed- changed
Input schema / properties / env / descriptionPrevious value: -"Environment for superposition collapse (e.g., dev, staging, prod)"New value: +"Environment slug used to collapse superposition when a secret has multiple per-env states. Examples: 'dev', 'staging', 'prod'. If omitted, the secret's defaultEnv is used." - changed
Input schema / properties / key / descriptionPrevious value: -"The secret key name"New value: +"Exact secret key name as stored in the keyring (case-sensitive). Example: 'OPENAI_API_KEY'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
has_secret5 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"The secret key name"New value: +"Exact secret key name. Example: 'GITHUB_TOKEN'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
health_check4 fields changed- changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
import_dotenv5 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"The .env file content to parse and import"New value: +"Raw .env file content as a single string (newline-separated KEY=VALUE lines, comments allowed)." - changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview what would be imported without saving"New value: +"If true, parse and report what would happen but do not write to the keyring. Useful for previewing imports before committing." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / skipExisting / descriptionPrevious value: -"Skip keys that already exist in q-ring"New value: +"If true, leave already-present keys untouched and add them to the 'skipped' list instead of overwriting."
- Changed
inspect_secret5 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"The secret key name"New value: +"Exact secret key name to inspect. Example: 'OPENAI_API_KEY'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
lint_files6 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"File paths to lint"New value: +"Absolute or relative paths to lint. Non-existent paths surface as scan errors." - changed
Input schema / properties / fix / descriptionPrevious value: -"Auto-replace and store secrets"New value: +"If true, rewrite the source files to read `process.env.KEY` and store the extracted value in the keyring. If false (default), only report findings." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
list_secrets8 fields changed- changed
Input schema / properties / expired / descriptionPrevious value: -"Show only expired secrets"New value: +"If true, return only secrets whose decay TTL has elapsed (lifetimePercent >= 100)." - changed
Input schema / properties / filter / descriptionPrevious value: -"Glob pattern on key name (e.g., 'API_*')"New value: +"Glob pattern matched against the key name. Supports `*` and `?`. Examples: 'API_*', 'STRIPE_?_KEY'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / stale / descriptionPrevious value: -"Show only stale secrets (75%+ decay)"New value: +"If true, return only secrets in the stale window (lifetimePercent >= 75 and not yet expired)." - changed
Input schema / properties / tag / descriptionPrevious value: -"Filter by tag"New value: +"Return only secrets that include this exact tag (case-sensitive). Example: 'production'." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
register_hook11 fields changed- changed
Input schema / properties / actions / descriptionPrevious value: -"Which actions trigger this hook"New value: +"Which lifecycle actions trigger this hook. Defaults to all three." - changed
Input schema / properties / command / descriptionPrevious value: -"Shell command to execute (for shell type)"New value: +"Required when type='shell'. The literal shell command to run; q-ring exposes the matching key as $QRING_HOOK_KEY and action as $QRING_HOOK_ACTION." - changed
Input schema / properties / description / descriptionPrevious value: -"Human-readable description"New value: +"Free-text human-readable description, surfaced by `list_hooks` and the dashboard." - changed
Input schema / properties / key / descriptionPrevious value: -"Trigger on exact key match"New value: +"Trigger only on this exact key name. Pick at most one of `key` / `keyPattern` / `tag` (or combine for stricter matching)." - changed
Input schema / properties / keyPattern / descriptionPrevious value: -"Trigger on key glob pattern (e.g. DB_*)"New value: +"Trigger on any key matching this glob pattern. Examples: 'DB_*', 'STRIPE_*'." - changed
Input schema / properties / scope / descriptionPrevious value: -"Trigger only for this scope"New value: +"Restrict the hook to secrets in this scope. Omit to fire across both global and project secrets." - changed
Input schema / properties / signalName / descriptionPrevious value: -"Signal to send (for signal type)"New value: +"Signal name to send (e.g. 'SIGHUP', 'SIGUSR1'). Defaults to SIGHUP, which most daemons treat as 'reload config'." - changed
Input schema / properties / signalTarget / descriptionPrevious value: -"Process name or PID (for signal type)"New value: +"Required when type='signal'. Either a numeric PID or a process name resolvable via `ps`." - changed
Input schema / properties / tag / descriptionPrevious value: -"Trigger on secrets with this tag"New value: +"Trigger on any secret carrying this exact tag. Combinable with key/keyPattern as an AND filter." - changed
Input schema / properties / type / descriptionPrevious value: -"Hook type"New value: +"Hook delivery mechanism. 'shell' runs a local command, 'http' POSTs JSON to a URL, 'signal' sends an OS signal to a named process." - changed
Input schema / properties / url / descriptionPrevious value: -"URL to POST to (for http type)"New value: +"Required when type='http'. Full URL to POST a JSON body `{ id, key, scope, action, timestamp }` to (the value itself is never sent)."
- Changed
remove_hook1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Hook ID to remove"New value: +"Hook id returned by `register_hook` or visible in `list_hooks` (opaque string)."
- Changed
rotate_secret6 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"The secret key to rotate"New value: +"Exact key to rotate. Must already exist in the keyring." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / provider / descriptionPrevious value: -"Force a specific provider"New value: +"Force a specific provider id (see `list_providers`). Omit to auto-detect from the current value or the secret's stored provider hint." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
scan_codebase_for_secrets1 field changed- changed
Input schema / properties / dirPath / descriptionPrevious value: -"Absolute or relative path to the directory to scan"New value: +"Directory to scan, absolute or relative to the server cwd. The scan recurses into subdirectories."
- Changed
set_secret12 fields changed- changed
Input schema / properties / description / descriptionPrevious value: -"Human-readable description"New value: +"Free-text human-readable description shown in `inspect_secret` and the dashboard." - changed
Input schema / properties / env / descriptionPrevious value: -"If provided, sets the value for this specific environment (superposition)"New value: +"If set, writes this value to the named per-env state (superposition) instead of the default slot. Existing default value is preserved as state 'default'. Example: 'prod'." - changed
Input schema / properties / key / descriptionPrevious value: -"The secret key name"New value: +"Secret key name (UPPER_SNAKE_CASE recommended). Example: 'STRIPE_SECRET_KEY'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / rotationFormat / descriptionPrevious value: -"Format for auto-rotation when this secret expires"New value: +"Format used by `agent_scan --autoRotate` and `rotate_secret` when this secret expires. Pick the format that matches the upstream service's accepted shape." - changed
Input schema / properties / rotationPrefix / descriptionPrevious value: -"Prefix for auto-rotation (e.g. 'sk-')"New value: +"Literal prefix prepended on auto-rotation (only used with rotationFormat 'api-key' or 'token'). Example: 'sk-'." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags for organization"New value: +"Tag list for filtering and hook matching. Example: ['production', 'payments']." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'." - changed
Input schema / properties / ttlSeconds / descriptionPrevious value: -"Time-to-live in seconds (quantum decay)"New value: +"Quantum decay window in seconds. After this many seconds the secret is marked expired (still readable, but `has_secret` returns false and `health_check` flags it). Omit for no decay." - changed
Input schema / properties / value / descriptionPrevious value: -"The secret value"New value: +"The secret value to store. Stored as-is; never logged or echoed. May be empty only when `env` is provided to register a new env without a default."
- Changed
status_dashboard1 field changed- changed
Input schema / properties / port / descriptionPrevious value: -"Port to serve on"New value: +"TCP port to listen on (default 9876). Pick another port if 9876 is already in use; the call fails if binding errors."
- Changed
teleport_pack6 fields changed- changed
Input schema / properties / keys / descriptionPrevious value: -"Specific keys to pack (all if omitted)"New value: +"Whitelist of exact key names to include. Omit to pack every secret in the requested scope." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / passphrase / descriptionPrevious value: -"Encryption passphrase"New value: +"Symmetric passphrase used to derive the AES-256-GCM key. The receiver must supply the same string to `teleport_unpack`. Pick something high-entropy and share it out-of-band." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
teleport_unpack7 fields changed- changed
Input schema / properties / bundle / descriptionPrevious value: -"Base64-encoded encrypted bundle"New value: +"Base64-encoded ciphertext returned by `teleport_pack`. Pass through whitespace untouched if possible." - changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview without importing"New value: +"If true, decrypt and report what would be written but do not mutate the keyring. Useful for verifying bundle contents before commit." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / passphrase / descriptionPrevious value: -"Decryption passphrase"New value: +"The same passphrase that was used to pack this bundle. Bad passphrases return an authentication error rather than wrong plaintext." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
- Changed
tunnel_create3 fields changed- changed
Input schema / properties / maxReads / descriptionPrevious value: -"Self-destruct after N reads"New value: +"Self-destruct after this many successful `tunnel_read` calls. Use 1 for true one-shot delivery." - changed
Input schema / properties / ttlSeconds / descriptionPrevious value: -"Auto-expire after N seconds"New value: +"Auto-destroy the tunnel after this many seconds. Omit for no time limit (then a `maxReads` is highly recommended)." - changed
Input schema / properties / value / descriptionPrevious value: -"The secret value"New value: +"The plaintext value to tunnel. Held only in process memory; never logged."
- Changed
tunnel_destroy1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Tunnel ID"New value: +"The opaque tunnel ID to destroy."
- Changed
tunnel_read1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Tunnel ID"New value: +"The opaque tunnel ID returned by `tunnel_create`. Case-sensitive."
- Changed
validate_secret6 fields changed- changed
Input schema / properties / key / descriptionPrevious value: -"The secret key name"New value: +"The exact key whose value should be tested upstream. Example: 'OPENAI_API_KEY'." - changed
Input schema / properties / orgId / descriptionPrevious value: -"Org identifier for org-scoped secrets"New value: +"Organization identifier for org-scoped secrets. Required only when scope='org'. Example: 'acme-corp'." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Project root path for project-scoped secrets"New value: +"Absolute path to the project root for project-scoped secrets and policy resolution. Defaults to the MCP server's current working directory when omitted." - changed
Input schema / properties / provider / descriptionPrevious value: -"Force a specific provider (openai, stripe, github, aws, http)"New value: +"Force a specific provider id. Built-ins include 'openai', 'stripe', 'github', 'aws', 'http'. Omit to auto-detect from the value's prefix or the secret's stored provider hint." - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global, project, team, or org"New value: +"Where the secret lives. 'global' = user keyring (default if omitted on reads), 'project' = scoped to projectPath, 'team' = team-shared (needs teamId), 'org' = org-shared (needs orgId)." - changed
Input schema / properties / teamId / descriptionPrevious value: -"Team identifier for team-scoped secrets"New value: +"Team identifier for team-scoped secrets. Required only when scope='team'. Example: 'acme-platform'."
29 tool updates
v0.11.5- Added
agent_forget - Added
agent_recall - Added
agent_remember - Added
analyze_secrets - Added
check_policy - Added
ci_validate_secrets - Changed
delete_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
disentangle_secrets4 fields changed- changed
Input schema / properties / sourceScope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / sourceScope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - changed
Input schema / properties / targetScope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / targetScope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +]
- Changed
entangle_secrets4 fields changed- changed
Input schema / properties / sourceScope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / sourceScope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - changed
Input schema / properties / targetScope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / targetScope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +]
- Added
exec_with_secrets - Added
export_audit - Changed
export_secrets4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
generate_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Added
get_policy_summary - Added
get_project_context - Changed
get_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
has_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
health_check4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
import_dotenv2 fields changed- changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +]
- Changed
inspect_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Added
lint_files - Changed
list_secrets4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Added
rotate_secret - Added
scan_codebase_for_secrets - Changed
set_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
teleport_pack4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
teleport_unpack4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Changed
validate_secret4 fields changed- added
Input schema / properties / orgIdAdded value: +{ + "description": "Org identifier for org-scoped secrets", + "type": "string" +} - changed
Input schema / properties / scope / descriptionPrevious value: -"Scope: global or project"New value: +"Scope: global, project, team, or org" - changed
Input schema / properties / scope / enumPrevious value: -[ - "global", - "project" -]New value: +[ + "global", + "project", + "team", + "org" +] - added
Input schema / properties / teamIdAdded value: +{ + "description": "Team identifier for team-scoped secrets", + "type": "string" +}
- Added
verify_audit_chain
13 tool updates
v0.1.1- Added
check_project - Added
disentangle_secrets - Added
env_generate - Added
export_secrets - Added
import_dotenv - Added
list_hooks - Added
list_providers - Changed
list_secrets4 fields changed- added
Input schema / properties / expiredAdded value: +{ + "description": "Show only expired secrets", + "type": "boolean" +} - added
Input schema / properties / filterAdded value: +{ + "description": "Glob pattern on key name (e.g., 'API_*')", + "type": "string" +} - added
Input schema / properties / staleAdded value: +{ + "description": "Show only stale secrets (75%+ decay)", + "type": "boolean" +} - added
Input schema / properties / tagAdded value: +{ + "description": "Filter by tag", + "type": "string" +}
- Added
register_hook - Added
remove_hook - Changed
set_secret2 fields changed- added
Input schema / properties / rotationFormatAdded value: +{ + "description": "Format for auto-rotation when this secret expires", + "enum": [ + "hex", + "base64", + "alphanumeric", + "uuid", + "api-key", + "token", + "password" + ], + "type": "string" +} - added
Input schema / properties / rotationPrefixAdded value: +{ + "description": "Prefix for auto-rotation (e.g. 'sk-')", + "type": "string" +}
- Added
status_dashboard - Added
validate_secret
19 tool updates
v0.1.0- First observed
agent_scan - First observed
audit_log - First observed
delete_secret - First observed
detect_anomalies - First observed
detect_environment - First observed
entangle_secrets - First observed
generate_secret - First observed
get_secret - First observed
has_secret - First observed
health_check - First observed
inspect_secret - First observed
list_secrets - First observed
set_secret - First observed
teleport_pack - First observed
teleport_unpack - First observed
tunnel_create - First observed
tunnel_destroy - First observed
tunnel_list - First observed
tunnel_read
TDQS
Scored across 44 tools
The set has many closely related diagnostic and lifecycle tools (e.g. health_check, check_project, agent_scan, detect_anomalies, analyze_secrets) whose boundaries are explained but still overlap enough to require careful reading. Within core secret CRUD, get/inspect/has are well distinguished, but the sheer volume creates selection risk.
Almost all tools use snake_case and many follow a verb_noun or domain_verb pattern (get_secret, list_hooks, tunnel_create, agent_remember). A few names deviate to noun-first or noun_noun (env_generate, status_dashboard, audit_log, health_check), but the convention remains readable and largely predictable.
44 tools is substantially beyond the recommended 3-15 range and exceeds the 25+ threshold, bundling secret CRUD, audit, validation, hooks, tunnels, teleport, scanning, policy, and a dashboard into one server. Although individual tools are granular and purposeful, the count creates a heavy surface for a single MCP server.
The surface covers the secret-management lifecycle comprehensively: create/read/update/delete, metadata inspection, generation, rotation, validation, export/import, encrypted teleport, ephemeral tunnels, audit logging, tamper verification, hooks, policy checks, exec injection, code scanning, and agent memory. No obvious lifecycle gap is missing for the stated domain.
Maintenance
Related MCP Connectors
A secret store for AI agents: the agent never sees the plaintext.
Secrets for developers and agents—secure context and workflows without exposing secret values.
Encrypted secret store and rotation for autonomous agent credentials
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides Claude Code with access to personal secrets and notes stored in a local Markdown file. It enables users to list, search, retrieve, and update secret sections through natural language commands.58 npmMIT
- AlicenseAqualityDmaintenanceShare encrypted, self-destructing secrets from your AI agent. Zero-knowledge E2E encryption. Agent-blind input sources (env:, file:, dotenv:) keep secrets out of LLM context.4351 npm1MIT
- AlicenseAqualityDmaintenanceLocal AES-256-GCM encrypted vault for AI agents. Resolve {{PLACEHOLDER}} secrets in prompts at runtime — LLMs never see real API keys. Argon2id key derivation, zero cloud.258 npm2MIT
- AlicenseAqualityDmaintenanceEncrypted secrets vault that blinds AI agents to API keys. Stores secrets in AES-256-GCM encrypted SQLite vault, resolves them at runtime via MCP values never appear in LLM conversation transcripts. Sandbox .env files with deterministic fakes.739 npm3MIT