# mcpvault — full documentation

> Every doc page on https://mcpvault.online/docs, concatenated. Each section starts with `## URL: <path>` so an agent can route the user to the rendered version on the web.

Site: https://mcpvault.online
Source: https://github.com/Elraian/mcpvault
Index: https://mcpvault.online/llms.txt

---

## URL: /docs
<!-- Overview — What mcpvault is and how the docs are organised. -->

# mcpvault docs

mcpvault is a local, encrypted credential vault for AI agents. Store many accounts per service (Supabase, GitHub, Vercel, Stripe), point any MCP-compatible chat client at it once, then switch accounts mid-conversation by just asking.

These docs are also available as a single LLM-readable file at [/llms.txt](/llms.txt) (index) and [/llms-full.txt](/llms-full.txt) (every page concatenated). Paste either into your agent and it will know enough to walk you through the rest.

## Start here

- [Install](/docs/install): three commands, works on macOS, Windows, Linux.
- [Accounts](/docs/accounts): add, switch, rename, rotate tokens, remove. Multi-account workflows.
- [Backup & sync](/docs/backup): back up the vault file, restore on a new machine, sync between machines.

## Reference

- [CLI reference](/docs/cli): every `mcpvault` subcommand, flag, and environment variable.
- [Clients](/docs/clients): which chat clients work, where the config file lives, what to paste.
- [Services](/docs/services): Supabase, GitHub, Vercel, Stripe — token URLs, scopes, tools.
- [Security](/docs/security): how the vault is encrypted, where the key is cached, what the audit log records.
- [Troubleshooting](/docs/troubleshooting): common errors and fixes.

## How it fits together

```
~/.mcpvault/
├── vault.enc        # AES-256-GCM ciphertext of every credential
├── active.json      # which label is currently active per service (no secrets)
└── vault.log        # append-only audit log (no secrets)

OS keyring
└── mcpvault.session # derived key, cached by your OS login (cleared on lock)

MCP servers
├── mcpvault server          # control plane: list / find / activate accounts
└── mcpvault wrap <service>  # one wrapper per service the agent talks to
```

## License

[MIT](https://github.com/Elraian/mcpvault/blob/main/LICENSE). Source on [GitHub](https://github.com/Elraian/mcpvault).

---

## URL: /docs/cli
<!-- CLI reference — Every mcpvault subcommand, flag, and environment variable in one page. -->

# CLI reference

Every `mcpvault` subcommand, in one place. Run `mcpvault --help` or `mcpvault <cmd> --help` for the same content from your terminal.

## Vault lifecycle

### `mcpvault init`

Create a new encrypted vault at `~/.mcpvault/vault.enc`. Prompts for a master password (twice) and derives the encryption key with Argon2id.

```bash
mcpvault init
mcpvault init --vault-dir /custom/path   # override the default location
```

Fails if a vault already exists at the target path.

### `mcpvault unlock`

Re-prompt for the master password and re-cache the derived key in the OS keyring. Idempotent.

```bash
mcpvault unlock
```

### `mcpvault lock`

Zero the cached key. Next command re-prompts.

```bash
mcpvault lock
mcpvault lock --purge   # also remove the entry from the OS keyring entirely
```

### `mcpvault status`

One-line summary: vault path, locked / unlocked, account count, active labels per service.

```bash
mcpvault status
```

### `mcpvault doctor`

Run every health check in sequence. Tells you what's wrong and how to fix it.

```bash
mcpvault doctor                 # everything
mcpvault doctor --vault         # just vault integrity
mcpvault doctor --client cursor # one specific client config
mcpvault doctor --verbose       # full output, useful for issue reports
```

## Account management

See [Accounts](/docs/accounts) for the long-form workflows. Quick reference:

```bash
mcpvault add <service>                     # add a new account (interactive)
mcpvault list                              # all accounts, all services
mcpvault list <service>                    # accounts for one service
mcpvault active                            # currently active label per service
mcpvault use <service> <label>             # set the active label
mcpvault rename <service> <old> <new>      # rename an account
mcpvault rotate <service> <label>          # replace the token in place
mcpvault remove <service> <label>          # delete an account (asks for confirmation)
mcpvault describe <service> <label> <text> # change the description fuzzy search uses
```

## Client wiring

```bash
mcpvault setup                       # detect & configure every supported client
mcpvault setup --only cursor         # one client
mcpvault setup --only cursor,cline   # several clients
mcpvault setup --scope project       # write per-project config (Cursor, VS Code) instead of user-level
mcpvault setup --dry-run             # show what would be written, no file changes
mcpvault setup --reset               # remove mcpvault entries from every client config
```

## MCP servers (run by the chat client)

These are the binaries chat clients spawn. You normally never run them by hand — they're invoked from your client's MCP config.

### `mcpvault server`

Start the vault control-plane MCP server on stdio. Exposes `mcpvault_list_accounts`, `mcpvault_find_account`, `mcpvault_activate_account`, `mcpvault_get_active`, `mcpvault_vault_status`.

```bash
mcpvault server
```

### `mcpvault wrap <service>`

Start a per-service wrapper MCP server on stdio. Re-reads the active label from `active.json` on every tool call.

```bash
mcpvault wrap supabase
mcpvault wrap github
mcpvault wrap vercel
mcpvault wrap stripe
```

To pin a wrapper to a specific account (instead of following the active label):

```bash
mcpvault wrap supabase --account work
```

## Updates & maintenance

```bash
mcpvault --version                                    # current version
mcpvault update                                       # update via npm + re-run setup
mcpvault update --channel dev                         # opt into pre-release builds
mcpvault update --channel stable                      # back to stable
mcpvault migrate                                      # run pending vault migrations
mcpvault migrate --rollback                           # restore vault.enc.bak
mcpvault password rotate                              # change the master password
```

## Audit & introspection

```bash
mcpvault audit                                        # tail the audit log
mcpvault audit --since 24h                            # last 24 hours
mcpvault audit --service supabase                     # one service only
mcpvault export-redacted                              # dump vault structure (no secrets) for support
```

## Configuration

```bash
mcpvault config get <key>
mcpvault config set <key> <value>
mcpvault config list                                  # all keys
mcpvault config unset <key>
```

Common keys:

| Key | Default | What it does |
|---|---|---|
| `channel` | `stable` | Update channel (`stable` or `dev`). |
| `autolock` | `off` | Idle duration before vault auto-locks (`off`, `1h`, `8h`, `24h`). |
| `<service>.<label>.default_project` | unset | Default project ref / team id for a service+account. |

## Global flags

These work on every command:

| Flag | Description |
|---|---|
| `--help`, `-h` | Show help for the command. |
| `--version`, `-v` | Print mcpvault version. |
| `--vault-dir <path>` | Override the vault directory (default `~/.mcpvault`). |
| `--no-color` | Disable ANSI colour output. |
| `--json` | Print machine-readable output (where supported). |
| `--quiet`, `-q` | Suppress non-essential output. |

## Environment variables

| Var | Effect |
|---|---|
| `MCPVAULT_HOME` | Override the vault directory. Same as `--vault-dir`. |
| `MCPVAULT_KEYRING` | Set to `none` to skip OS-keyring caching (re-prompt every command). Useful for headless servers. |
| `MCPVAULT_NO_COLOR` | Set to any value to disable colour. Same as `--no-color`. |

---

## URL: /docs/accounts
<!-- Accounts — Add, switch, rename, rotate tokens, remove. Multi-account workflows. -->

# Account management

mcpvault is built around the idea that you have **many accounts per service**. This page covers everything you can do with them: add, switch, rename, rotate the token, remove.

## Add

```bash
mcpvault add <service>
```

Walks you through:

1. **Label** — short, alphanumeric + dashes. `work`, `personal`, `acme-prod`, `merel-staging`.
2. **Description** — what fuzzy search matches. Be specific: "Acme Corp prod, us-east-1" beats "production".
3. **Token** — pasted, hidden input. Validated live against the upstream API before save.
4. **Optional defaults** — e.g. default project ref for Supabase, team ID for Vercel.

You can run this as many times as you want per service.

## List

```bash
mcpvault list                # everything
mcpvault list supabase       # one service
mcpvault list --json         # machine-readable
```

Output groups accounts by service, with the active label marked:

```text
supabase
  ● work        Day job, prod + staging
  ○ personal    My side projects
  ○ client-x    Freelance client (us-east-1)

github
  ● personal    My personal repos
  ○ work        Org-scoped fine-grained PAT
```

## Switch the active account

From the CLI:

```bash
mcpvault use <service> <label>
```

From inside a chat client (the natural way):

> Switch to my **work** Supabase.

The agent calls `mcpvault_find_account` → `mcpvault_activate_account`. Each per-service wrapper re-reads `~/.mcpvault/active.json` on every tool call, so the switch takes effect on the next tool invocation. **No client restart, no MCP reconnect.**

## Rename a label

```bash
mcpvault rename <service> <old-label> <new-label>
```

Updates the vault and `active.json` atomically. The audit log keeps the old name for past entries (renames are not a rewrite).

## Update the description

```bash
mcpvault describe <service> <label> "Acme Corp prod (us-east-1)"
```

If you keep getting the wrong account selected by fuzzy search, this is the lever to pull.

## Rotate the token

Replace the credential without deleting the account or losing its label, description and defaults:

```bash
mcpvault rotate <service> <label>
```

Prompts for the new token. Validates against the upstream API. On success, the new token replaces the old one in-place. The audit log records `account-rotated`. The OS keyring cache is unaffected (the **vault** key didn't change — only the credential inside it did).

Use this when:

- The upstream service rotated your PAT (some providers force a 90-day rotation).
- You suspect the token leaked.
- You upgraded a fine-grained PAT to a broader scope.

If validation fails, the old token stays in place — never a half-rotated state.

## Remove an account

```bash
mcpvault remove <service> <label>
```

Asks for confirmation. If the account being removed was the active one, you're prompted to pick a replacement (or set `active = none`).

## Multi-account workflows

A common pattern for a freelance dev:

```bash
# personal stuff
mcpvault add supabase    # label: personal,    desc: my side projects
mcpvault add github      # label: personal,    desc: my personal repos
mcpvault add vercel      # label: personal,    desc: side project deploys

# day job
mcpvault add supabase    # label: work,        desc: day job, prod + staging
mcpvault add github      # label: work,        desc: company GitHub org

# clients
mcpvault add supabase    # label: client-acme, desc: Acme Corp production
mcpvault add github      # label: client-acme, desc: Acme repos (read-only PAT)
```

Then in chat:

> I'm working on Acme today. Switch all my accounts to client-acme and list the open PRs.

The agent activates `client-acme` for both Supabase and GitHub, then calls `github_list_pulls`.

## Tags (optional)

When adding an account you can set tags. They're not used by fuzzy search but are searchable from the CLI:

```bash
mcpvault add supabase    # tags: client, prod
mcpvault list --tag client
```

## Pinning a wrapper to one account

Normally a wrapper follows the active label. To make a wrapper always use a specific account regardless of `active.json`, pass `--account` in your client's MCP config:

```json
{
  "mcpServers": {
    "stripe-readonly": {
      "command": "mcpvault",
      "args": ["wrap", "stripe", "--account", "live-readonly"]
    }
  }
}
```

Useful if you want a single account to be unaffected by chat-driven switching.

---

## URL: /docs/backup
<!-- Backup & sync — Back up the vault, restore on a new machine, sync between machines. -->

# Backup & sync

The vault is one file: `~/.mcpvault/vault.enc`. That makes backup trivial. Sync is also possible — with caveats.

## What to back up

```text
~/.mcpvault/
├── vault.enc       # YOU NEED THIS — the encrypted credentials
├── active.json     # nice-to-have — preserves which label is active per service
└── vault.log       # optional — append-only audit log
```

The OS keyring entry (`mcpvault.session`) is **not** worth backing up. It's a cache of the derived key, machine-bound. New machine → re-enter master password → keyring re-populates.

You also need to remember (or store separately) your **master password**. Without it, the vault file is unrecoverable. There is no backdoor.

## Manual backup

```bash
# macOS / Linux
cp -a ~/.mcpvault ~/Backups/mcpvault-$(date +%Y%m%d)

# Windows (PowerShell)
$ts = Get-Date -Format "yyyyMMdd"
Copy-Item -Recurse "$env:USERPROFILE\.mcpvault" "$env:USERPROFILE\Backups\mcpvault-$ts"
```

The vault file is encrypted, so the backup is safe to drop into iCloud, Dropbox, OneDrive, S3, etc. without further encryption — but **don't symlink** the live `~/.mcpvault` folder into a sync drive (see "Don't symlink" below).

## Restore on the same machine

```bash
mcpvault lock
cp ~/Backups/mcpvault-20260601/vault.enc ~/.mcpvault/vault.enc
mcpvault unlock                    # prompts for master password
mcpvault status
```

## Move to a new laptop

1. **On the old machine**: copy `~/.mcpvault/vault.enc` to a USB key, encrypted backup, or 1Password Items.
2. **On the new machine**:

   ```bash
   npm install -g @elraian/mcpvault
   mkdir -p ~/.mcpvault
   cp /path/to/backup/vault.enc ~/.mcpvault/vault.enc
   mcpvault unlock                  # prompts for master password
   mcpvault setup                   # wire mcpvault into installed clients
   ```

3. Verify with `mcpvault status` and `mcpvault list`.

That's it. No re-adding accounts.

## Sync between active machines

There are three sane options. All of them keep the vault file as the single source of truth.

### 1. 1Password Items (recommended)

Store `vault.enc` as a file attachment in a 1Password Item. On each machine, when you change the vault, re-upload. Pull the file down on other machines as needed:

```bash
op read "op://Private/mcpvault/vault.enc" > ~/.mcpvault/vault.enc
mcpvault unlock
```

Pros: encrypted-at-rest already, version history in 1Password, no live sync conflicts. Cons: manual.

### 2. git-crypt (for the truly devops-brained)

Keep `~/.mcpvault` as a git repo with [git-crypt](https://github.com/AGWA/git-crypt) protecting the vault file. Push and pull as you would any code repo.

```bash
cd ~/.mcpvault
git init
git-crypt init
echo "vault.enc filter=git-crypt diff=git-crypt" >> .gitattributes
git add . && git commit -m "initial"
git remote add origin <your-private-repo>
git push -u origin main
```

On the new machine:

```bash
git-crypt unlock
mcpvault unlock
```

Pros: full version history, conflict detection. Cons: setup overhead, easy to forget to push.

### 3. Encrypted backup tool (Restic, Borg, rsync.net)

Standard encrypted backup workflows. Restore on demand.

## Don't symlink

A frequently-suggested but **bad** idea: symlink `~/.mcpvault` into Dropbox / iCloud / Google Drive.

```bash
# DON'T DO THIS
ln -s ~/Dropbox/mcpvault ~/.mcpvault
```

Why not:

- **Concurrent writes corrupt `active.json`.** Two machines saving at the same instant → file is half-written when sync triggers.
- **Sync conflicts on `vault.enc`.** Cloud sync creates conflict copies (`vault (raian's MacBook conflicted copy).enc`) which mcpvault can't read.
- **OS-specific extended attributes lost.** macOS adds `.DS_Store` and metadata that don't survive cross-platform sync.

If you want live sync, use the **1Password attachment** or **git-crypt** approaches above. Both are explicit about when a sync happens.

## Restoring on a fresh machine after losing the master password

You can't. By design.

If you have a vault backup but no master password, the file is encrypted with a key that can't be derived without the password. Argon2id with `m=64MiB, t=3` would take centuries to brute-force a strong password, and there is no "recovery key" baked in.

Workaround: **on every working machine, re-add accounts with the new master password** by re-running `mcpvault init` (which deletes the old vault) and `mcpvault add` for each service.

## Periodic backup with cron / Task Scheduler

Daily encrypted snapshot to S3:

```bash
# crontab entry, runs daily at 03:00
0 3 * * * cp ~/.mcpvault/vault.enc /tmp/vault-$(date +\%Y\%m\%d).enc && \
          aws s3 cp /tmp/vault-$(date +\%Y\%m\%d).enc s3://my-backup-bucket/mcpvault/ && \
          rm /tmp/vault-*.enc
```

The file is already AES-256-GCM encrypted, so S3-side encryption is belt-and-suspenders. Lifecycle the bucket to delete snapshots older than 90 days.

## What sync gives up

The OS keyring entry stays per-machine. So on every machine you'll re-enter the master password once after restoring `vault.enc` — that's it.

The audit log (`vault.log`) is also per-machine. If you want a unified audit trail across machines, ship `vault.log` to your SIEM or an S3 bucket from each machine independently.

---

## URL: /docs/install
<!-- Install — Three-command quickstart, platform notes, upgrade and uninstall. -->

# Install

Three commands and you're live. mcpvault ships as a single Node CLI on npm. Node 20 or newer is required.

## 1. Install the CLI

```bash
npm install -g @elraian/mcpvault
```

This puts `mcpvault` on your PATH globally. Aliases `mvault` and `mcp-vault` resolve to the same binary if you have muscle memory.

### Platform notes

**macOS / Linux**: requires Node 20+. If `npm` complains about permissions, you almost certainly have a system Node. Fix with [nvm](https://github.com/nvm-sh/nvm) or `brew install node`.

**Windows**: PowerShell 7 recommended. The vault uses DPAPI for keyring caching; no extra setup. If `mcpvault` is not on PATH after install, run `npm config get prefix` and add that directory to your user PATH.

**WSL**: works the same as Linux. Make sure your Windows-installed clients (Cursor, Claude Desktop) also see WSL's PATH if you want to call `mcpvault` from a Windows-native client; usually easier to install mcpvault inside Windows directly.

## 2. Initialise the vault

```bash
mcpvault init
```

Prompts for a master password (twice), derives an AES-256-GCM key with Argon2id, and writes an empty encrypted vault to `~/.mcpvault/vault.enc`. The master password is **never written to disk**. The derived session key is cached in your OS keyring (Keychain, DPAPI, or libsecret) so you only re-enter the password if you explicitly run `mcpvault lock` or sign out of the OS.

> If you forget the master password, the vault is unrecoverable. There is no backdoor.

## 3. Add accounts

```bash
mcpvault add supabase
mcpvault add github
mcpvault add vercel
mcpvault add stripe
```

Each command prompts for a label (e.g. `work`, `personal`, `acme-prod`), a description (used by fuzzy search), and the token. Tokens are validated against the upstream API on save — wrong format or expired tokens fail loud, before they hit your vault. See [Services](/docs/services) for token URLs and scopes per provider.

You can add as many accounts per service as you want. Labels are alphanumeric + dashes.

## 4. Wire it into your chat client

```bash
mcpvault setup
```

Auto-detects installed clients (Claude Code, Claude Desktop, Cursor, Cline, Windsurf) and writes the right config file for each. Restart the client and the tools appear.

For clients mcpvault doesn't auto-handle (Continue, Zed, Codex CLI, Gemini CLI, VS Code Copilot Chat, ChatGPT Desktop), copy the JSON from [Clients](/docs/clients) and paste it into the client's config file. One snippet, all clients.

## Verify

```bash
mcpvault doctor
```

Prints vault status (locked / unlocked), account counts per service, OS keyring availability, and which detected clients have mcpvault wired up. If anything's red, [Troubleshooting](/docs/troubleshooting) has the fix.

## Upgrade

### Check what you're on

```bash
mcpvault --version
```

### Check what's available

```bash
npm outdated -g @elraian/mcpvault
```

Prints `Current`, `Wanted` and `Latest`. If `Latest` is ahead of `Current`, there's a new release.

### Update

```bash
npm install -g @elraian/mcpvault@latest
```

mcpvault also ships a built-in updater that wraps the same npm command and re-runs `mcpvault setup` afterward (so any client config changes in the new version land automatically):

```bash
mcpvault update
```

### Channels

Stable is the default. To opt into pre-release builds (early features, faster bug fixes, more breakage):

```bash
mcpvault update --channel dev
```

To switch back:

```bash
mcpvault update --channel stable
```

`mcpvault config get channel` prints the channel currently in use.

### Pin to a specific version

For reproducible installs (CI, team projects):

```bash
npm install -g @elraian/mcpvault@1.4.2
```

### Verify after update

```bash
mcpvault --version
mcpvault doctor
```

`doctor` re-checks vault integrity, OS keyring availability, and every wired client's config. Anything red gets a one-line fix.

### Migrations

Vault file format is **forward-compatible across minor versions** — no migration step for routine updates. Major-version bumps (`1.x → 2.x`) ship a one-shot migration:

```bash
mcpvault migrate
```

The CLI prints a clear "migration needed" notice on first run after a major upgrade. Migrations are non-destructive — your previous vault is backed up to `~/.mcpvault/vault.enc.bak` before any rewrite. Restore with `mcpvault migrate --rollback` if anything goes sideways.

### Changelog

Per-release notes: [github.com/Elraian/mcpvault/releases](https://github.com/Elraian/mcpvault/releases). Subscribe via the **Watch → Custom → Releases** dropdown on the repo to get email notifications.

## Uninstall

```bash
npm uninstall -g @elraian/mcpvault
rm -rf ~/.mcpvault
```

On Windows: `Remove-Item -Recurse -Force "$env:USERPROFILE\.mcpvault"`. The OS keyring entry is named `mcpvault.session` — remove it manually if you want full cleanup.

---

## URL: /docs/clients
<!-- Clients — Compatibility table for every chat client and where its config lives. -->

# Clients

mcpvault works with any MCP-compatible chat client. `mcpvault setup` auto-wires the five most common ones; the rest take a single paste of the same JSON snippet.

## Auto-wired

Run `mcpvault setup` and these are configured for you. Restart the client to see the tools.

| Client | Status | macOS | Windows | Linux |
|---|---|---|---|---|
| [Claude Code](/docs/clients/claude-code) | auto | ~/.claude.json (or .mcp.json in the current project) | %USERPROFILE%\.claude.json (or .mcp.json in the current project) | ~/.claude.json (or .mcp.json in the current project) |
| [Claude Desktop](/docs/clients/claude-desktop) | auto | ~/Library/Application Support/Claude/claude_desktop_config.json | %APPDATA%\Claude\claude_desktop_config.json | ~/.config/Claude/claude_desktop_config.json |
| [Cursor](/docs/clients/cursor) | auto | <project>/.cursor/mcp.json (or ~/.cursor/mcp.json for global) | <project>\.cursor\mcp.json (or %USERPROFILE%\.cursor\mcp.json) | <project>/.cursor/mcp.json (or ~/.cursor/mcp.json for global) |
| [Cline](/docs/clients/cline) | auto | ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json | %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json | ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json |
| [Windsurf](/docs/clients/windsurf) | auto | ~/.codeium/windsurf/mcp_config.json | %USERPROFILE%\.codeium\windsurf\mcp_config.json | ~/.codeium/windsurf/mcp_config.json |

## Manual

Paste the snippet from each client's deep-dive page into the indicated config file, then restart.

| Client | Status | macOS | Windows | Linux |
|---|---|---|---|---|
| [Continue](/docs/clients/continue) | manual | ~/.continue/config.yaml | %USERPROFILE%\.continue\config.yaml | ~/.continue/config.yaml |
| [Zed](/docs/clients/zed) | manual | ~/.config/zed/settings.json | %APPDATA%\Zed\settings.json | ~/.config/zed/settings.json |
| [Codex CLI](/docs/clients/codex-cli) | manual | ~/.codex/config.toml | %USERPROFILE%\.codex\config.toml | ~/.codex/config.toml |
| [Gemini CLI](/docs/clients/gemini-cli) | manual | ~/.gemini/settings.json | %USERPROFILE%\.gemini\settings.json | ~/.gemini/settings.json |
| [VS Code Copilot Chat](/docs/clients/vscode-copilot) | manual | <project>/.vscode/mcp.json (or User Settings → MCP) | <project>\.vscode\mcp.json (or User Settings → MCP) | <project>/.vscode/mcp.json (or User Settings → MCP) |
| [ChatGPT Desktop](/docs/clients/chatgpt-desktop) | manual | Settings → Connectors → Add MCP server (UI only) | Settings → Connectors → Add MCP server (UI only) | Not yet supported. |

## Per-client deep dives

- [Claude Code](/docs/clients/claude-code) — Anthropic's official CLI agent for the terminal. mcpvault setup writes the project-scoped MCP config for you.
- [Claude Desktop](/docs/clients/claude-desktop) — Anthropic's macOS / Windows desktop app. mcpvault setup writes the JSON config for you.
- [Cursor](/docs/clients/cursor) — AI-first code editor. Project-scoped MCP config in .cursor/mcp.json. mcpvault setup detects active Cursor projects.
- [Cline](/docs/clients/cline) — VS Code extension that turns Copilot into an autonomous coding agent. mcpvault setup writes the Cline MCP settings file.
- [Windsurf](/docs/clients/windsurf) — Codeium's agentic IDE (Cascade). mcpvault setup writes the Windsurf MCP config.
- [Continue](/docs/clients/continue) — Open-source autopilot for VS Code and JetBrains. Continue uses YAML, not JSON, so paste the equivalent block.
- [Zed](/docs/clients/zed) — High-performance multiplayer editor. Zed uses its own settings.json with a context_servers block.
- [Codex CLI](/docs/clients/codex-cli) — OpenAI's open-source Codex CLI. MCP servers go under [mcp_servers] in config.toml.
- [Gemini CLI](/docs/clients/gemini-cli) — Google's open-source Gemini CLI. mcpServers block goes in settings.json.
- [VS Code Copilot Chat](/docs/clients/vscode-copilot) — GitHub Copilot Chat (agent mode) supports MCP via .vscode/mcp.json or the workspace settings.
- [ChatGPT Desktop](/docs/clients/chatgpt-desktop) — OpenAI's macOS / Windows ChatGPT app. MCP support is rolling out via Settings → Connectors.

---

## URL: /docs/services
<!-- Services — Supabase, GitHub, Vercel, Stripe — token URLs, scopes, exposed tools. -->

# Services

Every wrapper exposes a small, opinionated set of MCP tools — the operations you actually run from a chat, not the full surface area of the upstream API.

| Service | Tools | Token | Mode |
|---|---|---|---|
| [Supabase](/docs/services/supabase) | 5 tools | [token →](https://supabase.com/dashboard/account/tokens) | read + write |
| [GitHub](/docs/services/github) | 7 tools | [token →](https://github.com/settings/tokens?type=beta) | read + write |
| [Vercel](/docs/services/vercel) | 4 tools | [token →](https://vercel.com/account/tokens) | read-only |
| [Stripe](/docs/services/stripe) | 5 tools | [token →](https://dashboard.stripe.com/apikeys/create?type=restricted) | read-only |
| [Notion](/docs/services/notion) | 1 tools | [token →](https://www.notion.so/profile/integrations) | read + write |
| [Linear](/docs/services/linear) | 1 tools | [token →](https://linear.app/settings/api) | read + write |
| [PostgreSQL](/docs/services/postgres) | 1 tools | [token →](https://supabase.com/docs/guides/database/connecting-to-postgres) | read + write |
| [PostHog](/docs/services/posthog) | 1 tools | [token →](https://us.posthog.com/project/settings/personal-api-keys) | read + write |
| [Slack](/docs/services/slack) | 1 tools | [token →](https://api.slack.com/apps) | read + write |
| [Cloudflare](/docs/services/cloudflare) | 1 tools | [token →](https://dash.cloudflare.com/profile/api-tokens) | read + write |
| [Sentry](/docs/services/sentry) | 1 tools | [token →](https://sentry.io/settings/account/api/auth-tokens/) | read + write |
| [Brave Search](/docs/services/brave) | 1 tools | [token →](https://brave.com/search/api/) | read + write |
| [AWS](/docs/services/aws) | 1 tools | [token →](https://console.aws.amazon.com/iam/home#/security_credentials) | read + write |
| [Resend](/docs/services/resend) | 1 tools | [token →](https://resend.com/api-keys) | read + write |
| [Figma](/docs/services/figma) | 1 tools | [token →](https://www.figma.com/settings) | read + write |
| [Airtable](/docs/services/airtable) | 1 tools | [token →](https://airtable.com/create/tokens) | read + write |
| [Datadog](/docs/services/datadog) | 1 tools | [token →](https://app.datadoghq.com/organization-settings/api-keys) | read + write |
| [GitLab](/docs/services/gitlab) | 1 tools | [token →](https://gitlab.com/-/profile/personal_access_tokens) | read + write |
| [MongoDB](/docs/services/mongodb) | 1 tools | [token →](https://cloud.mongodb.com/v2/projects/) | read + write |
| [Discord](/docs/services/discord) | 1 tools | [token →](https://discord.com/developers/applications) | read + write |
| [HubSpot](/docs/services/hubspot) | 1 tools | [token →](https://app.hubspot.com/private-apps/) | read + write |
| [Mixpanel](/docs/services/mixpanel) | 1 tools | [token →](https://mixpanel.com/settings/project) | read + write |
| [OpenAI](/docs/services/openai) | 1 tools | [token →](https://platform.openai.com/api-keys) | read + write |

## Tools, all in one place

### Supabase

- `supabase_list_projects`
- `supabase_run_sql`
- `supabase_list_tables`
- `supabase_get_logs`
- `supabase_list_organizations`

[Setup →](/docs/services/supabase)

### GitHub

- `github_list_repos`
- `github_get_repo`
- `github_list_issues`
- `github_create_issue`
- `github_list_pulls`
- `github_get_file`
- `github_search_code`

[Setup →](/docs/services/github)

### Vercel

- `vercel_list_projects`
- `vercel_list_deployments`
- `vercel_get_deployment`
- `vercel_list_domains`

[Setup →](/docs/services/vercel)

### Stripe

- `stripe_list_customers`
- `stripe_retrieve_customer`
- `stripe_list_charges`
- `stripe_list_subscriptions`
- `stripe_retrieve`

[Setup →](/docs/services/stripe)

### Notion

- `see upstream — full Notion API surface`

[Setup →](/docs/services/notion)

### Linear

- `see upstream — full Linear GraphQL surface`

[Setup →](/docs/services/linear)

### PostgreSQL

- `see upstream — query, schema introspection`

[Setup →](/docs/services/postgres)

### PostHog

- `see upstream`

[Setup →](/docs/services/posthog)

### Slack

- `see upstream — channels, messages, users, reactions`

[Setup →](/docs/services/slack)

### Cloudflare

- `see upstream — zones, DNS, R2, Workers, KV, Cache, more`

[Setup →](/docs/services/cloudflare)

### Sentry

- `see upstream — issues, events, releases, projects`

[Setup →](/docs/services/sentry)

### Brave Search

- `see upstream — web search, news search`

[Setup →](/docs/services/brave)

### AWS

- `see upstream — every AWS service. SSO supported.`

[Setup →](/docs/services/aws)

### Resend

- `see upstream — send, list domains, list emails`

[Setup →](/docs/services/resend)

### Figma

- `see upstream — files, frames, components, nodes`

[Setup →](/docs/services/figma)

### Airtable

- `see upstream — records, fields, bases`

[Setup →](/docs/services/airtable)

### Datadog

- `see upstream — metrics, logs, monitors, dashboards, events`

[Setup →](/docs/services/datadog)

### GitLab

- `see upstream — issues, MRs, projects, files, search`

[Setup →](/docs/services/gitlab)

### MongoDB

- `see upstream — find, aggregate, list databases, list collections`

[Setup →](/docs/services/mongodb)

### Discord

- `see upstream — send/read messages, channels, users, reactions`

[Setup →](/docs/services/discord)

### HubSpot

- `see upstream — contacts, deals, companies, tickets`

[Setup →](/docs/services/hubspot)

### Mixpanel

- `see upstream — events, profiles, funnels, segments`

[Setup →](/docs/services/mixpanel)

### OpenAI

- `see upstream — completions, embeddings, files, batch, fine-tuning`

[Setup →](/docs/services/openai)

## Coming next

OAuth services (Gmail, Drive, Slack) with refresh-token logic, plus 1Password / Bitwarden source-of-truth adapters and multi-service "contexts" — switch all of Supabase + GitHub + Vercel + Stripe at once when you change client.

---

## URL: /docs/security
<!-- Security — Encryption, key caching, audit log, and the threat model. -->

# Security

mcpvault is local-first. Nothing leaves your machine. There is no server, no account, no telemetry. The threat model below is everything that can happen to your credentials.

## Encryption at rest

The vault file at `~/.mcpvault/vault.enc` is encrypted with **AES-256-GCM**. The encryption key is **never stored in clear** — it is derived from your master password using **Argon2id** with parameters tuned for interactive use:

```
Argon2id:
  memory cost:  64 MiB   (m=65536)
  time cost:    3        (t=3)
  parallelism:  1        (p=1)
  salt:         16 random bytes per vault
  output:       32 bytes (256-bit AES key)
```

These parameters are the [OWASP recommended baseline](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2id) for interactive logins. A modern laptop derives the key in ~400ms; a brute-forcer needs ~64 MiB of RAM per attempt, which destroys GPU and ASIC parallelism.

**The master password is never written to disk.** It exists only in the process that prompted for it, long enough to derive the key, then is zeroed.

## Key caching

To avoid re-prompting on every command, the **derived session key** (not the password) is cached in your OS keyring:

| OS | Backend | File |
|---|---|---|
| macOS | Keychain Services | login.keychain |
| Windows | DPAPI | tied to your Windows account |
| Linux | libsecret (gnome-keyring / kwallet) | ~/.local/share/keyrings/* |

The cached key is protected by your OS login. Without your OS password, neither the cache nor the vault file is useful.

Lock at any time:

```bash
mcpvault lock
```

This zeros the cached session key. Next command will re-prompt for the master password.

## Credentials never leave the wrapper

Wrappers run as separate processes. Their job is:

1. Read the active label from `~/.mcpvault/active.json` on every tool call.
2. Decrypt the credential for that label, in-memory only.
3. Call the upstream API (Supabase, GitHub, etc.).
4. Return the API's response to the chat client.

The chat client never sees the bearer token. It sees only the API result.

This means:

- An LLM cannot exfiltrate your token through prompt injection. It does not have the token.
- A compromised chat client cannot dump your credentials. They are not in its memory.
- Tool results are still readable by the LLM — sensitive data inside an API response (a customer email, a project name) is visible to the model. Treat tool results like normal LLM context.

## Audit log

Every tool call writes one line to `~/.mcpvault/vault.log`:

```
2026-05-15T14:22:31Z supabase work supabase_run_sql
2026-05-15T14:22:33Z github  personal github_list_repos
```

Format: timestamp, service, label, tool name. **No credentials, no arguments, no responses.** The log is append-only and rotates at 10 MB.

`mcpvault audit` pretty-prints recent activity. Useful for "what did the agent touch on Tuesday?" without exposing secrets.

## What is NOT in the threat model

- **Malware running as your user**: if an attacker has code execution as your OS user, they can read the OS keyring entry and decrypt the vault. mcpvault assumes your OS account is yours.
- **A coerced master password**: rubber-hose attacks defeat any encryption.
- **Token compromise upstream**: if Supabase leaks its database of tokens, mcpvault can't help. Rotate tokens periodically.
- **Stolen disk only (no OS login)**: the vault file alone is useless without the password. Adversary needs both files (vault.enc + the OS keyring entry) AND your OS password to skip the master-password prompt.

## Rotating the master password

```bash
mcpvault unlock          # if locked
mcpvault password rotate # prompts for current + new password
```

This re-derives a new key with a new salt, re-encrypts the vault, and updates the OS keyring entry. Existing wrapper processes are unaffected; they pick up the new key on next call.

---

## URL: /docs/troubleshooting
<!-- Troubleshooting — Common errors and their fixes, ordered by frequency. -->

# Troubleshooting

Common issues, in order of how often they hit people.

## "command not found: mcpvault"

The npm global bin directory isn't on your PATH.

**macOS / Linux**: run `npm config get prefix`. Add `<prefix>/bin` to your PATH in `~/.zshrc` or `~/.bashrc`:

```bash
export PATH="$(npm config get prefix)/bin:$PATH"
```

**Windows (PowerShell)**: run `npm config get prefix`. Add that path (no `/bin` suffix on Windows) to your user PATH:

```powershell
[Environment]::SetEnvironmentVariable("PATH", "$env:PATH;$(npm config get prefix)", "User")
```

Then open a fresh terminal.

## Vault prompts for password every command

The OS keyring isn't accessible. mcpvault falls back to a single-session prompt.

**macOS**: should "just work". If it doesn't, check that the binary is signed (`codesign -dv $(which mcpvault)`). Unsigned npm-installed binaries can't write to Keychain on some macOS versions; reinstall via `npm install -g @elraian/mcpvault --force`.

**Linux**: install `libsecret` and either `gnome-keyring` or `kwallet`. On headless servers, set `MCPVAULT_KEYRING=none` to skip the cache and re-prompt every time on purpose.

**Windows**: should "just work" via DPAPI. If it doesn't, you're likely on a domain-joined account with restrictive policy; ask IT or use `MCPVAULT_KEYRING=none`.

## Client doesn't see mcpvault tools after `mcpvault setup`

The client wasn't fully restarted, or it's looking in a different config file than mcpvault wrote to.

1. Quit the client **completely** — Cmd+Q on macOS, "Quit" from the tray icon on Windows. "Reload window" is not enough for most clients.
2. Run `mcpvault doctor --client <name>` to confirm the file mcpvault wrote is the one your client reads.
3. Check the client's MCP / "tools" panel for the actual error — most clients log "failed to spawn mcpvault" if the binary isn't on PATH.

If you're on Windows and the client is launched from a GUI shortcut, the client may not inherit the PATH from your shell. Reboot once after install, or reference `mcpvault` by absolute path in the config (`"command": "C:\\Users\\you\\AppData\\Roaming\\npm\\mcpvault.cmd"`).

## "wrong token format" when adding an account

mcpvault validates tokens live against the upstream API. Common causes:

- **Supabase**: must be a Personal Access Token (`sbp_...`), NOT the project's anon or service-role key.
- **GitHub**: fine-grained PATs (`github_pat_...`) and classic tokens (`ghp_...`) both work, but the token must have `repo` and `read:org` scopes at minimum.
- **Vercel**: any token works, but if you select the wrong team scope, lookups will be empty.
- **Stripe**: must be a Restricted Key (`rk_live_...` or `rk_test_...`). Secret keys (`sk_...`) are rejected by the wrapper.

See [Services](/docs/services) for the exact token URL and scopes per provider.

## "permission denied" on `~/.mcpvault` (Linux / WSL)

The directory was created by sudo at some point. Reclaim ownership:

```bash
sudo chown -R "$USER:$USER" ~/.mcpvault
chmod 700 ~/.mcpvault
chmod 600 ~/.mcpvault/vault.enc
```

Never run `mcpvault` with `sudo`. The vault belongs to your user, not root.

## Vault locked after reboot

By design, the OS keyring sometimes evicts the cached key — for example, after a Windows feature update or a macOS keychain reset. Run `mcpvault unlock` to re-prompt for the master password and re-cache the key.

If this happens **every** boot, your OS isn't persisting keyring entries across sessions. On Linux, ensure `gnome-keyring-daemon` is autostarted. On macOS, check that you're logging into the same account that created the entry.

## Tools work, but agent picks the wrong account

Two causes:

1. **Active label isn't what you think.** Run `mcpvault active` to see what's currently selected per service.
2. **Description is too generic.** Fuzzy search matches against the description field. If three accounts have description "production", the agent will guess. Make descriptions specific: "Acme Corp prod (us-east-1)" beats "production".

## Resetting everything

Delete the vault and start over (you will lose all stored credentials):

```bash
mcpvault lock
rm -rf ~/.mcpvault
mcpvault init
```

The OS keyring entry is named `mcpvault.session`; remove it manually if you want a truly clean slate.

## Still stuck

Open an issue with the output of `mcpvault doctor --verbose`: [github.com/Elraian/mcpvault/issues](https://github.com/Elraian/mcpvault/issues).

---

## URL: /docs/clients/claude-code
<!-- Claude Code — Anthropic's official CLI agent for the terminal. mcpvault setup writes the project-scoped MCP config for you. -->

# Claude Code

Anthropic's official CLI agent for the terminal. mcpvault setup writes the project-scoped MCP config for you.

## Status

**Auto-wired** — `mcpvault setup` writes the config file for you.

## Config file

**macOS**: `~/.claude.json (or .mcp.json in the current project)`

**Windows**: `%USERPROFILE%\.claude.json (or .mcp.json in the current project)`

**Linux**: `~/.claude.json (or .mcp.json in the current project)`

## Setup

Run once from any directory:

```bash
mcpvault setup
```

mcpvault detects Claude Code and writes the config file above. To force just this client:

```bash
mcpvault setup --client claude-code
```

## Restart

Quit and relaunch claude (or close the active session). Tools register on next start.

## Notes

- Run `mcpvault setup` from any directory; it detects Claude Code and writes the user-scope config.
- For project-only scope, run `mcpvault setup --project` inside the repo root.

## Verify

Run `mcpvault doctor --client claude-code` to confirm Claude Code sees the vault.

---

## URL: /docs/clients/claude-desktop
<!-- Claude Desktop — Anthropic's macOS / Windows desktop app. mcpvault setup writes the JSON config for you. -->

# Claude Desktop

Anthropic's macOS / Windows desktop app. mcpvault setup writes the JSON config for you.

## Status

**Auto-wired** — `mcpvault setup` writes the config file for you.

## Config file

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`

**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

**Linux**: `~/.config/Claude/claude_desktop_config.json`

## Setup

Run once from any directory:

```bash
mcpvault setup
```

mcpvault detects Claude Desktop and writes the config file above. To force just this client:

```bash
mcpvault setup --client claude-desktop
```

## Restart

Fully quit Claude Desktop (Cmd+Q on macOS, right-click tray icon → Quit on Windows) and relaunch. Reload alone does not pick up new servers.

## Verify

Run `mcpvault doctor --client claude-desktop` to confirm Claude Desktop sees the vault.

---

## URL: /docs/clients/cursor
<!-- Cursor — AI-first code editor. Project-scoped MCP config in .cursor/mcp.json. mcpvault setup detects active Cursor projects. -->

# Cursor

AI-first code editor. Project-scoped MCP config in .cursor/mcp.json. mcpvault setup detects active Cursor projects.

## Status

**Auto-wired** — `mcpvault setup` writes the config file for you.

## Config file

**macOS**: `<project>/.cursor/mcp.json (or ~/.cursor/mcp.json for global)`

**Windows**: `<project>\.cursor\mcp.json (or %USERPROFILE%\.cursor\mcp.json)`

**Linux**: `<project>/.cursor/mcp.json (or ~/.cursor/mcp.json for global)`

## Setup

Run once from any directory:

```bash
mcpvault setup
```

mcpvault detects Cursor and writes the config file above. To force just this client:

```bash
mcpvault setup --client cursor
```

## Restart

Cursor → Settings → MCP → toggle the server off/on, or restart Cursor. Reloading the window is usually enough.

## Notes

- Cursor expects the same `mcpServers` shape as Claude Desktop.
- If you want the same vault across every project, use the `~/.cursor/mcp.json` global file.

## Verify

Run `mcpvault doctor --client cursor` to confirm Cursor sees the vault.

---

## URL: /docs/clients/cline
<!-- Cline — VS Code extension that turns Copilot into an autonomous coding agent. mcpvault setup writes the Cline MCP settings file. -->

# Cline

VS Code extension that turns Copilot into an autonomous coding agent. mcpvault setup writes the Cline MCP settings file.

## Status

**Auto-wired** — `mcpvault setup` writes the config file for you.

## Config file

**macOS**: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`

**Windows**: `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`

**Linux**: `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`

## Setup

Run once from any directory:

```bash
mcpvault setup
```

mcpvault detects Cline and writes the config file above. To force just this client:

```bash
mcpvault setup --client cline
```

## Restart

Reload VS Code (Cmd/Ctrl+Shift+P → 'Developer: Reload Window') or close and reopen the Cline panel.

## Verify

Run `mcpvault doctor --client cline` to confirm Cline sees the vault.

---

## URL: /docs/clients/windsurf
<!-- Windsurf — Codeium's agentic IDE (Cascade). mcpvault setup writes the Windsurf MCP config. -->

# Windsurf

Codeium's agentic IDE (Cascade). mcpvault setup writes the Windsurf MCP config.

## Status

**Auto-wired** — `mcpvault setup` writes the config file for you.

## Config file

**macOS**: `~/.codeium/windsurf/mcp_config.json`

**Windows**: `%USERPROFILE%\.codeium\windsurf\mcp_config.json`

**Linux**: `~/.codeium/windsurf/mcp_config.json`

## Setup

Run once from any directory:

```bash
mcpvault setup
```

mcpvault detects Windsurf and writes the config file above. To force just this client:

```bash
mcpvault setup --client windsurf
```

## Restart

In Windsurf: Cascade panel → settings cog → Refresh. Or restart Windsurf entirely.

## Verify

Run `mcpvault doctor --client windsurf` to confirm Windsurf sees the vault.

---

## URL: /docs/clients/continue
<!-- Continue — Open-source autopilot for VS Code and JetBrains. Continue uses YAML, not JSON, so paste the equivalent block. -->

# Continue

Open-source autopilot for VS Code and JetBrains. Continue uses YAML, not JSON, so paste the equivalent block.

## Status

**Manual** — paste the snippet below into the indicated config file.

## Config file

**macOS**: `~/.continue/config.yaml`

**Windows**: `%USERPROFILE%\.continue\config.yaml`

**Linux**: `~/.continue/config.yaml`

## Setup

Open the config file above, paste the block below, save:

```yaml
# Append under `mcpServers:` in ~/.continue/config.yaml
mcpServers:
  - name: vault
    command: mcpvault
    args: ["server"]
  - name: supabase
    command: mcpvault
    args: ["wrap", "supabase"]
  - name: github
    command: mcpvault
    args: ["wrap", "github"]
  - name: vercel
    command: mcpvault
    args: ["wrap", "vercel"]
  - name: stripe
    command: mcpvault
    args: ["wrap", "stripe"]
```

## Restart

Reload your editor window. Continue rereads config.yaml on activation.

## Notes

- Continue's MCP support is YAML, not JSON. The fields map 1:1 to the Claude Desktop format.

## Verify

Run `mcpvault doctor --client continue` to confirm Continue sees the vault.

---

## URL: /docs/clients/zed
<!-- Zed — High-performance multiplayer editor. Zed uses its own settings.json with a context_servers block. -->

# Zed

High-performance multiplayer editor. Zed uses its own settings.json with a context_servers block.

## Status

**Manual** — paste the snippet below into the indicated config file.

## Config file

**macOS**: `~/.config/zed/settings.json`

**Windows**: `%APPDATA%\Zed\settings.json`

**Linux**: `~/.config/zed/settings.json`

## Setup

Open the config file above, paste the block below, save:

```json
// Add under the top-level object in ~/.config/zed/settings.json
{
  "context_servers": {
    "vault":    { "command": { "path": "mcpvault", "args": ["server"] } },
    "supabase": { "command": { "path": "mcpvault", "args": ["wrap", "supabase"] } },
    "github":   { "command": { "path": "mcpvault", "args": ["wrap", "github"] } },
    "vercel":   { "command": { "path": "mcpvault", "args": ["wrap", "vercel"] } },
    "stripe":   { "command": { "path": "mcpvault", "args": ["wrap", "stripe"] } }
  }
}
```

## Restart

zed: reload (command palette) or fully restart Zed.

## Notes

- Zed calls them 'context_servers' instead of 'mcpServers' and nests the command + args under a `command` object.

## Verify

Run `mcpvault doctor --client zed` to confirm Zed sees the vault.

---

## URL: /docs/clients/codex-cli
<!-- Codex CLI — OpenAI's open-source Codex CLI. MCP servers go under [mcp_servers] in config.toml. -->

# Codex CLI

OpenAI's open-source Codex CLI. MCP servers go under [mcp_servers] in config.toml.

## Status

**Manual** — paste the snippet below into the indicated config file.

## Config file

**macOS**: `~/.codex/config.toml`

**Windows**: `%USERPROFILE%\.codex\config.toml`

**Linux**: `~/.codex/config.toml`

## Setup

Open the config file above, paste the block below, save:

```yaml
# Append to ~/.codex/config.toml
[mcp_servers.vault]
command = "mcpvault"
args = ["server"]

[mcp_servers.supabase]
command = "mcpvault"
args = ["wrap", "supabase"]

[mcp_servers.github]
command = "mcpvault"
args = ["wrap", "github"]

[mcp_servers.vercel]
command = "mcpvault"
args = ["wrap", "vercel"]

[mcp_servers.stripe]
command = "mcpvault"
args = ["wrap", "stripe"]
```

## Restart

No restart required. Codex CLI rereads config.toml at the start of each session.

## Verify

Run `mcpvault doctor --client codex-cli` to confirm Codex CLI sees the vault.

---

## URL: /docs/clients/gemini-cli
<!-- Gemini CLI — Google's open-source Gemini CLI. mcpServers block goes in settings.json. -->

# Gemini CLI

Google's open-source Gemini CLI. mcpServers block goes in settings.json.

## Status

**Manual** — paste the snippet below into the indicated config file.

## Config file

**macOS**: `~/.gemini/settings.json`

**Windows**: `%USERPROFILE%\.gemini\settings.json`

**Linux**: `~/.gemini/settings.json`

## Setup

Open the config file above, paste the block below, save:

```json
{
  "mcpServers": {
    "vault":    { "command": "mcpvault", "args": ["server"] },
    "supabase": { "command": "mcpvault", "args": ["wrap", "supabase"] },
    "github":   { "command": "mcpvault", "args": ["wrap", "github"] },
    "vercel":   { "command": "mcpvault", "args": ["wrap", "vercel"] },
    "stripe":   { "command": "mcpvault", "args": ["wrap", "stripe"] }
  }
}
```

## Restart

Quit and relaunch the gemini CLI. Tools register at session start.

## Notes

- Gemini CLI uses the same `mcpServers` shape as Claude Desktop. Drop the snippet straight in.

## Verify

Run `mcpvault doctor --client gemini-cli` to confirm Gemini CLI sees the vault.

---

## URL: /docs/clients/vscode-copilot
<!-- VS Code Copilot Chat — GitHub Copilot Chat (agent mode) supports MCP via .vscode/mcp.json or the workspace settings. -->

# VS Code Copilot Chat

GitHub Copilot Chat (agent mode) supports MCP via .vscode/mcp.json or the workspace settings.

## Status

**Manual** — paste the snippet below into the indicated config file.

## Config file

**macOS**: `<project>/.vscode/mcp.json (or User Settings → MCP)`

**Windows**: `<project>\.vscode\mcp.json (or User Settings → MCP)`

**Linux**: `<project>/.vscode/mcp.json (or User Settings → MCP)`

## Setup

Open the config file above, paste the block below, save:

```json
// Save as .vscode/mcp.json in your project
{
  "servers": {
    "vault":    { "command": "mcpvault", "args": ["server"] },
    "supabase": { "command": "mcpvault", "args": ["wrap", "supabase"] },
    "github":   { "command": "mcpvault", "args": ["wrap", "github"] },
    "vercel":   { "command": "mcpvault", "args": ["wrap", "vercel"] },
    "stripe":   { "command": "mcpvault", "args": ["wrap", "stripe"] }
  }
}
```

## Restart

Reload the VS Code window (Cmd/Ctrl+Shift+P → 'Developer: Reload Window').

## Notes

- Copilot Chat calls the wrapper key `servers`, not `mcpServers`.
- Make sure agent mode is enabled in Copilot Chat settings.

## Verify

Run `mcpvault doctor --client vscode-copilot` to confirm VS Code Copilot Chat sees the vault.

---

## URL: /docs/clients/chatgpt-desktop
<!-- ChatGPT Desktop — OpenAI's macOS / Windows ChatGPT app. MCP support is rolling out via Settings → Connectors. -->

# ChatGPT Desktop

OpenAI's macOS / Windows ChatGPT app. MCP support is rolling out via Settings → Connectors.

## Status

**Manual** — paste the snippet below into the indicated config file.

## Config file

**macOS**: `Settings → Connectors → Add MCP server (UI only)`

**Windows**: `Settings → Connectors → Add MCP server (UI only)`

**Linux**: `Not yet supported.`

## Setup

Open the config file above, paste the block below, save:

```yaml
# In Settings → Connectors → Add MCP server, fill the fields:
Name:    mcpvault
Command: mcpvault
Args:    server

# Repeat once per wrapper you want exposed:
Name:    supabase
Command: mcpvault
Args:    wrap supabase
```

## Restart

Toggle the server off and on in Settings → Connectors, or quit and relaunch ChatGPT.

## Notes

- ChatGPT Desktop does not yet accept a config file paste. Add each server through the GUI.

## Verify

Run `mcpvault doctor --client chatgpt-desktop` to confirm ChatGPT Desktop sees the vault.

---

## URL: /docs/services/supabase
<!-- Supabase — Read + run-SQL access to your Supabase projects across multiple organizations. -->

# Supabase

Read + run-SQL access to your Supabase projects across multiple organizations.

## Get a token

Generate a **Personal Access Token (sbp_…)** at [https://supabase.com/dashboard/account/tokens](https://supabase.com/dashboard/account/tokens).

## Recommended scopes

- Use a Personal Access Token, not the project's anon/service-role key.
- Tokens inherit your account's permissions on every org you belong to.
- Generate a separate token per work context (personal vs. client) so you can rotate independently.

## Add it to the vault

```bash
mcpvault add supabase
```

Example session:

```text
$ mcpvault add supabase
Label: work
Description: Day job, prod + staging
Personal Access Token: sbp_••••••••••••••••••••
✓ Validated against api.supabase.com (2 organizations, 7 projects)
✓ Saved.
```

## Tools exposed

- `supabase_list_projects`
- `supabase_run_sql`
- `supabase_list_tables`
- `supabase_get_logs`
- `supabase_list_organizations`

## Notes

- supabase_run_sql will execute arbitrary SQL against the active project. Treat it like prod credentials.

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Supabase account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/github
<!-- GitHub — Repo + issue + PR + code-search access across personal and org accounts. -->

# GitHub

Repo + issue + PR + code-search access across personal and org accounts.

## Get a token

Generate a **Fine-grained Personal Access Token** at [https://github.com/settings/tokens?type=beta](https://github.com/settings/tokens?type=beta).

## Recommended scopes

- Use fine-grained PATs (not classic).
- Repository permissions: Contents (Read), Issues (Read & write), Pull requests (Read & write), Metadata (Read).
- Account permissions: leave default.
- Set an expiry — 90 days is a sensible cap.

## Add it to the vault

```bash
mcpvault add github
```

Example session:

```text
$ mcpvault add github
Label: personal
Description: Solo projects on github.com/elraian
Fine-grained PAT (github_pat_…): github_pat_••••••••
✓ Validated against api.github.com (rate limit: 5000/h)
✓ Saved.
```

## Tools exposed

- `github_list_repos`
- `github_get_repo`
- `github_list_issues`
- `github_create_issue`
- `github_list_pulls`
- `github_get_file`
- `github_search_code`

## Notes

- Classic PATs work too but expose the full account. Prefer fine-grained.
- If you have multiple orgs, add one mcpvault account per org instead of granting one token to all.

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** GitHub account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/vercel
<!-- Vercel — Project + deployment + domain inspection. Read-only by design (no triggering deploys). -->

# Vercel

Project + deployment + domain inspection. Read-only by design (no triggering deploys).

> This wrapper is **read-only by design**. No writes, no destructive operations.

## Get a token

Generate a **Vercel Token** at [https://vercel.com/account/tokens](https://vercel.com/account/tokens).

## Recommended scopes

- Generate a token scoped to a single team if you want least-privilege per account.
- Set an expiration — Vercel allows 1 day, 1 week, 1 month, no expiry.

## Add it to the vault

```bash
mcpvault add vercel
```

Example session:

```text
$ mcpvault add vercel
Label: work
Description: Acme team on vercel.com
Vercel Token: ••••••••••••••••••••
Team slug (optional): acme
✓ Validated against api.vercel.com (team: acme, 12 projects)
✓ Saved.
```

## Tools exposed

- `vercel_list_projects`
- `vercel_list_deployments`
- `vercel_get_deployment`
- `vercel_list_domains`

## Notes

- Vercel tokens grant write access to the team. mcpvault's wrapper exposes only read endpoints, but rotate the token if you suspect compromise.

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Vercel account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/stripe
<!-- Stripe — Read-only customer / charge / subscription lookups. By design, no writes. -->

# Stripe

Read-only customer / charge / subscription lookups. By design, no writes.

> This wrapper is **read-only by design**. No writes, no destructive operations.

## Get a token

Generate a **Restricted API Key** at [https://dashboard.stripe.com/apikeys/create?type=restricted](https://dashboard.stripe.com/apikeys/create?type=restricted).

## Recommended scopes

- Use a Restricted Key, not the secret key.
- Set every resource permission to Read or None. Customers, Charges, Subscriptions, Invoices: Read. Everything else: None.
- Use the Test Mode key for non-prod accounts.

## Add it to the vault

```bash
mcpvault add stripe
```

Example session:

```text
$ mcpvault add stripe
Label: work-live
Description: Acme production Stripe
Restricted API Key (rk_live_…): rk_live_••••••••
✓ Validated against api.stripe.com (account: acct_••••, 4 read scopes)
✓ Saved.
```

## Tools exposed

- `stripe_list_customers`
- `stripe_retrieve_customer`
- `stripe_list_charges`
- `stripe_list_subscriptions`
- `stripe_retrieve`

## Notes

- mcpvault's Stripe wrapper has no create_charge, no refund, no update_subscription. Money does not move.
- If you need write operations, fork the wrapper. Don't add them upstream.

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Stripe account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/notion
<!-- Notion — Full Notion API surface (pages, databases, blocks, search) via Notion's official MCP server. -->

# Notion

Full Notion API surface (pages, databases, blocks, search) via Notion's official MCP server.

## Get a token

Generate a **Internal Integration Secret (ntn_…)** at [https://www.notion.so/profile/integrations](https://www.notion.so/profile/integrations).

## Recommended scopes

- Create an Internal Integration in your workspace.
- Grant page access from each page → Add connections.

## Add it to the vault

```bash
mcpvault add notion
```

Example session:

```text
$ mcpvault add notion
Label: work
Secret: ntn_••••
✓ Validated as workspace "Acme" (owner: Alice)
✓ Saved.
```

## Tools exposed

- `see upstream — full Notion API surface`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Notion account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/linear
<!-- Linear — Full Linear GraphQL surface (issues, projects, comments, teams) per organization. -->

# Linear

Full Linear GraphQL surface (issues, projects, comments, teams) per organization.

## Get a token

Generate a **Personal API key (lin_api_…)** at [https://linear.app/settings/api](https://linear.app/settings/api).

## Recommended scopes

- Personal API keys inherit your account permissions across all teams you belong to.

## Add it to the vault

```bash
mcpvault add linear
```

Example session:

```text
$ mcpvault add linear
Label: aiside
API Key: lin_api_••••
✓ Validated as "AISIDE" (you: Raian)
✓ Saved.
```

## Tools exposed

- `see upstream — full Linear GraphQL surface`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Linear account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/postgres
<!-- PostgreSQL — Run SQL against any Postgres database. Multi-account = multi-database (dev/staging/prod, per-client). -->

# PostgreSQL

Run SQL against any Postgres database. Multi-account = multi-database (dev/staging/prod, per-client).

## Get a token

Generate a **Connection string (postgresql://…)** at [https://supabase.com/docs/guides/database/connecting-to-postgres](https://supabase.com/docs/guides/database/connecting-to-postgres).

## Recommended scopes

- Use a least-privilege role (read-only recommended for unattended agents).

## Add it to the vault

```bash
mcpvault add postgres
```

Example session:

```text
$ mcpvault add postgres
Label: acme-prod
Connection string: postgresql://••••
✓ Parsed: acme-prod@db.acme.com/main
✓ Saved.
```

## Tools exposed

- `see upstream — query, schema introspection`

## Notes

- Each account is one connection string. Add 'prod', 'staging', 'dev' separately and switch via the agent.

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** PostgreSQL account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/posthog
<!-- PostHog — Events, insights, surveys, persons per PostHog project. Multi-project = multi-account. -->

# PostHog

Events, insights, surveys, persons per PostHog project. Multi-project = multi-account.

## Get a token

Generate a **Personal API key (phx_…)** at [https://us.posthog.com/project/settings/personal-api-keys](https://us.posthog.com/project/settings/personal-api-keys).

## Recommended scopes

- Personal API key with read scope on events + insights at minimum.
- Each account is one Project ID.

## Add it to the vault

```bash
mcpvault add posthog
```

Example session:

```text
$ mcpvault add posthog
Label: aiside
API Key: phx_••••
Project ID: 12345
✓ Validated as "Alice @ AISIDE"
✓ Saved.
```

## Tools exposed

- `see upstream`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** PostHog account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/slack
<!-- Slack — Channels, messages, users, reactions via Slack's official reference MCP server. -->

# Slack

Channels, messages, users, reactions via Slack's official reference MCP server.

## Get a token

Generate a **Bot User OAuth Token (xoxb-…)** at [https://api.slack.com/apps](https://api.slack.com/apps).

## Recommended scopes

- Create a Slack app, install to workspace, copy the Bot User OAuth Token.
- Scopes depend on what you want the agent to do.

## Add it to the vault

```bash
mcpvault add slack
```

Example session:

```text
$ mcpvault add slack
Label: work
Bot Token: xoxb-••••
✓ Validated as workspace "Acme" (bot: agent)
✓ Saved.
```

## Tools exposed

- `see upstream — channels, messages, users, reactions`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Slack account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/cloudflare
<!-- Cloudflare — Zones, DNS, R2, Workers, KV via Cloudflare's official MCP server. -->

# Cloudflare

Zones, DNS, R2, Workers, KV via Cloudflare's official MCP server.

## Get a token

Generate a **Custom API token** at [https://dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens).

## Recommended scopes

- Use Custom Token with only the permissions you need.
- Zone:Read at minimum; add Workers/R2/DNS as needed.

## Add it to the vault

```bash
mcpvault add cloudflare
```

Example session:

```text
$ mcpvault add cloudflare
Label: main
API Token: ••••
Account id: optional
✓ Validated (status: active)
✓ Saved.
```

## Tools exposed

- `see upstream — zones, DNS, R2, Workers, KV, Cache, more`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Cloudflare account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/sentry
<!-- Sentry — Issues, events, releases, projects via Sentry's official MCP server. Multi-org. -->

# Sentry

Issues, events, releases, projects via Sentry's official MCP server. Multi-org.

## Get a token

Generate a **User Auth Token (sntrys_…)** at [https://sentry.io/settings/account/api/auth-tokens/](https://sentry.io/settings/account/api/auth-tokens/).

## Recommended scopes

- project:read, event:read, org:read at minimum.

## Add it to the vault

```bash
mcpvault add sentry
```

Example session:

```text
$ mcpvault add sentry
Label: aiside
Auth Token: sntrys_••••
Org slug: aiside
✓ Validated as "AISIDE" org
✓ Saved.
```

## Tools exposed

- `see upstream — issues, events, releases, projects`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Sentry account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/brave
<!-- Brave Search — Web search via Brave Search API. Multi-key for separating workloads or rate-limit budgets. -->

# Brave Search

Web search via Brave Search API. Multi-key for separating workloads or rate-limit budgets.

## Get a token

Generate a **Subscription key** at [https://brave.com/search/api/](https://brave.com/search/api/).

## Recommended scopes

- Free tier available. Paid tiers for higher QPS.

## Add it to the vault

```bash
mcpvault add brave
```

Example session:

```text
$ mcpvault add brave
Label: main
Subscription Key: ••••
✓ Validated (1 search confirmed)
✓ Saved.
```

## Tools exposed

- `see upstream — web search, news search`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Brave Search account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/aws
<!-- AWS — Call any AWS API. Multi-account = multi-IAM-user across orgs and roles. -->

# AWS

Call any AWS API. Multi-account = multi-IAM-user across orgs and roles.

## Get a token

Generate a **Access Key ID + Secret Access Key** at [https://console.aws.amazon.com/iam/home#/security_credentials](https://console.aws.amazon.com/iam/home#/security_credentials).

## Recommended scopes

- Read-only managed policies are a safe default.
- Per-account IAM user for multi-account orgs.

## Add it to the vault

```bash
mcpvault add aws
```

Example session:

```text
$ mcpvault add aws
Label: prod
Access key ID: AKIA••••
Secret access key: ••••
Region: us-east-1
✓ Format valid
✓ Saved.
```

## Tools exposed

- `see upstream — every AWS service. SSO supported.`

## Notes

- Validation is format-only (proper SigV4 validation needs aws-sdk dep). Upstream server fails loudly on first bad request.

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** AWS account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/resend
<!-- Resend — Transactional email — send, list domains, list emails. Multi-key for per-environment isolation. -->

# Resend

Transactional email — send, list domains, list emails. Multi-key for per-environment isolation.

## Get a token

Generate a **API key (re_…)** at [https://resend.com/api-keys](https://resend.com/api-keys).

## Recommended scopes

- Sending Access for send-only, Full Access for send + read.

## Add it to the vault

```bash
mcpvault add resend
```

Example session:

```text
$ mcpvault add resend
Label: aiside
API Key: re_••••
✓ Validated (2 domains)
✓ Saved.
```

## Tools exposed

- `see upstream — send, list domains, list emails`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Resend account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/figma
<!-- Figma — Read Figma files, frames, components. Useful for design-to-code agent workflows. -->

# Figma

Read Figma files, frames, components. Useful for design-to-code agent workflows.

## Get a token

Generate a **Personal access token** at [https://www.figma.com/settings](https://www.figma.com/settings).

## Recommended scopes

- File content (read) at minimum.
- Dev Mode access if you want code-from-design.

## Add it to the vault

```bash
mcpvault add figma
```

Example session:

```text
$ mcpvault add figma
Label: work
Access Token: ••••
✓ Validated as @raian
✓ Saved.
```

## Tools exposed

- `see upstream — files, frames, components, nodes`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Figma account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/airtable
<!-- Airtable — Records and schema across Airtable bases. Multi-token for separating workspaces. -->

# Airtable

Records and schema across Airtable bases. Multi-token for separating workspaces.

## Get a token

Generate a **Personal Access Token (pat…)** at [https://airtable.com/create/tokens](https://airtable.com/create/tokens).

## Recommended scopes

- data.records:read at minimum. Add data.records:write + schema.bases:read for full agent use.
- Restrict to specific bases.

## Add it to the vault

```bash
mcpvault add airtable
```

Example session:

```text
$ mcpvault add airtable
Label: crm
PAT: pat••••
✓ Validated as alice@example.com
✓ Saved.
```

## Tools exposed

- `see upstream — records, fields, bases`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Airtable account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/datadog
<!-- Datadog — Metrics, logs, monitors, dashboards. Multi-org for agencies + enterprises. -->

# Datadog

Metrics, logs, monitors, dashboards. Multi-org for agencies + enterprises.

## Get a token

Generate a **API key + Application key** at [https://app.datadoghq.com/organization-settings/api-keys](https://app.datadoghq.com/organization-settings/api-keys).

## Recommended scopes

- Need both an API key and an Application key.
- Pick the right Datadog site (datadoghq.com / .eu / us3 / us5 / ap1).

## Add it to the vault

```bash
mcpvault add datadog
```

Example session:

```text
$ mcpvault add datadog
Label: prod
API key: ••••
App key: ••••
Site: datadoghq.com
✓ Validated
✓ Saved.
```

## Tools exposed

- `see upstream — metrics, logs, monitors, dashboards, events`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Datadog account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/gitlab
<!-- GitLab — Issues, merge requests, repos for GitLab. Works with cloud or self-hosted. -->

# GitLab

Issues, merge requests, repos for GitLab. Works with cloud or self-hosted.

## Get a token

Generate a **Personal Access Token (glpat-…)** at [https://gitlab.com/-/profile/personal_access_tokens](https://gitlab.com/-/profile/personal_access_tokens).

## Recommended scopes

- api for full agent use; read_api for read-only.
- Self-hosted: set host URL when adding.

## Add it to the vault

```bash
mcpvault add gitlab
```

Example session:

```text
$ mcpvault add gitlab
Label: work
PAT: glpat-••••
✓ Validated as alice
✓ Saved.
```

## Tools exposed

- `see upstream — issues, MRs, projects, files, search`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** GitLab account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/mongodb
<!-- MongoDB — Connection-string based. Multi-account = multi-database (Atlas clusters, dev/prod, per-client). -->

# MongoDB

Connection-string based. Multi-account = multi-database (Atlas clusters, dev/prod, per-client).

## Get a token

Generate a **Connection string (mongodb+srv://…)** at [https://cloud.mongodb.com/v2/projects/](https://cloud.mongodb.com/v2/projects/).

## Recommended scopes

- Use a read-only role per agent context unless writes are explicitly required.

## Add it to the vault

```bash
mcpvault add mongodb
```

Example session:

```text
$ mcpvault add mongodb
Label: acme-prod
Connection string: mongodb+srv://••••
✓ Parsed connection (host: cluster.mongodb.net, db: main)
✓ Saved.
```

## Tools exposed

- `see upstream — find, aggregate, list databases, list collections`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** MongoDB account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/discord
<!-- Discord — Discord bot operations — channels, messages, users, reactions. One account = one bot. -->

# Discord

Discord bot operations — channels, messages, users, reactions. One account = one bot.

## Get a token

Generate a **Bot Token** at [https://discord.com/developers/applications](https://discord.com/developers/applications).

## Recommended scopes

- Create an application, add a Bot, copy the Bot Token.
- Invite the bot to your servers with the intents you need.

## Add it to the vault

```bash
mcpvault add discord
```

Example session:

```text
$ mcpvault add discord
Label: community
Bot Token: ••••
Guild ID: optional
✓ Validated as bot "AcmeBot"
✓ Saved.
```

## Tools exposed

- `see upstream — send/read messages, channels, users, reactions`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Discord account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/hubspot
<!-- HubSpot — CRM contacts, deals, companies via HubSpot's official MCP server. -->

# HubSpot

CRM contacts, deals, companies via HubSpot's official MCP server.

## Get a token

Generate a **Private App access token (pat-…)** at [https://app.hubspot.com/private-apps/](https://app.hubspot.com/private-apps/).

## Recommended scopes

- Create a Private App with crm.objects.contacts.read (and any other scopes needed).

## Add it to the vault

```bash
mcpvault add hubspot
```

Example session:

```text
$ mcpvault add hubspot
Label: work
Access Token: pat-••••
✓ Validated as hub 12345
✓ Saved.
```

## Tools exposed

- `see upstream — contacts, deals, companies, tickets`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** HubSpot account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/mixpanel
<!-- Mixpanel — Events, profiles, funnels per Mixpanel project. Multi-project for agencies. -->

# Mixpanel

Events, profiles, funnels per Mixpanel project. Multi-project for agencies.

## Get a token

Generate a **Service Account (username + secret)** at [https://mixpanel.com/settings/project](https://mixpanel.com/settings/project).

## Recommended scopes

- Project settings → Service Accounts. Note Project ID from URL.

## Add it to the vault

```bash
mcpvault add mixpanel
```

Example session:

```text
$ mcpvault add mixpanel
Username: ••••
Secret: ••••
Project ID: 1234567
✓ Validated as "AISIDE Mixpanel"
✓ Saved.
```

## Tools exposed

- `see upstream — events, profiles, funnels, segments`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** Mixpanel account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.

---

## URL: /docs/services/openai
<!-- OpenAI — OpenAI API access for chaining models or running batch jobs from agents. Multi-org keys. -->

# OpenAI

OpenAI API access for chaining models or running batch jobs from agents. Multi-org keys.

## Get a token

Generate a **Project API key (sk-proj-…)** at [https://platform.openai.com/api-keys](https://platform.openai.com/api-keys).

## Recommended scopes

- Project-scoped keys preferred over user keys.
- Restrict permissions per project where possible — keys can drain credits fast.

## Add it to the vault

```bash
mcpvault add openai
```

Example session:

```text
$ mcpvault add openai
Label: aiside
API Key: sk-proj-••••
Organization: org-•••• (optional)
✓ Validated
✓ Saved.
```

## Tools exposed

- `see upstream — completions, embeddings, files, batch, fine-tuning`

## Switch to this account

In any chat client wired to mcpvault, ask:

> Switch to my **<label>** OpenAI account.

The vault server's `activate_account` tool flips the active label. Wrappers re-read it on the next call — no restart.
