{"id":"29618f2b-bed4-4153-94f4-1230dcc82e28","slug":"vantagate-mcp-server","kind":"mcp","name":"vantagate-mcp-server","summary":"Human-in-the-Loop authorization gateway for AI Agents. Securely pause MCP workflows and route high-risk actions to human approvers via Slack or Email.","owner":"Aderix","repoUrl":"https://github.com/Aderix/vantagate-mcp-server","license":"MIT","licenseTier":"permissive","trust":"community","stars":1,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-02-28T15:43:22.000Z","addedAt":"2026-10-14T05:08:06.232Z","logoUrl":"https://avatars.githubusercontent.com/u/46716234?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra","productivity","communication"],"tags":["smithery","smithery-ai"],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":true,"reviewed":false,"syncedAt":"2026-10-17T12:52:53.510Z","sample":false,"url":"https://conduits.dev/tools/vantagate-mcp-server","language":"JavaScript","transports":["stdio"],"install":{"npm":"@vantagate/mcp-server"},"requirements":{"env":[{"name":"VANTA_API_KEY","secret":true,"required":true,"description":"Your VantaGate API Key (Format: vg_123...)"}],"upstreamMayCharge":false},"tools":null,"readme":"# VantaGate MCP Server & OpenAPI Integration\n\n[![npm version](https://img.shields.io/npm/v/@vantagate/mcp-server)](https://www.npmjs.com/package/@vantagate/mcp-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Node.js >= 20](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org)\n\n> **Human-in-the-Loop authorization for AI Agents.** VantaGate intercepts high-risk actions, routes them to a human approver via Slack or Email, and returns a cryptographically-signed decision - so your agent resumes or halts with a full audit trail.\n\n---\n\n## What is VantaGate?\n\nAI agents are increasingly capable of executing consequential real-world actions: sending emails to thousands of users, deleting database records, moving money, deploying to production. **VantaGate is the trust layer that ensures humans remain in control.**\n\n```\nAgent hits risky action\n        ↓\nPOST /v1/checkpoint  ──→  Human receives Slack/Email notification\n        ↓                          ↓\n   id and status              Human reviews payload & decides\n        ↓                          ↓\nPoll GET /v1/checkpoint/{id}  ←──  Decision recorded + payload purged\n        ↓\n   APPROVED → Resume workflow\n   REJECTED → Halt + report reason\n```\n\n### Key Guarantees\n\n- **< 100ms API response** - your agent is never blocked waiting for I/O\n- **AES-256 payload encryption** at rest - payload is permanently destroyed after the decision\n- **Zero-Retention polling** - `GET /checkpoint/{id}` never returns the original payload\n- **Cryptographic audit trail** - every decision is HMAC-SHA256 signed\n- **Stateless protocol** - no SDK required; plain HTTP from any language\n\n---\n\n## This Package\n\nThis package ships **two integration artifacts** for connecting any AI agent to VantaGate:\n\n| Artifact | File | Best for |\n|---|---|---|\n| **OpenAPI 3.0 Spec** | `vanta-gate-openapi.json` | No-code tools, OpenAI GPTs, Alice, n8n, Zapier |\n| **MCP Server** | `src/index.ts` / `dist/index.js` | Claude Desktop, Cursor, Cline, any MCP-compatible agent |\n\n---\n\n## Prerequisites\n\n- Node.js >= 20\n- A VantaGate account: [https://vanta-gate.com](https://vanta-gate.com)\n- A VantaGate API key (Dashboard → Projects → New Project)\n\n---\n\n## Quick Start\n\n### Option A: Use the MCP Server with Claude Desktop\n\nThe fastest path. No manual setup required.\n\n**Step 1:** Get your API key from [https://vanta-gate.com/dashboard/projects](https://vanta-gate.com/dashboard/projects)\n\n**Step 2:** Add VantaGate to your Claude Desktop config.\n\nOpen your `claude_desktop_config.json`:\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"vantagate\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@vantagate/mcp-server\"],\n      \"env\": {\n        \"VANTA_API_KEY\": \"YOUR_API_KEY_HERE\"\n      }\n    }\n  }\n}\n```\n\n**Step 3:** Restart Claude Desktop. The tools `create_vantagate_checkpoint` and `check_vantagate_status` will appear in Claude's tool list.\n\n**Step 4:** Ask Claude to do something that requires approval:\n\n> *\"Delete all records from the staging database where created_at < 2024-01-01\"*\n\nClaude will automatically pause, create a checkpoint, and tell you to check your email or Slack for the approval notification.\n\n---\n\n### Option B: Use the OpenAPI Spec (No-Code / Low-Code)\n\nImport `vanta-gate-openapi.json` directly into your tool of choice.\n\n#### OpenAI GPTs / Custom Actions\n\n1. Open your GPT editor at [https://platform.openai.com/gpts](https://platform.openai.com/gpts)\n2. Click **\"Add actions\"** → **\"Import from URL\"** or paste the JSON\n3. Set **Authentication** → `API Key` → Header: `X-API-KEY`\n4. Enter your VantaGate API key\n\nThe GPT will now pause before high-risk tool calls and ask for human approval.\n\n#### Alice (AI Agent Platform)\n\n1. Go to **Integrations** → **Import OpenAPI**\n2. Upload or paste `vanta-gate-openapi.json`\n3. Set header `X-API-KEY` to your VantaGate API key in the credential store\n4. Map `create_vantagate_checkpoint` to your agent's \"before high-risk action\" trigger\n\n#### n8n / Zapier\n\n1. Add an **HTTP Request** node\n2. Import the OpenAPI spec to auto-populate endpoints\n3. Set `X-API-KEY` header in the credential configuration\n\n#### LangChain / LlamaIndex\n\n```python\nfrom langchain.tools import OpenAPITool\n\nvanta_tool = OpenAPITool.from_openapi_spec(\n    spec_path=\"./vanta-gate-openapi.json\",\n    headers={\"X-API-KEY\": os.environ[\"VANTA_API_KEY\"]}\n)\nagent = initialize_agent([vanta_tool], llm, agent=AgentType.OPENAI_FUNCTIONS)\n```\n\n---\n\n## Available MCP Tools\n\n### `create_vantagate_checkpoint`\n\nPauses the agent workflow and routes a human approval request.\n\n**When Claude uses it:** Before any high-risk action - financial operations, data deletion, production deployments, bulk communications.\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `title` | string | ✅ | Short title shown to approver. Max 200 chars. |\n| `payload` | object | ✅ | Full JSON context for the decision. Encrypted + purged after decision. |\n| `description` | string | ❌ | Additional context below the title. Max 1000 chars. |\n| `options` | string[] | ❌ | Decision options. First = approve action. Default: `[\"Approve\", \"Reject\"]`. Min 2, max 5. |\n| `timeout` | string | ❌ | Auto-expire duration: `30m`, `4h`, `2d`. Default: `24h`. |\n| `notify_email` | string | ❌ | Email address for magic-link notification. |\n| `slack_webhook_url` | string | ❌ | Slack webhook URL (Pro/Scale plans). From Dashboard → Add to Slack. |\n| `callback_url` | string | ❌ | Your HTTPS endpoint for signed decision webhook. |\n\n**Returns:** `checkpoint_id` and step-by-step instructions for the agent.\n\n### `check_vantagate_status`\n\nPolls the decision status of a pending checkpoint.\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `checkpoint_id` | string | ✅ | The ID from `create_vantagate_checkpoint`. |\n\n**Returns:** `status` (`PENDING` / `APPROVED` / `REJECTED` / `RESOLVED` / `EXPIRED`), `selected_option`, `reject_reason`, and the full audit trail.\n\n---\n\n## API Reference Summary\n\n**Base URL:** `https://api.vanta-gate.com/v1`  \n**Authentication:** `X-API-KEY` header\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `POST` | `/checkpoint` | Create a checkpoint - pauses agent |\n| `GET` | `/checkpoint/{id}` | Poll for human decision |\n| `GET` | `/checkpoint/secure/{token}` | Decision UI (internal - magic link) |\n| `POST` | `/checkpoint/secure/{token}/decide` | Submit decision (internal - decision UI) |\n\n### Checkpoint Status Lifecycle\n\n```\nPENDING → APPROVED   (human chose first/positive option)\n        → REJECTED   (human rejected with optional reason)\n        → RESOLVED   (human chose non-primary option)\n        → EXPIRED    (timeout elapsed, no decision)\n```\n\n### Error Codes\n\n| HTTP | Code | Description |\n|---|---|---|\n| 400 | `Invalid_Webhook_URL` | `slack_webhook_url` must start with `https://hooks.slack.com/` |\n| 400 | `Invalid_Callback_URL` | `callback_url` is malformed or points to private IP |\n| 400 | `Invalid_Decision` | Decision value not in checkpoint's options array |\n| 400 | `Validation_Error` | Request body field validation failure |\n| 401 | `Unauthorized` | Missing, invalid, or rotated API key |\n| 402 | `Upgrade_Required` | Feature requires Pro or Scale plan |\n| 403 | `Forbidden` | API key doesn't match the checkpoint's project |\n| 404 | `Not_Found` | Checkpoint ID or token does not exist |\n| 409 | `Already_Decided` | Decision already recorded for this checkpoint |\n| 410 | `Checkpoint_Expired` | Timeout window has passed |\n| 429 | `Rate_Limited` | Too many requests - back off and retry |\n\nAll errors follow the envelope:\n```json\n{\n  \"statusCode\": 400,\n  \"error\": \"Machine_Readable_Code\",\n  \"message\": \"Human-readable description.\"\n}\n```\n\n---\n\n## Subscription Tiers\n\n| Feature | Free | Pro ($49/mo) | Scale ($199/mo) |\n|---|---|---|---|\n| Checkpoints/month | 50 | 2,500 | 25,000 |\n| Email notifications | ✅ | ✅ | ✅ |\n| Slack notifications | ❌ | ✅ | ✅ |\n| Webhook callbacks | ✅ | ✅ | ✅ |\n| Max timeout | 24h | 7 days | 30 days |\n| Log retention | 7 days | 90 days | 365 days |\n\n> Timeout values are silently clamped to your plan's maximum. A Free plan request with `timeout: \"7d\"` will be capped to `24h`.\n\n---\n\n## Webhooks\n\nWhen a human decides, VantaGate sends a signed HTTPS POST to your `callback_url` (up to 5 retry attempts with exponential back-off).\n\n**Request headers:**\n```\nContent-Type: application/json\nX-Vanta-Signature: sha256=<HMAC-SHA256 of body>\nUser-Agent: VantaGate-Webhook/1.0\n```\n\n**Signature verification (Node.js):**\n```javascript\nconst crypto = require('crypto')\n\nfunction verifyVantaSignature(rawBody, signature, projectSecret) {\n  const expected = 'sha256=' + crypto\n    .createHmac('sha256', projectSecret)\n    .update(rawBody)\n    .digest('hex')\n  return crypto.timingSafeEqual(\n    Buffer.from(expected),\n    Buffer.from(signature)\n  )\n}\n\napp.post('/webhook/vanta', express.raw({ type: 'application/json' }), (req, res) => {\n  const sig = req.headers['x-vanta-signature']\n  if (!verifyVantaSignature(req.body, sig, process.env.VANTA_PROJECT_SECRET)) {\n    return res.status(401).json({ error: 'Invalid signature' })\n  }\n  const event = JSON.parse(req.body)\n  if (event.status === 'APPROVED') {\n    // ✅ Resume agent workflow\n  } else if (event.status === 'REJECTED') {\n    // ❌ Halt - check event.reject_reason\n  }\n  res.json({ received: true })\n})\n```\n\nYour **Webhook Signing Secret** (`VANTA_PROJECT_SECRET`) is distinct from your API key. Find it in Dashboard → Project Settings.\n\n---\n\n## Building from Source\n\n```bash\n# Install dependencies\nnpm install\n\n# Build TypeScript\nnpm run build\n\n# Run the server directly\nVANTA_API_KEY=YOUR_API_KEY_HERE npm start\n```\n\n---\n\n## Advanced: MCP Config for Other Clients\n\n### Cursor / Cline / Windsurf\n\n```json\n{\n  \"mcpServers\": {\n    \"vantagate\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@vantagate/mcp-server\"],\n      \"env\": {\n        \"VANTA_API_KEY\": \"YOUR_API_KEY_HERE\"\n      }\n    }\n  }\n}\n```\n\n### With local build (development)\n\n```json\n{\n  \"mcpServers\": {\n    \"vantagate\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/dist/index.js\"],\n      \"env\": {\n        \"VANTA_API_KEY\": \"YOUR_API_KEY_HERE\"\n      }\n    }\n  }\n}\n```\n\n---\n\n## Security\n\n- Your `X-API-KEY` is **hashed server-side** - VantaGate never stores plaintext keys.\n- Your `slack_webhook_url` is sent per-request and **purged atomically** after the decision. Zero retention.\n- All payload data is **encrypted at rest with AES-256** and destroyed after the human decision. It cannot be reconstructed.\n- `callback_url` is validated against private IP ranges (SSRF prevention).\n- All webhook deliveries are signed with **HMAC-SHA256**. Always verify signatures.\n\n---\n\n## License\n\nMIT - see [LICENSE](LICENSE)\n\n---\n\n## Links\n\n- **Dashboard:** [https://vanta-gate.com/dashboard](https://vanta-gate.com/dashboard)\n- **Full API Docs:** [https://vanta-gate.com/dashboard/docs](https://vanta-gate.com/dashboard/docs)\n- **Privacy Policy:** [https://vanta-gate.com/legal/privacy-policy](https://vanta-gate.com/legal/privacy-policy)\n- **Terms of Service:** [https://vanta-gate.com/legal/terms-of-service](https://vanta-gate.com/legal/terms-of-service)\n"}