Secrevo Secrevo
Docs · quickstart

Ship your first agent with a real key in under five minutes.

Three steps: install the CLI, mint an agent token in the dashboard, run a process. The CLI keeps the secret out of disk, env files, and shell history. The Python SDK does the same for code.

1. Create your workspace

Sign up free at app.secrevo.com. Login is delegated to PrysmID — pick email + password or any social provider. The Free plan gives you 3 identities, 1 workspace, 2 projects, and 7 days of audit log, permanently. No credit card.

If your organization already has a Secrevo workspace, ask the owner to invite you instead of creating a new one. They invite you from /members in their dashboard.

2. Install the CLI

The installer downloads the right binary for your OS/arch, verifies its SHA-256 against the release checksums.txt, and drops it in a user-writable directory (no sudo, no admin).

macOS / Linux

curl -fsSL https://github.com/getsecrevo/cli/releases/latest/download/install.sh | bash

Default install location: ~/.local/bin/secrevo. Override with SECREVO_INSTALL_DIR=/opt/secrevo. Pin a tag with SECREVO_VERSION=v0.3.0.

Windows (PowerShell 5.1+)

irm https://github.com/getsecrevo/cli/releases/latest/download/install.ps1 | iex

Default install location: %LOCALAPPDATA%\secrevo\bin\secrevo.exe. Override with $env:SECREVO_INSTALL_DIR.

From source (Go ≥ 1.25)

go install github.com/getsecrevo/cli/cmd/secrevo@latest

Verify

secrevo version

You should see the tag of the release you installed (for example secrevo v0.3.0). Anything ending in -dev means you are looking at a local build, not a release. secrevo enroll requires v0.3.0 or newer.

3. Authenticate your agent

Agents are how non-human callers (your scripts, CI jobs, deployed services) authenticate to the API. Every agent belongs to a human owner and inherits their grants — revoke the human and every agent they created dies with them. Create one at app.secrevo.com/agentsNew agent, giving it a name that describes the process (for example summarize-bot).

There are two supported ways to hand the agent its token. Pick by where it runs.

Recommended for a headless machine or device — secrevo enroll

This is the browserless equivalent of secrevo login: the operator mints a short-lived code in the dashboard, the agent redeems it once, and the token is written to an encrypted local credentials file (DPAPI-wrapped on Windows). The secret never touches an environment variable, shell history, or your deploy config — which is why this is the right default for an autonomous agent on a machine you control.

  1. Open the agent from /agents and click Generate enrollment code. You get a single-use code (15-minute TTL) plus a QR — deliver either to the machine.
  2. On that machine, redeem it once:
    secrevo enroll K3M9-X2PA
  3. Done. Every later secrevo call finds the persisted credentials automatically — no environment variables to set. Verify with secrevo auth whoami.

The code is single-use and expires in 15 minutes, and generating one rotates the agent's bearer — so a leaked code is low-value and short-lived. The enrolled token is stored at %APPDATA%\secrevo\credentials.json (Windows) or ~/.config/secrevo/credentials.json (POSIX). Requires CLI v0.3.0 or newer.

For CI or an ephemeral process — environment variable

When there is no persistent disk to enroll onto — a CI runner, a short-lived container — inject the token as an environment variable instead. Create the agent, copy the token shown once (it looks like agt_…; the dashboard never shows it again), and keep it in your CI secret store:

export SECREVO_API_TOKEN=agt_...
export SECREVO_WORKSPACE_ID=workspace-...

On Windows PowerShell:

$env:SECREVO_API_TOKEN = "agt_..."
$env:SECREVO_WORKSPACE_ID = "workspace-..."

SECREVO_API_TOKEN always takes precedence over an enrolled credentials file, so you can override an enrolled machine for a single invocation. The workspace ID is shown at the top of the dashboard. SECREVO_API_BASE_URL defaults to https://api.secrevo.com and only needs to be set for a self-hosted instance.

4. Run your first command

Put a real key in your workspace from the dashboard at app.secrevo.com/secrets — for example a real OPENAI_API_KEY. Then:

secrevo run --secret OPENAI_API_KEY -- python -c "import os; print(bool(os.environ['OPENAI_API_KEY']))"

You should see True. The secret was fetched from the API, injected into the subprocess's environment, and never touched disk. The child process's exit code is propagated, so secrevo run -- false exits 1.

Inject several secrets at once, or rename them on the way in:

secrevo run \
  --secret AWS_ACCESS_KEY_ID \
  --secret AWS_SECRET_ACCESS_KEY \
  -- aws s3 ls

secrevo run --secret prod-stripe=STRIPE_API_KEY -- npm test

Use a secret without ever seeing it (mediated calls)

secrevo run injects the value into a local process — fine on a host you trust, but the value does reach that process. When an agent should use a secret in an HTTP API without ever learning the value, use secrevo call. The server injects the secret server-side into an allowlisted request and returns only the response — the plaintext never enters the agent's process, logs, or output.

First, a human with secret.write allowlists the operation — from the secret's page in the dashboard (the Mediated HTTP section) or with the CLI below (deny-by-default — host + method + path, and optionally the query keys, body template, and which response fields come back):

secrevo secret proxy-target add --secret ODOO \
  --host your-org.odoo.com --method POST --path /jsonrpc \
  --response-field result

Then the agent calls it. Put {{secret}} where the value goes (a header or the body — never the URL); the agent supplies only the placeholder:

secrevo call --secret ODOO -X POST -u https://your-org.odoo.com/jsonrpc \
  -H 'Authorization: Bearer {{secret}}' -d @body.json

For the common providers the host and auth header are built in — supply only a path:

secrevo call --secret OPENAI --provider openai --path /v1/models

Multi-step flows (login → use, pagination)

When a task needs several calls with the same secret, open a short-lived session and run each step against it. The session is bound to your identity, expires (5 min by default), shares one response budget, and dies the moment the grant is revoked — every request is re-authorized and re-checked server-side:

sid=$(secrevo session open --secret ODOO | jq -r .session_id)
secrevo call --session "$sid" -X POST -u https://your-org.odoo.com/jsonrpc -d @page1.json
secrevo call --session "$sid" -X POST -u https://your-org.odoo.com/jsonrpc -d @page2.json
secrevo session close --session "$sid"

The same surface is in the Python SDK: client.call(...), client.openai_call("OPENAI", "/v1/models"), and client.open_proxy_session(...) / session_call(...) / close_proxy_session(...).

Honest limits

Use a secret as short-lived credentials (ephemeral creds)

Some loads must hold real credential bytes — the AWS SDK/CLI signing SigV4, a database driver opening a connection. Mediation (secrevo call) can't apply: there is no HTTP request to inject into. The honest answer that still keeps the agent off the long-lived secret is to mint short-lived, scoped credentials from it. For AWS, Secrevo derives a temporary session (via STS GetFederationToken) from the stored key — TTL-bounded, and it can only ever narrow the source key's permissions, never widen them. The agent gets working creds that expire; the long-lived key never leaves the server.

First, a human with secret.write declares the cred-scope — from the secret's page in the dashboard or with the CLI below (deny-by-default — no scope, no minting):

secrevo secret cred-scope add --secret DEPLOY_AWS_KEY \
  --provider aws_federation --max-ttl 15m

Then the agent mints ephemeral creds on demand. --format aws-process emits the AWS credential_process JSON, so the AWS SDK/CLI can call Secrevo for a fresh session automatically:

secrevo creds --secret DEPLOY_AWS_KEY --format aws-process
# or wire it into ~/.aws/config:
#   [profile deploy]
#   credential_process = secrevo creds --secret DEPLOY_AWS_KEY --format aws-process

Other formats: --format env (export AWS_ACCESS_KEY_ID/… ) and --format json. The TTL you request is clamped to the per-secret --max-ttl and the IAM role's own cap — whichever is smallest. Every mint is audited; the creds expire on their own and can't be widened by the agent.

Honest limits

Which mechanism for which secret?

Three sanctioned ways an agent uses a secret without seeing its plaintext — pick by what the secret is. An agent can discover which are wired for a given secret from its metadata (secrevo secret get <NAME>usable_by_agent_via), and every wall it hits names both the next step to configure AND which paths are already usable on that secret (e.g. read-the-value raw_read vs. use-without-seeing mediated HTTP).

Secret typeMechanismHow
HTTP API key (OpenAI, Stripe, Odoo, a REST token…)Mediated call — value injected server-sideallowlist a target (human — dashboard Mediated HTTP section or secrevo secret proxy-target add) → secrevo call (agent)
AWS key used by the SDK/CLI (SigV4)Ephemeral creds — short-lived minted sessiondeclare a cred-scope (human — dashboard or secrevo secret cred-scope add --provider aws_federation) → secrevo creds --format aws-process (agent)
Native DB driver / local private-key signing / SSHResidual (Grade-0) — no no-plaintext path yetHuman reveals, or the owner opts this secret into agent raw-read (dashboard toggle or secret agent-read); non-AWS ephemeral providers are on the roadmap

Use the Python SDK

For code that should fetch secrets itself instead of inheriting them from secrevo run:

pip install secrevo-sdk
# or with a third-party integration:
pip install "secrevo-sdk[openai]"
from secrevo_sdk import SecrevoClient

with SecrevoClient.from_env() as secrevo:
    # Native OpenAI client, key already wired. Value never enters your code.
    openai = secrevo.openai_for("OPENAI_API_KEY")
    reply = openai.responses.create(
        model="gpt-5",
        input="What is the capital of France?",
    )
    print(reply.output_text)

Same pattern for anthropic_for, stripe_for, aws_session_for, and github_for. An AsyncSecrevoClient ships for FastAPI / asyncio. Full surface and offline-cache options in the SDK README.

Use Secrevo from a hosted agent (MCP)

If your agent runs somewhere you can't install the CLI — inside ChatGPT or Claude.ai as a hosted connector — Secrevo speaks the Model Context Protocol at https://mcp.secrevo.com. The connector lets the agent govern your secrets (list, grant, audit) and use them in mediated calls — without the secret value ever entering the model.

Add the connector

In Claude.ai → Settings → Connectors → Add custom connector, and in ChatGPT → Settings → Connectors → Add, use the URL https://mcp.secrevo.com/mcp. Both then walk you through an OAuth sign-in.

Sign in (OAuth 2.1)

The connector discovers the login server automatically from https://mcp.secrevo.com/.well-known/oauth-protected-resource, which points at your PrysmID instance (secrevo.auth.prysmid.com). You approve with the same account you use for the dashboard, and the connector receives a token scoped to your grants and nothing more. The MCP server holds no credential that can cross workspaces — every call is authorized by api.secrevo.com under your own identity. There is no plaintext-token config path; auth is OAuth only.

What the agent can do

Honest limits

The MCP connector is in pilot. If https://mcp.secrevo.com/mcp is not yet reachable for your account, use the CLI or SDK above in the meantime.

Reference & repos

Troubleshooting

`secrevo version` prints `0.1.0-dev`

You are running a local go build, not an installed release. Reinstall using one of the one-liners above.

`401 unauthorized` from the CLI or SDK

Either SECREVO_API_TOKEN is unset / typo'd, or the agent token was revoked. Mint a new one from app.secrevo.com/agents.

`403 forbidden` reading a secret you can see in the dashboard

The agent inherits the grants of its owner. If you can see a secret as a member but the agent can't, check that the owner — not just the workspace — has a grant on it. Owners can audit their agents' effective access from /agents.

Windows SmartScreen warns the installer is unsigned

The release binaries are not Authenticode-signed yet. Verify the SHA-256 against checksums.txt on the release page before running. Signing is on the roadmap.

Is there a Secrevo MCP server?

Yes — a remote MCP connector at https://mcp.secrevo.com (OAuth 2.1) for hosted agents like ChatGPT and Claude.ai. See Use Secrevo from a hosted agent (MCP) above. It is in pilot; for a headless machine or CI where you control the host, the CLI (secrevo enroll + secrevo run) or the Python SDK remain the direct path.

Something else

Open an issue at getsecrevo/cli/issues or write to [email protected].