Skip to content

MCP Tools Overview

OpaqueVault exposes 8 MCP tools through ov mcp serve. Every tool is designed around one constraint: plaintext secret values never appear in any tool response.


When ov mcp serve starts, it resolves the active app and environment through the standard chain (.ov.yaml, then your ov app use config default). All 8 tools resolve that (app, env) context per call — Claude Code does not need to pass an app parameter, but every tool call re-verifies context rather than trusting a value cached at bridge startup.

The active app is visible in vault_status, which reports the live-verified context for the most recent call, and vault_check_context lets the agent verify the resolved context before touching any secrets — its verdict now predicts every tool’s dispatch, not just vault_run’s.


ToolPurpose
vault_runRun a command with secrets injected as env vars — returns only exit code and output
vault_list_secretsList secret names and metadata (never values) in the active app, scoped to the resolved env — the server still has no env filter; scoping is computed client-side. Ancient pre-encryption-era secret names never appear here in any env — use ov secret list
vault_secret_existsCheck whether a named secret exists (HMAC-based lookup)
vault_create_secretStore a new secret — encrypted client-side, write-only
vault_update_secretRotate or update an existing secret’s value — write-only
vault_delete_secretPermanently delete a secret (requires confirm: true)
vault_statusSession info, active app/env, interceptor count
vault_check_contextPreflight: verify the resolved app/env matches declared intent. Its verdict predicts every tool’s dispatch, not just vault_run’s — every tool resolves context the same way

All tools return structured JSON. The schema is designed so that no field in any response ever contains a plaintext secret value.

vault_run returns:

{
"exit_code": 0,
"stdout": "migrations: 3 applied",
"stderr": ""
}

vault_list_secrets returns:

{
"secrets": ["DATABASE_URL", "OPENAI_API_KEY", "STRIPE_SECRET_KEY"],
"total": 3
}

vault_status returns:

{
"unlocked": true,
"intercept_mode": "block",
"intercepted_count": 0,
"session_age_seconds": 600
}

vault_check_context returns {"match": true, "resolved": {...}} when the resolved app/env matches the declared expected_app / expected_env, or {"match": false, "reason": ..., "resolved": ..., "expected": ...} when they differ. With OV_STRICT_CONTEXT on (the default since v0.11.0), vault_run requires the same expected_app / expected_env declaration and refuses mismatches.


All 8 MCP tools are available on every plan including Free. The interceptor is always active.