MCP server for the Five9 cloud contact center on Cloudflare Workers
This HTTP-based Five9 MCP server demonstrates solid definition quality with consistent verb-noun naming, mostly complete schemas, and clear descriptions. However, there are notable gaps in parameter documentation, missing output schema definitions, error handling guidance, and incomplete parameter descriptions that prevent a higher score. The server handles 15 tools managing Five9 campaigns, profiles, and skills, all well-scoped with appropriate names. Descriptions are generally actionable (median ~150 chars), though several parameters lack depth. Input schemas are present for all tools with proper type constraints (enums, required fields, additionalProperties: false), but output schemas are entirely undocumented. Error recovery guidance is absent. Security considerations are not visible (e.g., no permission gating, audit logging patterns). The average per-tool score across 15 tools is 72, reflecting consistent B-grade work.
Who operates this server, why it exists, and how to work with it. Call this when you need context about the operator or ground rules.
Verify that the Worker can authenticate to Five9. Returns the number of skills visible to the configured user. Run this first if other tools are failing.
Control a Five9 campaign's runtime state by exact name: start, stop (graceful), force_stop (drops active calls), reset (re-enables dialed records), or reset_list_positions (restart lists from the top).
Create a new Five9 campaign. type outbound or inbound; mode BASIC (default) or ADVANCED (requires profile_name from list_campaign_profiles). Outbound extras: dialing_mode (PREDICTIVE/PROGRESSIVE/PREVIEW/POWER), auto_record. Inbound extras: max_lines. The campaign is created NOT_RUNNING — attach lists/skills/DNIS, then start it with control_campaign.
Permanently delete a Five9 campaign. Irreversible — confirm with the user first.
No output schemas documented. Tools return structured JSON but the schema (field names, types, required fields) is not documented in tool definitions or in inline schema. LLMs cannot reliably extract returned data or plan downstream tool calls without knowing return structure.
Parameter descriptions are sparse or generic. For example, 'changes' in modify_campaign says 'Field → new value, using get_campaign_details field names' but does not document what fields are valid, constraints, or data types. 'profile_name' in create_campaign lacks guidance on where to find valid profile names.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 80 | 2026-07-28+ | v2 |
Get a campaign's FULL configuration (dialing mode, ratios, recording, wrap-up, timeouts, etc.). Works for outbound, inbound, and autodial campaigns. Use before modify_campaign to see current values.
Get skills with their assigned users. Optional regex pattern filters by skill name.
List campaign profiles (ANI, dialing timeout, attempts, call priority). ADVANCED campaigns require one. Optional regex pattern filters by name.
List Five9 campaigns (name, type, state, mode). Optional regex pattern filters by campaign name.
Add or remove dispositions available to agents on a campaign.
Attach or detach DNIS (inbound numbers) on an inbound campaign. Use list_dnis to see available numbers.
Create, modify, or delete a campaign profile. For create: fields like {"name": "...", "description": "...", "ANI": "5551234567", "numberOfAttempts": 3, "dialingTimeout": 30}. For modify: pass name plus only the fields to change.
Add or remove routing skills on a campaign (controls which agents get its calls).
Edit an existing campaign's configuration. Fetches the full campaign, merges your changes, and writes it back — so you only pass the fields you want to change (field names as returned by get_campaign_details, e.g. {"description": "...", "dialingMode": "PREVIEW", "autoRecord": true, "profileName": "..."}).
Rename a Five9 campaign.
No error recovery guidance. Tools document what they do but not what can go wrong or how the LLM should respond to failures. For example, delete_campaign says 'Irreversible, confirm with the user first' but provides no structured confirmation mechanism (dry-run, confirmation step) or error message format.
No pagination support documented. list_campaigns and list_campaign_profiles accept a regex filter but no limit or offset parameters. Descriptions do not state whether results are capped and whether pagination is supported. Large result sets risk exhausting the context window.
Missing parameter descriptions. 'pattern' parameters in list_campaigns, list_campaign_profiles, and get_skill_details are described as 'Java-style regex' but lack context on what happens if pattern matches nothing, whether it is case-insensitive, or what the default is (stated as '.*' but not explicit in schema).
rename_campaign has minimal description ('Rename a Five9 campaign.') providing no context on behavior, idempotency, or whether renaming a running campaign is allowed. Does not clarify whether the new name must be unique or what happens if a campaign with that name already exists.
Tool composition may require discovery detours. create_campaign requires a 'profile_name' for ADVANCED mode but the description says 'required for ADVANCED mode', the LLM must call list_campaign_profiles separately. Similarly, manage_campaign_dnis references 'Use list_dnis' but no such tool is visible in the schema. This suggests incomplete tool inventory or documentation.
No permission gating or audit logging visible. Tools that delete or modify campaigns (delete_campaign, control_campaign, modify_campaign) do not declare required permissions or hint at audit mechanisms. Agents invoking these without explicit safeguards risk undetected destructive actions.
manage_campaign_profile 'fields' parameter is too generic. Description says 'Profile fields (create/modify)' with additionalProperties: true, but does not enumerate valid field names or constraints. LLMs will guess at field names, leading to API errors.