Install
$ agentstack add mcp-ryanshatz-five9-mcp ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Verified badge
Passed review? Show it. Paste this badge into your README — it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming — see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps — measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
☎️ five9-mcp
Your Five9 contact center, in your AI's hands.
An open-source MCP server that connects Claude, ChatGPT, or any MCP client to the Five9 cloud contact center — running on Cloudflare Workers with zero dependencies.
[](LICENSE) [](https://workers.cloudflare.com) [](package.json) [](https://modelcontextprotocol.io) [](#-the-toolbox)
[Quick start](#-quick-start--no-terminal-needed) · [Connect Claude](#connect-claude-web--desktop) · [Connect ChatGPT](#connect-chatgpt) · [Tools](#-the-toolbox) · [Architecture](#%EF%B8%8F-architecture)
Ask your AI things like:
> "Who's on a call right now, and how deep is the sales queue?" 📊 > "Create a preview campaign for the win-back list, attach the sales skill, and start it." 🛠️ > "Stop the OUTBOUND_AGED campaign and add these 3 leads to the callback list." 📞 > "Onboard the new agent: create the user, assign the billing skill at level 2." 🧑💼 > "Is 555-867-5309 on our DNC? Check before anyone dials it." 🚫 > "Pull yesterday's Call Log report and summarize abandon rates." 📈 > "Build me a complete IVR: option 1 scheduling, option 2 billing, after hours goes to voicemail." 🧩
Under the hood, this server speaks Five9's Configuration (admin) and Statistics (supervisor) SOAP Web Services — the APIs that still run Five9's admin surface — and exposes them as clean JSON tools over MCP streamable HTTP. Hand-rolled envelopes, a ~60-line XML parser, no npm packages. Every tool has been exercised against a live Five9 domain.
✨ Built-in web UI
Deploy it and your Worker serves more than an API:
| Page | What you get | |------|--------------| | / | A polished landing page: live server status, this setup guide, click-by-click AI connection walkthroughs, and the full tool catalog | | /setup | The setup wizard — enter Five9 credentials in your browser, get them verified live, receive your access key. No terminal, no secrets commands | | /console | An interactive console — paste your access key, pick any of the 77 grouped tools, fill a form generated from its schema, and run it against your live Five9 domain right from the browser | | /mcp | The MCP endpoint itself (streamable HTTP, stateless) | | /health | JSON healthcheck |
The console is the fastest way to sanity-check credentials, explore what each tool returns, or debug a campaign — no AI required.
The console running check_connection against a live Five9 domain
🚀 Quick start — no terminal needed
You need a free Cloudflare account and a Five9 user with API access — create a dedicated Five9 API user scoped to what you want an AI to do, don't reuse a personal admin login.
1 — Deploy to Cloudflare (one click, in your browser)
[](https://deploy.workers.cloudflare.com/?url=https://github.com/ryanshatz/five9-mcp)
Sign in to Cloudflare and click through — it creates your own copy of this Worker (plus the KV namespace it needs) and gives you a URL like https://five9-mcp.you.workers.dev.
2 — Run the setup wizard (in your browser)
Open /setup on your new server. Enter your Five9 username, password, and region — the wizard verifies them live against Five9 before saving, then hands you your access key (shown once — store it in a password manager).
3 — Connect your AI (walkthroughs below), then ask it to "check the connection and list my campaigns." 🎉
⌨️ Prefer the CLI?
git clone https://github.com/ryanshatz/five9-mcp
cd five9-mcp
npx wrangler deploy # provisions the CONFIG KV namespace on first deploy
Then either use the /setup wizard, or skip it and manage credentials as Wrangler secrets (secrets override the wizard):
npx wrangler secret put FIVE9_USERNAME # e.g. apiuser@yourdomain
npx wrangler secret put FIVE9_PASSWORD
npx wrangler secret put MCP_AUTH_TOKEN # a long random string — this is the key to your server
🌍 Non-US domain or different API version?
Defaults live in wrangler.toml and work for US domains:
| Var | Default | Notes | |-----|---------|-------| | FIVE9_API_HOST | api.five9.com | EU: api.eu.five9.com · Canada: api.ca.five9.com | | FIVE9_ADMIN_VERSION | v13 | Config Web Services WSDL version | | FIVE9_SUPERVISOR_VERSION | v13 | Statistics Web Services WSDL version |
🔌 Connect your AI
Connect Claude (web & desktop)
Custom connectors are available on Free (one connector), Pro, Max, Team, and Enterprise plans.
- In claude.ai or the Claude desktop app, open Settings → Connectors.
- Click Add custom connector.
- Name it Five9 and paste your server URL including the
/mcppath:
https://.workers.dev/mcp
- Click Add, then Connect. Claude auto-discovers this server's built-in OAuth and opens its authorization page.
- On the 🔐 five9-mcp screen, paste your
MCP_AUTH_TOKENas the access key and click Authorize. - In any chat, open the search & tools (+) menu and make sure the Five9 connector is toggled on.
> Team/Enterprise: an Owner first adds the connector under Organization settings → Connectors; members then click Connect in their own settings to authorize.
Connect ChatGPT
Custom MCP connectors require Developer mode (Plus/Pro; on Business/Enterprise an admin must allow custom connectors).
- In ChatGPT on the web, open Settings → Apps & Connectors (sometimes labeled just Connectors).
- Under Advanced settings, toggle Developer mode on.
- Back on the Connectors page, click Create.
- Name it Five9, set the MCP server URL to
https://.workers.dev/mcp, and choose OAuth authentication. - Acknowledge the trust prompt and save. ChatGPT opens this server's authorization page — paste your
MCP_AUTH_TOKENand click Authorize. - In a new chat, open the + / tools menu and enable the Five9 connector (Developer mode connectors are enabled per-conversation). ChatGPT asks you to confirm each tool call — sensible for anything that can start a dialer. 😄
Connect Claude Code
claude mcp add --transport http five9 https://.workers.dev/mcp \
--header "Authorization: Bearer "
The raw access key works directly as a bearer token — no OAuth dance. Run /mcp inside Claude Code to verify.
Any other MCP client
Anything that speaks MCP streamable HTTP works — complete the OAuth flow or send the access key as a bearer token:
curl -X POST https://.workers.dev/mcp \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_connection","arguments":{}}}'
🔐 How the built-in OAuth works
src/oauth.js implements a minimal OAuth 2.1 authorization server (metadata discovery, dynamic client registration, PKCE S256, refresh tokens) designed for a single-operator deployment:
- The "login" on the consent screen is the server's access key (
MCP_AUTH_TOKEN). - Everything is stateless — client IDs, auth codes, and tokens are HMAC-SHA256-signed blobs keyed by
MCP_AUTH_TOKEN. No KV, no Durable Objects. - Both auth paths work simultaneously: OAuth-minted tokens and the raw key as a bearer credential.
- Revoke everything at once by rotating the secret:
npx wrangler secret put MCP_AUTH_TOKEN.
🧰 The toolbox
77 tools. 🟢 = read (always safe) · ✏️ = write (changes your domain — the server tells AIs to confirm with you first)
> 69 SOAP tools (username/password) + 8 OAuth New Platform REST tools (Consumer Key/Secret — see [OAuth New Platform APIs](#-oauth-new-platform-apis)).
🧩 IVR builder — whole call flows from plain English
The headline trick: describe a call flow in a paragraph and the AI designs it, shows you a Mermaid diagram in chat, and deploys a working IVR script. The model never freestyles Five9's IVR XML: it fills a constrained JSON flow spec (play / menu / business-hours / skill transfer / voicemail / hangup), a graph validator checks every branch and reference, and deterministic code emits designer-shaped XML (module wiring, prompt encoding, and field order all derived from real exported scripts).
| | Tool | What it does | |--|------|--------------| | 🟢 | validate_ivr_flow | Graph-check a flow spec + verify referenced skills/prompts exist on the domain | | 🟢 | render_ivr_flow | Render a flow spec or an existing IVR script as a Mermaid flowchart | | ✏️ | build_ivr_script | Compose the full script XML and create it on the domain (dry_run to inspect first) | | ✏️ | generate_prompt_audio | Voice a prompt with a modern AI voice and upload it as a Five9-ready G.711 u-law WAV. No API key needed: powered by Workers AI (Deepgram Aura, ~40 voices) built into your Worker |
Recommended flow: validate → render (show the human!) → generate prompts → build → attach to an inbound campaign. generate_prompt_audio runs on Cloudflare Workers AI out of the box: no external TTS account, no API key, fractions of a cent per prompt billed to the Cloudflare account you already deployed to. ElevenLabs/OpenAI work too if you set their key secrets, and {tts} prompts (Five9's built-in robot voice) need nothing at all.
🔌 Connection & context
| | Tool | What it does | |--|------|--------------| | 🟢 | about | Operator context for the AI — who runs this server and the ground rules | | 🟢 | check_connection | Verify Five9 credentials work; returns visible skill count | | 🟢 | get_api_usage | Current Five9 API usage counters vs rate limits |
📞 Campaigns
| | Tool | What it does | |--|------|--------------| | 🟢 | list_campaigns | List campaigns (name, type, state, mode) | | 🟢 | inspect_campaign | State + attached lists + DNIS in one call | | 🟢 | get_campaign_details | FULL campaign config (dialing mode, ratios, recording, wrap-up…) | | ✏️ | create_campaign | Create outbound or inbound campaigns, BASIC or ADVANCED | | ✏️ | modify_campaign | Edit any campaign setting — read-modify-write, pass only the changes | | ✏️ | rename_campaign | Rename a campaign | | ✏️ | delete_campaign | Delete a campaign | | ✏️ | control_campaign | start / stop / forcestop / reset / resetlist_positions | | ✏️ | manage_campaign_lists | Attach/detach dialing lists with priority | | ✏️ | manage_campaign_skills | Add/remove routing skills on a campaign | | ✏️ | manage_campaign_dnis | Attach/detach inbound numbers | | ✏️ | manage_campaign_dispositions | Add/remove agent dispositions on a campaign | | 🟢 | list_campaign_profiles | List campaign profiles (ANI, attempts, timeouts) | | ✏️ | manage_campaign_profile | Create / modify / delete campaign profiles | | ✏️ | manage_campaign_profile_filter | Read / edit a profile's CRM record-selection criteria and dialing order |
📋 Dialing lists & leads
| | Tool | What it does | |--|------|--------------| | 🟢 | list_dialing_lists | List dialing lists + record counts | | ✏️ | create_list / delete_list | Create or delete a dialing list | | ✏️ | add_record_to_list | Push a lead into a list (async import) | | ✏️ | add_records_to_list | Bulk-add many leads in one async import (configurable CRM/list modes) | | ✏️ | delete_record_from_list | Remove matching records from a list | | 🟢 | get_import_result | Outcome of an async list/CRM import |
👤 CRM contacts
| | Tool | What it does | |--|------|--------------| | 🟢 | search_contacts | Look up contacts by exact field values | | ✏️ | update_contact | Update a contact (sole-match safety by default) | | ✏️ | bulk_update_contacts | Update many CRM contacts in one async import (poll with type "crm") | | ✏️ | delete_contact | Delete a contact (only when exactly one matches) | | 🟢 | list_contact_fields | The domain's contact field schema | | ✏️ | manage_contact_field | Create / modify / delete custom CRM fields |
🚫 Compliance
| | Tool | What it does | |--|------|--------------| | ✏️ | manage_dnc | Check / add / remove numbers on the domain DNC list | | 🟢 | get_dialing_rules | Domain dialing rules (time/state restrictions) |
🧑💼 Users & skills
| | Tool | What it does | |--|------|--------------| | 🟢 | list_users | List users with general info | | 🟢 | get_user_details | One user's full record: roles, skills, groups | | ✏️ | create_user | Create a user with roles, skills, and groups | | ✏️ | modify_user | Edit a user's info — pass only the changes | | ✏️ | delete_user | Delete a user | | 🟢 | list_user_profiles | Role/permission templates | | 🟢 | list_skills / get_skill_details | Skills, with or without assigned users | | ✏️ | manage_skill | Create / modify / delete skills | | ✏️ | manage_user_skills | Assign skills to users, set levels | | ✏️ | set_user_roles | Grant / revoke roles (agent, admin, supervisor, reporting, crmManager) with permission tabs | | 🟢 | list_agent_groups | Agent groups + members | | ✏️ | manage_agent_group | Create / delete groups, add/remove agents | | ✏️ | manage_reason_code | Not Ready / Logout reason codes |
🏢 Domain configuration
| | Tool | What it does | |--|------|--------------| | 🟢 | list_dispositions | Call dispositions and their settings | | ✏️ | manage_disposition | Create / modify / rename / delete dispositions (incl. redial timers) | | 🟢 | list_ivr_scripts / get_ivr_script | IVR scripts — metadata, or one script's full XML | | ✏️ | manage_ivr_script | Create / modify / delete IVR scripts (push a full xmlDefinition) | | 🟢 | list_prompts | Voice prompts on the domain | | ✏️ | manage_tts_prompt | Create / modify / delete text-to-speech prompts | | ✏️ | manage_wav_prompt | Create / modify / delete pre-recorded WAV prompts (base64; G.711 µ-law 8kHz mono) | | 🟢 | list_dnis | Provisioned inbound numbers (optionally unassigned only) | | 🟢 | list_call_variables | Call variables and variable groups | | ✏️ | manage_call_variable | Create / delete custom call variables | | 🟢 | list_web_connectors | Web connector integrations | | ✏️ | manage_web_connector | Create / delete web connectors (URL pops agents trigger) | | ✏️ | manage_speed_dial | List / create / delete speed-dial codes | | 🟢 | get_vcc_configuration | Domain-level VCC settings |
📈 Reporting & real-time
| | Tool | What it does | |--|------|--------------| | 🟢 | run_report | Kick off any report by folder + name, optional time range | | 🟢 | get_report_result | Poll for the report's CSV output | | 🟢 | get_realtime_stats | AgentState, ACDStatus, CampaignState, campaign statistics (incl. dialer-manager & autodial views) |
🔐 OAuth New Platform APIs (REST) — need a separate credential, see below
These tools speak Five9's modern OAuth 2.0 "New Platform" REST APIs, not the SOAP APIs the tools above use. They require an API Access Control credential (Consumer Key/Secret), not the SOAP username/password — see [OAuth New Platform APIs](#-oauth-new-platform-apis).
| | Tool | What it does | |--|------|--------------| | 🟢 | rest_check_connection | Verify the OAuth credential — acquires a bearer token (no domain data) | | 🟢✏️ | rest_call | Generic authenticated call to any New Platform endpoint (method + path + body), with rate-limit/backoff and ETag support | | 🟢✏️ | manage_circle | Circles — list / get / create / delete (no SOAP equivalent) | | 🟢 | list_np_prompts | Voice prompts via the New Platform prompts API (paginated) | | 🟢 | list_interaction_dispositions | Dispositions via the interactions API (richer than the SOAP list; read-only) | | 🟢 | get_domain_info | Domain metadata (id, name, tenant, service endpoints) | | 🟢 | list_data_tables | Data Tables (structured lookup tables; no SOAP equivalent) — uses a separate data-tables credential | | 🟢 | get_data_table_rows | Rows of a Data Table by id (paginated) |
🔐 OAuth New Platform APIs
Alongside the SOAP tools, the server can call Five9
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: ryanshatz
- Source: ryanshatz/five9-mcp
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.