{
  "markdown": "# Vruum MCP (`@vruum/mcp`)\n\n[![npm](https://img.shields.io/npm/v/@vruum/mcp)](https://www.npmjs.com/package/@vruum/mcp)\n[![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![registry](https://img.shields.io/badge/MCP%20registry-ai.vruum%2Fmcp-6E56CF)](https://registry.modelcontextprotocol.io)\n\nOfficial MCP access to [**Vruum**](https://vruum.ai), the AI revenue platform. Give your agent the whole revenue motion — research prospects, build pipeline, run email and LinkedIn outreach, triage replies, manage deals through close, and read Stripe-backed revenue truth — through **29 compound tools** rather than a sprawl of endpoints.\n\nThis package is a **stdio bridge**: it serves the tool surface locally (no credentials needed to introspect) and proxies execution to `https://api.vruum.ai/mcp` under your token. Every call is authorized server-side — the bridge grants no authority your Vruum account doesn't already have.\n\n> [!TIP]\n> **Using a client that supports remote MCP? Connect directly instead.**\n> Claude Code, Claude Desktop, Cursor, Codex and friends should point straight at `https://api.vruum.ai/mcp` (OAuth 2.1). Fewer moving parts and no token in an env var. This bridge exists for **stdio-only clients** and for **credential-free tool introspection**. See [vruum.ai/docs/mcp](https://vruum.ai/docs/mcp).\n\n## Quickstart\n\nYou need Node 20+ and a Vruum account. Create a personal access token in the web app under **Settings → API tokens** (`vk_live_…`).\n\n<details open>\n<summary><b>Claude Desktop / Claude Code</b> — <code>claude_desktop_config.json</code> or <code>.mcp.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"vruum\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@vruum/mcp\"],\n      \"env\": { \"VRUUM_MCP_TOKEN\": \"vk_live_…\" }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>Cursor</b> — <code>~/.cursor/mcp.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"vruum\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@vruum/mcp\"],\n      \"env\": { \"VRUUM_MCP_TOKEN\": \"vk_live_…\" }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>Codex CLI</b> — <code>~/.codex/config.toml</code></summary>\n\n```toml\n[mcp_servers.vruum]\ncommand = \"npx\"\nargs = [\"-y\", \"@vruum/mcp\"]\nenv = { VRUUM_MCP_TOKEN = \"vk_live_…\" }\n```\n</details>\n\n<details>\n<summary><b>Already use the Vruum CLI?</b> — no token needed here</summary>\n\n```sh\nnpx @vruum/cli\nvruum login --token vk_live_…\n```\n\nCredentials land in `~/.vruum/credentials` and the bridge picks them up automatically — omit the `env` block entirely.\n</details>\n\nVerify it works without configuring anything:\n\n```sh\nnpx -y @modelcontextprotocol/inspector --cli npx -y @vruum/mcp --method tools/list\n```\n\n## What you can ask for\n\nOnce connected, these are ordinary requests to your agent:\n\n| You say | What happens |\n| --- | --- |\n| *\"What should I work on today?\"* | `get_daily_briefing` — pending approvals, new replies, stalled deals, warm paths, one recommended next action |\n| *\"Review my outreach drafts\"* | `get_outreach_review` → you approve, edit, or reject each one |\n| *\"Research Acme Corp and tell me if they fit\"* | `research` — website, funding, careers signals, ICP match with reasoning |\n| *\"Find a warm intro to this person\"* | `find_warm_path` — separates verified paths from unverified connector candidates |\n| *\"Which campaigns are actually working?\"* | `get_campaign_outcomes` — contacted, replies, meetings booked, cohort-consistent |\n| *\"What's at risk in my pipeline?\"* | `inspect_pipeline` — the 5 most at-risk deals, risk-first |\n| *\"Draft a LinkedIn post about X\"* | `manage_content` — your agent writes it, you approve, Vruum schedules and publishes |\n\n> [!IMPORTANT]\n> **Your agent writes the prose — the server never does.** Outreach copy, replies, LinkedIn posts and comments surface to your harness as work items. Vruum schedules, gates, persists and sends; it has no server-side message generation. That's a deliberate design position, not a gap.\n\n## Tool surface\n\n29 compound tools — one per decision, so an agent never disambiguates between overlapping verbs. `read` is safe to call freely; `write` mutates; `destructive` can delete or archive.\n\n| Area | Tools |\n| --- | --- |\n| **Daily operating** | `get_daily_briefing` · `get_next_actions` · `inspect_pipeline` |\n| **Search & research** | `search` · `fetch` · `research` · `import_prospects` · `find_warm_path` |\n| **People** | `get_person_360` · `manage_person` |\n| **Outreach** | `get_outreach_review` · `manage_messages` · `manage_outreach` · `manage_relationship_action` |\n| **Engagement & content** | `get_engagement_review` · `manage_engagements` · `get_content_review` · `manage_content` |\n| **Campaigns & performance** | `manage_campaign` · `get_campaign_outcomes` · `get_performance_metrics` |\n| **Deals** | `get_deal_360` · `manage_deal` |\n| **Revenue** | `get_revenue` · `manage_revenue` |\n| **Accounts & knowledge** | `manage_account` · `manage_kb` |\n| **Config & skills** | `manage_settings` · `skill` |\n\nFull schemas, descriptions and MCP safety annotations live in [`tools.json`](tools.json) — generated from the live server definition, never hand-edited.\n\n## Configuration\n\n| Env var | Meaning | Default |\n| --- | --- | --- |\n| `VRUUM_MCP_TOKEN` | Vruum personal access token | falls back to `VRUUM_TOKEN`, then `~/.vruum/credentials` |\n| `VRUUM_MCP_URL` | Hosted MCP endpoint | `https://api.vruum.ai/mcp` |\n| `VRUUM_MCP_TIMEOUT_MS` | Per-call timeout — research and imports run long | `300000` |\n| `VRUUM_CONFIG_DIR` | Credentials directory | `~/.vruum` |\n\n## How it works\n\n```\nyour agent  ──stdio/JSON-RPC──▶  @vruum/mcp\n                                     │\n                    tools/list ──────┤  served locally from tools.json\n                                     │  (no network, no credentials)\n                                     │\n                    tools/call ──────┴──HTTPS+Bearer──▶  api.vruum.ai/mcp\n                                                          (authorized server-side)\n```\n\nListings are a **static snapshot** bundled at release. That's what makes credential-free introspection possible, and it means a newly added tool won't *appear* until the next release — calls still execute correctly, since they proxy through. A CI guard regenerates `tools.json` on every backend change, so the snapshot can be one release old but never silently wrong.\n\n## Safety and credentials\n\n- **Server-side authorization.** The bridge adds no permissions. Your token is exactly your Vruum account, and role/tenant checks happen on the server.\n- **No automatic retries.** A failed `tools/call` is never replayed. Many of these tools send outreach or spend money, and an ambiguous failure may mean the server already executed — a silent retry could double-send. The connection is discarded, the error says so, and your agent decides whether re-running is safe.\n- **Your token never leaves your machine** except as a `Bearer` header to `api.vruum.ai`.\n\n> [!WARNING]\n> **The bridge picks up ambient credentials.** With no `VRUUM_MCP_TOKEN` set it falls back to `~/.vruum/credentials`. If you are logged in with the Vruum CLI, then running this server — via the MCP Inspector, a client, or a script — executes **against your real account and real data**. Write tools will really write.\n>\n> To poke at it with no credentials, pass an explicit env that reaches the process:\n>\n> ```sh\n> env -i PATH=\"$PATH\" HOME=/tmp/empty node dist/index.js\n> ```\n>\n> Note that MCP clients following the SDK default only forward an allowlist (`HOME`, `PATH`, `SHELL`, `TERM`, `USER`, `LOGNAME`) to spawned servers — so setting `VRUUM_CONFIG_DIR` in your shell may be **stripped before it reaches the bridge**, while `HOME` survives and the credentials file is found anyway. Set credentials in the client's own `env` block instead.\n\n## Development\n\nThis repo is a **build artifact of the Vruum monorepo**, resynced automatically on release. `tools.json` is generated from the live server definition, so it cannot drift from what the hosted server exposes.\n\n```\nsrc/index.ts   the bridge — token resolution, static listings, proxied calls\ntools.json     generated tool surface (do not edit by hand)\ntest/          black-box tests: spawn the built binary, speak raw JSON-RPC\n```\n\n```sh\nnpm install\nnpm test        # builds, then runs the black-box suite\nnpm run typecheck\n```\n\nTests drive the built binary over stdin/stdout and assert **at the wire level** rather than through an SDK client — an SDK-mediated test hides protocol mistakes, since it will happily hand back a result object whether the server returned `result` or `error`. They cover the initialize handshake, credential-free listing, protocol-vs-execution error semantics, cursor rejection, capability declaration, and stdout hygiene.\n\n**Issues and PRs are welcome here.** Maintainers apply accepted changes upstream in the monorepo and they flow back on the next sync — so a merged fix here may appear as part of a sync commit rather than your original one. Changes to `tools.json` must come from the generator, not by hand.\n\n## Links\n\n[Vruum](https://vruum.ai) · [MCP docs](https://vruum.ai/docs/mcp) · [Getting started](https://vruum.ai/docs/getting-started) · [CLI reference](https://vruum.ai/docs/cli-reference)\n\nRegistry entry `ai.vruum/mcp` · Claude & Codex plugin [`vruum-gtm/skills`](https://github.com/vruum-gtm/skills)\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 9393,
  "sha": "772cbdd0f170bbc75aeef639918ccf1088563231f2014ae12cdbe20028827b45",
  "repo_slug": "vruum-gtm/mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ai_vruum_mcp_c73dfa09/readme"
}