Operate Vruum
The agent operator's guide to Vruum — install the CLI, authenticate, connect the MCP server, and drive your full revenue lifecycle from the AI chat you already use.
Single source — do not fork. This is the ONE canonical reference for how an AI agent operates Vruum. Downstream surfaces read this file; they do not copy it. The three consumers are:
llms-full.txt— the served, LLM-ingestible expansion ofllms.txt.- the
/docs/agentspage — the public docs route that renders this doc.- VRU-501
vruum init— the harness instruction emitter (writeInstructions) that wires this doc into a project's AGENTS.md.If you are about to paste this content somewhere, wire that surface to read
OPERATE.mdinstead. A forked copy will drift; a backend drift guard (backend/tests/test_operate_doc.py) fails CI if this doc falls out of sync with the live sources of truth (the curated MCP tool set,vruum_exec, and the CLI command groups).This is the customer/agent-facing sibling of the internal contributor guide
AGENTS.md.AGENTS.mdis for people building Vruum;OPERATE.mdis for agents operating Vruum.
Vruum exposes its full revenue platform — pipeline, people, deals, outreach, marketing, knowledge base — to agents through two interchangeable surfaces that hit the same authorized backend endpoints under your own token:
- The
vruumCLI — a headless binary with machine-stable--jsonoutput on every command. Best for local agent harnesses, CI, and shell pipelines. - The MCP server —
https://api.vruum.ai/mcp, a curated, default-loaded tool set plus avruum_execescape hatch that runs the same CLI server-side. Best for hosted MCP clients (Claude, ChatGPT, Cursor, …).
Neither surface can exceed your access: every call is authorized server-side by your token exactly as a normal user's would be.
1. Install & set up
Install the CLI
# npm (requires Node ≥ 22)
npm install -g @vruum/cli
# or run without installing
npx @vruum/cli --help
# Homebrew (macOS / Linux)
brew tap vruum-gtm/vruum && brew install vruum
# standalone binary (no Node)
curl -fsSL https://vruum.ai/install.sh | sh
Wire Vruum into your harness — vruum init
vruum init is the one-shot setup command. It detects every supported AI
coding harness in the current project and, for each, registers the MCP
(Bearer-authed against https://api.vruum.ai/mcp), links the client-safe
skills, and writes instruction files that point the harness at this doc.
vruum login # store your token first (see Auth below)
vruum init # wire MCP + skills + instructions into detected harnesses
vruum init --project-dir /path/to/project
init reuses the token from vruum login and writes a static
Authorization: Bearer MCP config (it avoids interactive-OAuth re-auth that
drops hosted MCP connections mid-session). Restart your harness afterwards to
load the Vruum MCP, then verify with a real tool call.
initis a local-CLI-only command — it writes config files on your host. It is deliberately not reachable through the server-sidevruum_exectool (see §4).
2. Authentication
vruum authenticates with a personal access token (PAT, vk_live_…).
Generate one in the Vruum web app under Settings → API tokens.
# Interactive — prompts for the token (hidden) and stores it in ~/.vruum
vruum login
# Non-interactive — pass it or pipe it in
vruum login --token vk_live_xxx
echo "vk_live_xxx" | vruum login
vruum whoami # confirm who you are authenticated as
vruum logout # remove stored credentials
Environment variables
| Variable | Purpose |
|---|---|
VRUUM_TOKEN | PAT to use (overrides the stored credentials file) |
VRUUM_API_URL | Override the API base URL (default https://api.vruum.ai) |
VRUUM_CONFIG_DIR | Override the config/credentials directory (default ~/.vruum) |
VRUUM_TOKEN makes the CLI fully stateless — ideal for CI and agent harnesses:
VRUUM_TOKEN=vk_live_xxx vruum deal list --json
login,logout,init, and theauthcommands (whoamiaside) are local-CLI only — they manage host credentials/config and are blocked from the server-sidevruum_execpath, which injects your token for you.
Operating on behalf of a company — --for-company
Operators managing multiple tenants scope any command to one company:
vruum --for-company <company_id_or_exact_name> deal list
- On the CLI,
--for-companyis sent as theX-Company-Idheader. - Over MCP, the same intent is the
for_companyparameter. Resolution is by UUID or case-insensitive EXACT company-name match — partial/substring matches are NOT supported (an ambiguous name raises400). - Access is membership-enforced server-side: the value resolves to a
user_company_idand the caller's membership incompany_usersis verified. A403means either the value matched no company or the caller is not a member of it.--for-companydoes not grant automatic operator powers — you get this access by being a member of each client company, the same row that grants any normal user access.
3. Calling Vruum from an agent
--json and exit codes
Every CLI command supports --json for stable, scriptable output. Without it,
commands print human-readable tables; with it, JSON suitable for jq, agents,
and CI.
vruum deal list --json | jq '.[] | select(.stage == "negotiation")'
vruum review outreach --json | jq '.items | length'
The process exit code is the agent's success signal:
| Exit | Meaning |
|---|---|
0 | Success |
3 | Auth failure — 401 Unauthorized / 403 Forbidden |
2 | Other 4xx (usage / validation / not-found) |
1 | 5xx server error or network failure |
Global flags
| Flag | Description |
|---|---|
--json | Emit machine-stable JSON instead of a table |
--for-company <id> | Act on behalf of a company (operator multi-tenant) |
--api-url <url> | Override the API base URL (local CLI only — rejected by vruum_exec; see §4) |
-V, --version | Print the version |
-h, --help | Show help for any command or subcommand |
4. The MCP surface
The MCP server at https://api.vruum.ai/mcp advertises the full operation set
(~139 tools) but default-loads a curated set to keep tool selection accurate
and context small. Tools outside the default set are deferred, not removed —
they stay advertised and callable; a Tool-Search-capable client keeps them out
of the model's default context until discovered.
Default-loaded tools
The curated default set covers the full daily loop — briefing → review → message/plan management → deal updates → core CRM writes:
| Area | Tools |
|---|---|
| Daily-loop dashboards | get_daily_briefing, get_next_actions, get_outreach_review, get_engagement_review, get_content_review, get_deal_360, get_person_360, inspect_pipeline, get_operator_dashboard, get_performance_metrics |
| Outreach actions | start_outreach, manage_message, bulk_manage_messages, manage_outreach_plan, generate_reply_draft |
| Deal actions | create_deal, update_deal, qualify_deal, record_deal_outcome, manage_deal_stakeholders |
| Marketing & engagement | manage_engagement, manage_content_post, manage_ad_campaign |
| Core CRM & research | create_manual_person, add_person_note, search_knowledge_base |
Tool Search (the deferred tail)
A Tool-Search-capable client (Anthropic Tool Search) registers the
tool_search_tool_bm25_20251119 server-tool in its top-level tools array and
mcp_toolset config. The model then BM25-searches the deferred tail at runtime
instead of loading all ~139 tools into context. Where a client ignores the
defer hint, nothing regresses — every tool stays loaded and callable.
vruum_exec — the full surface through one tool
vruum_exec is the escape hatch: it runs the bundled vruum CLI server-side
under your own auth, giving any MCP client the entire Vruum surface through a
single tenant-scoped tool — including the operations not in the default set.
-
Pass
argsas the CLI argv array, never a shell string:["deal", "list", "--json"],["whoami", "--json"]. -
Use
--jsoninsideargsfor machine-stable stdout. A non-zero CLI exit surfaces as a tool error carrying the CLI's stderr. -
for_companymirrors the operator multi-tenant UX (falls back to the request'sX-Company-Idheader when omitted). -
Blocked by design:
- credential/host commands (
login,logout,init, theauthcommands) — the server injects your token; the CLI must not manage creds. - local-file ingestion (
people import csv,ad creative upload,--content-file,@fileargs, absolute/~/..host paths) — these read files off the server's filesystem. - the
--api-urlhost-override flag —vruum_execruns under the token the server injects, so the destination host is server-controlled.--api-urlwould redirect that authenticated call to an arbitrary host and exfiltrate your token, so it is rejected (the server resolves the API URL itself;VRUUM_API_URLcannot be set by the caller either).
Run any blocked operation from the local CLI instead, where it acts under your own host and credentials.
- credential/host commands (
5. The vruum command tree
Run vruum <group> --help for the flags of any subcommand. (Derived from the
CLI source — cli/src/commands/*.command.ts — not from a hand-maintained list.)
| Group | Subcommands |
|---|---|
account | get · set-stage · set-state · note |
ad | list · create · approve · reject · pause · resume · budget · creative upload |
auth | login · logout · whoami (top-level; login/logout are local-CLI only) |
campaign | list · get · create · update · clone · delete · members |
company | list · get · create · update |
content | list · create · edit · schedule · publish · delete |
cta | list · create · update · delete · set-default |
deal | list · get · create · update · stage · won · lost · reopen · note · stakeholder (list/add/update/remove) |
engagement | queue · approve · edit · skip · bulk-approve · stats |
init | (no subcommands — wires MCP + skills + instructions into detected harnesses) |
kb | list · show · search · upsert · reindex · delete |
message | queue · approve · reject · edit · regenerate · bulk-approve · bulk-reject · bulk-edit |
people | list · get · create · update · archive · note · import (csv / sales-nav) |
plan | get · start · pause · resume · stop · touch · override · channels |
proposal | list · get · create · draft · send · cancel |
review | outreach · deals · engagement · content |
settings | get · set · team (members / invite / join) |
skills | list · show |
task | list · create · complete · delete |
Soft-delete-only: there is intentionally no deal delete or company delete. Deals retire via deal won / deal lost (revive with deal reopen);
companies archive via their account state. History is never hard-removed.
6. Common agent workflows
All recipes below use only real, supported CLI surfaces. (Note: there is no
vruum pipeline-fill command — pipeline-fill is a separate orchestration skill,
not a CLI verb.)
Queue triage
# Review the three approval queues
vruum review outreach --json | jq '.items | length'
vruum review engagement --json
vruum review content --json
vruum review deals --json
# Approve every pending outreach message non-interactively
vruum message queue --json | jq -r '.[].id' | xargs -I{} vruum message approve {}
# Engagement queue: approve, edit, or skip individual items
vruum engagement queue --json
vruum engagement approve <id>
vruum engagement bulk-approve --ids id1,id2,id3 # max 100 ids/batch
Prospect import
# From a CSV (auto-detects columns) — local CLI only (file read)
vruum people import csv ./prospects.csv
# From a Sales Navigator list or saved search
vruum people import sales-nav --search "<saved search>"
# Manual single person + a note
vruum people create --first-name Ada --last-name Lovelace --company "Analytical Engines"
vruum people note <personId> "Met at the conference"
Deal operations
vruum deal list --json | jq '.[] | {name, stage, amount}'
vruum deal create --name "Acme expansion" --company <companyId>
vruum deal update <dealId> --amount 50000
vruum deal stage <dealId> negotiation
vruum deal stakeholder add <dealId> <personId> --role champion
vruum deal won <dealId> # or: vruum deal lost <dealId>
vruum deal note <dealId> "Budget approved"
See also
AGENTS.md— internal contributor guide (building Vruum, not operating it).cli/README.md— the CLI package readme.backend/app/mcp/server.py—DEFAULT_LOADED_TOOLS,VRUUM_EXEC_TOOL_NAME,TOOL_SEARCH_TOOL_TYPE(the live sources of truth this doc is guarded against).