{
  "markdown": "# Gong MCP Server\n\n[![npm version](https://img.shields.io/npm/v/gongio-mcp)](https://www.npmjs.com/package/gongio-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n<img src=\"gong.png\" alt=\"A cute red panda hitting a gong\" width=\"300\" />\n\nAn MCP (Model Context Protocol) server that provides access to your Gong.io data. Query calls, transcripts, users, keyword trackers, and more directly from Claude or any MCP-compatible client.\n\n## Tools Quick Reference\n\n| Tool | Description |\n|------|-------------|\n| [`list_calls`](#list_calls) | List calls with date/workspace filtering |\n| [`get_call`](#get_call) | Get metadata for a specific call |\n| [`get_call_summary`](#get_call_summary) | AI summary: key points, topics, action items |\n| [`get_call_transcript`](#get_call_transcript) | Full speaker-attributed transcript (paginated) |\n| [`search_calls`](#search_calls) | Rich call search — participant, customer, tracker, scope, duration, title, and more |\n| [`search_calls_by_account`](#search_calls_by_account) | Find calls involving a specific account/company by email domain |\n| [`search_calls_by_opportunity`](#search_calls_by_opportunity) | Find calls linked to specific CRM Opportunities |\n| [`search_transcripts`](#search_transcripts) | Free-text keyword search across transcript sentences |\n| [`get_trackers`](#get_trackers) | List keyword trackers (competitors, topics, etc.) |\n| [`list_workspaces`](#list_workspaces) | List workspaces and get IDs for use in other tools |\n| [`list_library_folders`](#list_library_folders) | List public call library folders |\n| [`get_library_folder_calls`](#get_library_folder_calls) | Get calls saved in a specific library folder |\n| [`get_user`](#get_user) | Get a specific user's profile |\n| [`search_users`](#search_users) | Search/filter users by IDs or creation date |\n| [`list_users`](#list_users) | List all workspace users |\n\n\n## Response Size & Context Limits\n\n`search_calls` can return a lot of data. Under the hood it:\n\n- Auto-paginates up to **~5000 calls** (50 API pages) per query\n- Applies client-side filters (participant, customer, tracker, duration, etc.) after pagination\n- Returns a rich per-call format (metadata + summary + topics + participants) by default\n\n**Guardrails built in:**\n\n- If the formatted output would exceed **`MAX_MCP_OUTPUT_LENGTH`** (default `50000` chars, configurable via env var), the tool **automatically falls back to a compact table** with a warning. You still get every call ID and title — drill in with `get_call_summary` on specific ones.\n- `include: [\"outline\"]` is **expensive** (~80KB per call). Avoid it in multi-call searches.\n- Tracker data is filtered to only show trackers matching your `trackers` filter (or non-zero trackers if no filter) — no more walls of `(0x)` noise.\n\n**If your query hits the output cap, narrow it:**\n\n1. Tighten `fromDateTime` / `toDateTime`\n2. Add `scope: \"External\"` or `scope: \"Internal\"`\n3. Add `minDuration: 600` to skip short no-shows\n4. Add `customerName` or `trackers` filter\n5. Drop heavy `include` options like `outline`\n\n## Prerequisites\n\n- Node.js 18+ **or** Docker\n- Gong API credentials (Access Key and Secret)\n\n<details>\n<summary><strong>Getting API Credentials</strong></summary>\n\n1. Log into Gong as an admin\n2. Go to **Company Settings** → **Ecosystem** → **API**\n3. Click **Create API Key**\n4. Save both the Access Key and Secret (the secret is only shown once)\n\n</details>\n\n<details>\n<summary><strong>Installation</strong></summary>\n\n### Option 1: npx (no install required)\n\n```bash\nnpx gongio-mcp\n```\n\n### Option 2: Global npm install\n\n```bash\nnpm install -g gongio-mcp\ngongio-mcp\n```\n\n### Option 3: From source\n\n```bash\ngit clone https://github.com/JustinBeckwith/gongio-mcp.git\ncd gongio-mcp\nnpm install\nnpm run build\nnode dist/index.js\n```\n\n### Option 4: Docker (build locally)\n\n```bash\ngit clone https://github.com/JustinBeckwith/gongio-mcp.git\ncd gongio-mcp\ndocker build -t gongio-mcp .\ndocker run --rm -i \\\n  -e GONG_ACCESS_KEY=your-access-key \\\n  -e GONG_ACCESS_KEY_SECRET=your-secret-key \\\n  gongio-mcp\n```\n\n</details>\n\n<details>\n<summary><strong>Configuration</strong></summary>\n\nSet your Gong credentials as environment variables:\n\n```bash\nexport GONG_ACCESS_KEY=\"your-access-key\"\nexport GONG_ACCESS_KEY_SECRET=\"your-secret-key\"\n```\n\nOr pass them inline:\n\n```bash\nGONG_ACCESS_KEY=your-key GONG_ACCESS_KEY_SECRET=your-secret npx gongio-mcp\n```\n\n</details>\n\n<details>\n<summary><strong>Client Setup</strong></summary>\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows):\n\n**Using npx:**\n```json\n{\n  \"mcpServers\": {\n    \"gong\": {\n      \"command\": \"npx\",\n      \"args\": [\"gongio-mcp\"],\n      \"env\": {\n        \"GONG_ACCESS_KEY\": \"your-access-key\",\n        \"GONG_ACCESS_KEY_SECRET\": \"your-secret-key\"\n      }\n    }\n  }\n}\n```\n\n**Using Docker:**\n```json\n{\n  \"mcpServers\": {\n    \"gong\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"--rm\", \"-i\",\n               \"-e\", \"GONG_ACCESS_KEY\",\n               \"-e\", \"GONG_ACCESS_KEY_SECRET\",\n               \"gongio-mcp\"],\n      \"env\": {\n        \"GONG_ACCESS_KEY\": \"your-access-key\",\n        \"GONG_ACCESS_KEY_SECRET\": \"your-secret-key\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n**Using npx:**\n```bash\nclaude mcp add gong -e GONG_ACCESS_KEY=your-key -e GONG_ACCESS_KEY_SECRET=your-secret -- npx gongio-mcp\n```\n\n**Using Docker (after `docker build -t gongio-mcp .`):**\n```bash\nclaude mcp add gong -e GONG_ACCESS_KEY=your-key -e GONG_ACCESS_KEY_SECRET=your-secret -- docker run --rm -i -e GONG_ACCESS_KEY -e GONG_ACCESS_KEY_SECRET gongio-mcp\n```\n\n</details>\n\n## Available Tools\n\n<a name=\"list_calls\"></a>\n<details>\n<summary><code>list_calls</code> — List Gong calls with date filtering</summary>\n\nList calls with optional date range and workspace filters. Returns minimal call metadata (ID, title, date, duration).\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `fromDateTime` | No | Start date in ISO 8601 format (e.g., `2024-01-01T00:00:00Z`) |\n| `toDateTime` | No | End date in ISO 8601 format (e.g., `2024-01-31T23:59:59Z`) |\n| `workspaceId` | No | Filter calls by workspace ID (use `list_workspaces` to find IDs) |\n| `cursor` | No | Pagination cursor for next page |\n\n</details>\n\n<a name=\"get_call\"></a>\n<details>\n<summary><code>get_call</code> — Get metadata for a specific call</summary>\n\nGet the URL, timing, direction, scope, system, and other metadata for one call. Faster than `get_call_summary` when you only need call metadata.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `callId` | Yes | Gong call ID (numeric string) |\n\n</details>\n\n<a name=\"get_call_summary\"></a>\n<details>\n<summary><code>get_call_summary</code> — AI-generated call summary</summary>\n\nGet an AI-generated summary including brief overview, key points, topics, action items, and detailed outline. This is the recommended way to understand a call — use `get_call_transcript` only if you need exact quotes.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `callId` | Yes | Gong call ID (numeric string) |\n\n</details>\n\n<a name=\"get_call_transcript\"></a>\n<details>\n<summary><code>get_call_transcript</code> — Full speaker-attributed transcript</summary>\n\nGet the raw transcript with speaker attribution. Transcripts are paginated (default 10KB) to prevent context overflow — use `maxLength` and `offset` to navigate.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `callId` | Yes | Gong call ID (numeric string) |\n| `maxLength` | No | Maximum characters to return (default: 10000, max: 100000) |\n| `offset` | No | Character offset to start from for pagination (default: 0) |\n\n</details>\n\n<a name=\"search_calls\"></a>\n<details>\n<summary><code>search_calls</code> — Advanced call search</summary>\n\nSearch calls with advanced filters including participant lookup, customer name search, and rich content selection. Automatically paginates through all results and returns participant info, brief summary, and topics by default.\n\n**Parameters:**\n\n*Date & workspace*\n\n| Parameter | Description |\n|-----------|-------------|\n| `fromDateTime` | Start date in ISO 8601 format |\n| `toDateTime` | End date in ISO 8601 format |\n| `workspaceId` | Filter by workspace ID (use `list_workspaces` to find IDs) |\n| `callIds` | Array of specific call IDs to retrieve |\n\n*Host / participant*\n\n| Parameter | Description |\n|-----------|-------------|\n| `primaryUserIds` | Host user IDs (server-side) |\n| `primaryUserEmails` | Host emails (case-insensitive) |\n| `excludePrimaryUserIds` | Exclude these host user IDs |\n| `participantUserIds` | Any participant (host/attendee/invitee) user IDs |\n| `excludeParticipantUserIds` | Exclude calls where any participant has these user IDs |\n| `participantEmails` | Any participant emails (case-insensitive) |\n| `excludeParticipantEmails` | Exclude calls where any participant has these emails |\n\n*Content & customer*\n\n| Parameter | Description |\n|-----------|-------------|\n| `customerName` | Fuzzy match against CRM account name, external email domains, and titles |\n| `titleContains` | Substring match on call title (case-insensitive) |\n| `trackers` | Calls where matching tracker(s) fired (count > 0). Workspace-specific — use `get_trackers` to discover |\n\n*Metadata*\n\n| Parameter | Description |\n|-----------|-------------|\n| `scope` | `External`, `Internal`, or `Unknown` |\n| `direction` | `Inbound`, `Outbound`, `Conference`, or `Unknown` |\n| `system` | Conferencing platform (e.g., `Zoom`) — case-insensitive substring |\n| `language` | Language code (e.g., `eng`) — case-insensitive exact match |\n| `minDuration` | Minimum duration in seconds |\n| `maxDuration` | Maximum duration in seconds |\n\n*Response shape*\n\n| Parameter | Description |\n|-----------|-------------|\n| `include` | Additional data to return — see table below |\n\n**`include` options:**\n\n| Value | What it adds | Size |\n|-------|-------------|------|\n| `keyPoints` | AI-extracted key points as bullets | ~5KB/call |\n| `trackers` | Keyword/smart tracker hits with counts | ~3KB/call |\n| `highlights` | AI-curated highlight clips grouped by theme | ~3KB/call |\n| `speakers` | Talk time per participant | ~1KB/call |\n| `comments` | Public comments left on the call | varies |\n| `context` | CRM account/opportunity linkage (HubSpot, Salesforce) | ~1KB/call |\n| `outline` | Full section-by-section outline with items | **~80KB/call (large)** |\n| `media` | Audio/video URLs (valid 8 hours) | ~3KB/call |\n\nDefaults (always returned): participants, brief summary, and topics — ~3KB per call.\n\n**Filter behavior notes:**\n\n- Filters combine with **AND** logic. `primaryUserIds` + `participantUserIds` compose: primary narrows server-side, participant post-filters.\n- `customerName` matches any of: CRM account Name field, external participant email domain, or call title (case-insensitive substring).\n- `trackers` names are **workspace-specific** — call `get_trackers` first to see what's configured. Match is case-insensitive substring (so `\"competitor\"` matches both `\"Competitors\"` and `\"Competitor Mentions\"`).\n- When `trackers` filter is set, the relevant tracker content is auto-included and the output shows only the trackers you asked about. Without a filter, only non-zero trackers are shown.\n- An empty result returns `\"No calls found\"` rather than an error.\n\nSee [Response Size & Context Limits](#response-size--context-limits) for how large-result fallback works.\n\n</details>\n\n<a name=\"search_calls_by_account\"></a>\n<details>\n<summary><code>search_calls_by_account</code> — Find calls by account/company (email domain)</summary>\n\nFind calls involving a specific account or company by matching the email domains of external participants. The Gong API does not natively support filtering by account name (a [known gap](https://visioneers.gong.io/data-in-gong-71)) — this tool fetches calls in the date range and post-filters on `parties[].emailAddress`. Auto-paginates the underlying `/v2/calls/extensive` endpoint up to `maxCalls`.\n\n**Use this when:**\n- A prospect has multiple email domains (`acme.com`, `acme.io`, regional TLDs) and you need them all\n- You need to join external enrichment data (e.g., \"all prospects on Klaviyo\" from BuiltWith / Clearbit / a vendor-stack graph) — resolve to a domain list upstream and pass it here\n- Domain-based matching is more reliable than CRM Account names that drift across systems\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `domains` | **Yes** | Email domains, e.g. `[\"acme.com\", \"acme.io\"]`. A call matches if any external participant has an email at one of these domains. |\n| `fromDateTime` | No | Start date in ISO 8601 format |\n| `toDateTime` | No | End date in ISO 8601 format |\n| `workspaceId` | No | Filter by workspace ID |\n| `primaryUserIds` | No | Pre-narrow by call host user IDs (faster, server-side) |\n| `matchCrmAccount` | No | Also match where a CRM Account context object name contains a domain root (e.g. `\"acme\"` from `\"acme.com\"`). Requires CRM integration. Default `false`. |\n| `maxCalls` | No | Max calls to fetch & filter (default: 500, max: 5000). Auto-paginates underlying API. |\n| `cursor` | No | Pagination cursor (advanced) |\n\n**Cost note:** This is fetch-then-filter. A 90-day window with no other narrowing typically pages through 1–5 API calls. Combine with `primaryUserIds` to bound cost on long ranges.\n\n</details>\n\n<a name=\"search_calls_by_opportunity\"></a>\n<details>\n<summary><code>search_calls_by_opportunity</code> — Find calls linked to a CRM Opportunity</summary>\n\nFind calls linked to specific CRM Opportunities by ID or name substring. Requires Gong-CRM integration (Salesforce / HubSpot) — calls without CRM linkage will not match.\n\n**Use this when:**\n- You want every call on a specific deal — `opportunityIds: [\"006xxxxx\"]` is the most precise option\n- Opportunity names are descriptive (e.g. `\"Acme Q4 Renewal\"`) and you want fuzzy matching across renamed/duplicated opportunities\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `opportunityIds` | At least one of `opportunityIds` or `opportunityNames` is required | CRM Opportunity IDs (e.g., Salesforce 18-character IDs) |\n| `opportunityNames` | At least one of `opportunityIds` or `opportunityNames` is required | Name substrings (case-insensitive) matched against the Name field of Opportunity context objects |\n| `fromDateTime` | No | Start date in ISO 8601 format |\n| `toDateTime` | No | End date in ISO 8601 format |\n| `workspaceId` | No | Filter by workspace ID |\n| `primaryUserIds` | No | Pre-narrow by call host user IDs |\n| `maxCalls` | No | Max calls to fetch & filter (default: 500, max: 5000) |\n| `cursor` | No | Pagination cursor (advanced) |\n\n**Cost note:** Uses the same fetch-then-filter pattern as `search_calls_by_account`. CRM context lookup adds no extra API calls — it rides on the same `/v2/calls/extensive` request with `context: \"Extended\"`.\n\n</details>\n\n<a name=\"search_transcripts\"></a>\n<details>\n<summary><code>search_transcripts</code> — Free-text keyword search across transcripts</summary>\n\nFree-text keyword search across call transcript sentences within a bounded date range. Two-phase: (1) `/v2/calls/extensive` narrows the call set by date + optional `primaryUserIds` / `domains`, (2) `/v2/calls/transcript` fetches transcripts for the narrowed set and returns sentence-level matches with speaker attribution and timestamps.\n\n**Prefer Gong Trackers for recurring terms.** For competitor names, ESP/tech terms (Klaviyo, Braze, Iterable, Postscript, Attentive, Sendgrid, Customer.io, etc.), and other terms you'll search for repeatedly — set them up as Gong Trackers in the UI (one-time, ~30 minutes for ~20 terms). Then use `get_trackers` + `search_calls` + `get_call_summary` instead. Trackers are server-side, the cost is dramatically lower, and they surface counts and timestamps natively. Use `search_transcripts` for ad-hoc one-offs.\n\n**Cost guard:** Date ranges greater than 30 days require additional narrowing via `primaryUserIds` or `domains`. A 6-month unbounded scan would burn API quota and is rejected at the schema level.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `keywords` | **Yes** | Keywords to search for. Each must be at least 2 characters. |\n| `fromDateTime` | **Yes** | Start of date window (ISO 8601). |\n| `toDateTime` | **Yes** | End of date window (ISO 8601). |\n| `primaryUserIds` | Required if window > 30 days and `domains` not set | Narrow to calls hosted by these users before scanning |\n| `domains` | Required if window > 30 days and `primaryUserIds` not set | Narrow to calls with external parties from these domains before scanning |\n| `workspaceId` | No | Filter by workspace ID |\n| `caseSensitive` | No | Default `false`. |\n| `wholeWord` | No | Default `true` — `\"ai\"` will not match `\"said\"` or `\"again\"`. Set `false` for substring matching. |\n| `maxCalls` | No | Max calls to scan (default: 500). |\n| `maxMatchesPerCall` | No | Max sentence matches returned per call (default: 10) — prevents context overflow on calls with many hits. |\n\n**Returns:** Sentence-level matches grouped by call, including speaker name and affiliation (when available), keyword matched, timestamp (mm:ss), and the sentence snippet.\n\n</details>\n\n<a name=\"get_trackers\"></a>\n<details>\n<summary><code>get_trackers</code> — List keyword trackers</summary>\n\nList all keyword tracker definitions including tracked phrases, affiliation (whose speech is tracked), and filter queries. Explains tracker hits visible in `get_call_summary` output.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `workspaceId` | No | Filter trackers by workspace ID (use `list_workspaces` to find IDs) |\n\n</details>\n\n<a name=\"list_workspaces\"></a>\n<details>\n<summary><code>list_workspaces</code> — List all workspaces</summary>\n\nList all Gong workspaces with their IDs and names. Use these IDs as filters in `list_calls`, `search_calls`, `get_trackers`, and other tools. Most companies have 1–3 workspaces (e.g., by region or product line).\n\n**Parameters:** None\n\n</details>\n\n<a name=\"get_user\"></a>\n<details>\n<summary><code>get_user</code> — Get a user's profile</summary>\n\nGet a specific user's profile including name, email, title, phone, and settings. Useful for resolving user IDs returned from call data.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `userId` | Yes | Gong user ID (numeric string) |\n\n</details>\n\n<a name=\"search_users\"></a>\n<details>\n<summary><code>search_users</code> — Search users by filter</summary>\n\nSearch and filter users by IDs or creation date. More flexible than `list_users` for resolving specific user IDs from call data in bulk.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `userIds` | No | Array of specific user IDs to look up |\n| `createdFromDateTime` | No | Filter users created after this datetime (ISO 8601) |\n| `createdToDateTime` | No | Filter users created before this datetime (ISO 8601) |\n| `cursor` | No | Pagination cursor |\n\n</details>\n\n<a name=\"list_users\"></a>\n<details>\n<summary><code>list_users</code> — List all workspace users</summary>\n\nList all Gong users in your workspace. Returns name, email, and title for each user.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `cursor` | No | Pagination cursor |\n| `includeAvatars` | No | Whether to include user avatar URLs |\n\n</details>\n\n<a name=\"list_library_folders\"></a>\n<details>\n<summary><code>list_library_folders</code> — List public call library folders</summary>\n\nList all public Gong call library folders for a workspace. Returns folder IDs and names used with `get_library_folder_calls`. Private and archived folders are not returned.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `workspaceId` | **Yes** | Workspace ID to list folders for (use `list_workspaces` to find IDs) |\n\n</details>\n\n<a name=\"get_library_folder_calls\"></a>\n<details>\n<summary><code>get_library_folder_calls</code> — Get calls in a library folder</summary>\n\nGet all calls saved in a specific Gong library folder. Returns call IDs, titles, curator notes, and snippet timing for clips. Call IDs can be passed directly to `get_call_summary` or `get_call_transcript`.\n\n**Parameters:**\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| `folderId` | Yes | Library folder ID (numeric string, from `list_library_folders`) |\n\n</details>\n\n## Available Resources\n\n<a name=\"gong-users\"></a>\n<details>\n<summary><code>gong://users</code> — All workspace users</summary>\n\nReturns a markdown-formatted list of all users in your Gong workspace. Useful for resolving user IDs found in call data.\n\n**Parameters:** None\n\n</details>\n\n## Example Prompts\n\nOnce connected to Claude, you can ask:\n\n- \"List my Gong calls from last week\"\n- \"Get the details for call 123456789\"\n- \"Show me a summary of call 123456789\"\n- \"Get the transcript for call 789012\"\n- \"What workspaces do we have in Gong?\"\n- \"What keywords is Gong tracking for competitors?\"\n- \"What call library folders do we have in Gong?\"\n- \"Show me the calls in the 'Best Discovery Calls' library folder\"\n- \"Who are all the users in our Gong workspace?\"\n- \"Search for calls hosted by Justin (user ID 232255198215877499) in July 2025\"\n- \"Look up these user IDs: 111, 222, 333\"\n- \"Show me all calls from the past 60 days with anyone at acme.com or acme.io\"\n- \"Find every call attached to opportunity 006xxxxx\"\n- \"Find Q3 calls where prospects mentioned Klaviyo or Braze, narrowed to John's calls\"\n\n## Contributing\n\nInterested in contributing? Check out [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing instructions, and guidelines.\n\nThe repository includes `gong-openapi.json` — a local copy of the Gong API OpenAPI spec. It's useful as a reference when adding new tools: use it to look up endpoint paths, parameter names, and response shapes without leaving your editor. The latest spec can be downloaded from the [Gong API documentation](https://gong.app.gong.io/ajax/settings/api/documentation/specs?version=).\n",
  "bytes": 22584,
  "sha": "aed1e43ef17ad9d13dbbf31c9e1d401f806614f83eb2bc15a7fd413eae90837d",
  "repo_slug": "justinbeckwith/gongio-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_justinbeckwith_gongio_mcp_72bd0f61/readme"
}