Zendesk MCP Server
Read and update Zendesk tickets, search help center articles, and manage agents from Claude Code or Cursor.
Updated: April 15, 2026
Install
{
"mcpServers": {
"zendesk-mcp": {
"command": "npx",
"args": [
"-y",
"mcp-server-zendesk"
],
"env": {
"ZENDESK_SUBDOMAIN": "yourcompany",
"ZENDESK_EMAIL": "you@company.com",
"ZENDESK_API_TOKEN": "your_token"
}
}
}
}Capabilities
- + List and search tickets by status, priority, requester, or custom fields
- + Read full ticket history including internal notes and attachments
- + Add comments (public or internal) and update ticket status
- + Assign tickets to agents or groups and change priority
- + View customer (end user) profiles with identities and tags
- + Search help center articles and surface the most relevant KB entries
Limitations
- - Requires agent-level credentials; end-user tokens cannot access tickets beyond the requester
- - Macro and trigger management are not available via the MCP tools
- - Satisfaction ratings are read-only; you cannot trigger a survey send
- - No live chat integration; the tool set covers Support only (not Talk, Chat, or Sunshine)
Zendesk MCP server setup for Claude Code and Cursor
Quick answer: The Zendesk MCP server wraps the Zendesk API as MCP tools for Claude Code and Cursor. Drop in the env vars, run one npx command, and the editor can reach the service directly. Setup takes about 4 minutes, tested on mcp-server-zendesk@0.5.2 on April 15, 2026.
Zendesk is the customer support platform behind a huge share of B2C and B2B support teams. Tickets, help center, and agent workflows all run through a single REST API. Without an MCP connection, working with Zendesk means flipping between the editor and the web UI - copying IDs, pasting results, losing context. The MCP server removes that loop. Claude can fetch the data itself, reason about it, and write changes back without you switching tabs.
This guide covers install, config for both editors, prompt patterns that actually work, and the places where the API will bite back.
What this server does
The server speaks MCP over stdio and wraps the standard Zendesk SDK. The tool surface is grouped into these sets:
- Tickets:
list_tickets,search_tickets,get_ticket,update_ticket,add_comment - Users:
get_user,search_users,list_tickets_for_user - Help center:
search_articles,get_article - Organizations:
get_organization,list_organization_tickets
Authentication uses ZENDESK_SUBDOMAIN, ZENDESK_EMAIL, ZENDESK_API_TOKEN. The server holds credentials in process memory for the life of the subprocess. Nothing is written to disk by the server itself. If you rotate the credential, restart the MCP server and the new value takes effect immediately.
The server does not implement a local cache. Every tool call is a fresh round trip. For most workflows this is fine - round trip times are 100-400 ms - but it adds up on heavy batch jobs. For those, prefer the native SDK in a script.
Installing the server
The package ships on npm as mcp-server-zendesk. The npx -y prefix fetches on first launch and caches the binary for subsequent runs. Cold pull is typically 3-8 MB depending on the SDK footprint and lands in 2-4 seconds.
Before touching editor config, get your credentials ready:
- Sign in at yourcompany.zendesk.com as an admin
- Navigate to Admin > Apps and integrations > APIs > Zendesk API
- Enable Token Access and click Add API Token
- Name the token
claude-mcp-devand copy the value; it is only shown once
Keep the credential values out of any file you commit. The rest of this guide assumes they live in your shell profile or a .envrc managed by direnv.
Configuring for Claude Code
Claude Code reads MCP servers from ~/.claude/mcp.json or a per-project .mcp.json. Add a zendesk entry:
{
"mcpServers": {
"zendesk": {
"command": "npx",
"args": ["-y", "mcp-server-zendesk"],
"env": {
"ZENDESK_SUBDOMAIN": "yourcompany",
"ZENDESK_EMAIL": "you@company.com",
"ZENDESK_API_TOKEN": "your_token"
}
}
}
}
Restart Claude Code, then run /mcp in a session to confirm Zendesk is attached. Call a read-only tool as a smoke test before any write operations. If the first call returns real data, the auth is working and you can widen the prompt scope.
For team projects, commit a placeholder version of .mcp.json with ${VAR_NAME} inside the env values and let each developer provide the real credential via their shell. Claude Code expands env vars when it spawns the subprocess.
Configuring for Cursor
Cursor uses the same MCP spec and reads from ~/.cursor/mcp.json. The config is identical to Claude Code:
{
"mcpServers": {
"zendesk": {
"command": "npx",
"args": ["-y", "mcp-server-zendesk"],
"env": {
"ZENDESK_SUBDOMAIN": "yourcompany",
"ZENDESK_EMAIL": "you@company.com",
"ZENDESK_API_TOKEN": "your_token"
}
}
}
}
Open Cursor settings, navigate to the MCP tab, and toggle the server on. Cursor spawns the subprocess lazily on the first tool call. Expect 2-4 seconds of cold start and 150-500 ms per subsequent call depending on network latency to the upstream API.
If the Cursor UI shows the server as red, click the refresh icon and watch the error log. Most failures at this stage are a missing env var or a wrong file path in the credential config.
Example prompts and workflows
A few prompts that work reliably once the server is attached:
- "List every open ticket assigned to me and group them by priority."
- "Search tickets with the tag
billingupdated in the last 24 hours and summarize the top themes." - "Get ticket 12345, read the full thread, and draft a response based on our KB article about refunds."
- "Find help center articles about
ssoand rank them by helpfulness." - "Update ticket 12345 to status
solvedand add the commentFixed by clearing cache."
The model will chain calls. A triage flow usually runs list_tickets with a status:new filter, then get_ticket on each to assess severity, then update_ticket with a priority change or assign_to call. Pass the exact view ID if your team uses custom views - open-ended listing pulls hundreds of unrelated tickets.
One pattern that saves calls: narrow the scope up front. Instead of asking Claude to list every record and then filter, include the filter in the first prompt. The tool returns less data, the response is faster, and the model has less noise to reason through.
Troubleshooting
Tool call returns 401. Credentials are wrong or the API token was revoked. Regenerate under Admin > APIs and restart the server with the new value.
Tool call returns 403. The agent does not have permission on the target ticket or group. Check the agent role and group membership in the Zendesk admin console.
Search misses tickets you can see in the UI. Search queries have a 5-minute indexing delay. For very recent tickets, use list_tickets with a date filter instead of the search endpoint.
Comment fails with incident_type. Some tickets require specific fields (problem or incident) when changing status. Pass custom_status_id or type in the update call to match your workflow.
Rate limit errors. Zendesk caps at 700 requests per minute on Professional and 2,500 on Enterprise. The MCP server does not throttle; spread large batches out or use cursor-based pagination.
Server fails with ENOENT. npx is not on PATH in the env the editor inherits. On macOS, launch Claude Code or Cursor from a terminal so it inherits your shell env, or put the absolute path to npx in the command field.
Subprocess keeps restarting. The MCP transport is strict about newlines on stdio. If the server logs to stdout, those lines get treated as MCP messages and crash the client. Make sure any logging goes to stderr only (most well-built servers already do this).
Alternatives
A few options if the Zendesk server does not fit your setup:
intercom-mcptargets Intercom for teams on that platform, with a conversation-first model.freshdesk-mcpcovers Freshdesk, a lower-cost Zendesk alternative.helpscout-mcpworks with Help Scout for teams that prefer its email-centric UI.
The MCP server pays off during support triage and on-call shifts where Claude can draft replies grounded in help center content, flag escalations, and bulk-update ticket state.
Performance notes and hardening
Steady-state call latency lands in the 150-500 ms range for most tools. For latency-sensitive workflows, place the editor close to the upstream API region - a Claude Code session in us-east-1 calling an EU-only endpoint will see 120+ ms of extra RTT on every tool call.
For production credentials, prefer scoped tokens over root credentials. Most services expose fine-grained permission models; use them. A token that can only read is strictly safer than one that can write, and costs nothing to rotate.
Log review is easier if you redirect MCP subprocess stderr to a file. Most editors do this by default, but not all surface the log path. On macOS, check ~/Library/Logs/Claude/ or the Cursor equivalent.
The Zendesk MCP server is the right default for any workflow that already touches Zendesk regularly. A few minutes of setup replaces hours of copy-paste between the editor and the service's web UI. Start with a read-only credential scoped to a single resource, then widen scopes after you trust the prompt patterns your team develops.
Guides
Frequently asked questions
Does the server require a Zendesk admin token?
Agent-level works for most reads and writes. Admin-only endpoints (user creation, role changes) need admin credentials. Start with the lowest-privilege token that covers your use case, and narrow the role in Zendesk rather than hiding writes in the MCP layer.
Can it manage macros or triggers?
Not in the current release. Automation objects have a separate API and more complex write semantics. For those, use the Zendesk admin UI or the `zcli` command-line tool.
How does it handle ticket merging?
Ticket merge is not exposed. Do merges in the web UI, then the merged ticket ID shows up in subsequent read calls. Claude can help draft the merge summary comment, but cannot trigger the merge itself.
Are attachments readable?
The server returns attachment metadata (file name, size, content type) and a download URL. Download the binary yourself if you need to read a PDF or image - the MCP transport is not tuned for large payload pass-through.
Is there a way to query across multiple Zendesk subdomains?
One subdomain per server instance. For multi-brand setups with separate subdomains, run multiple MCP entries with distinct names and credentials.
Does it support the Zendesk Help Center API for CRUD on articles?
Read is supported; you can search and fetch articles. Creating or updating articles is not in the current tool surface because the version history model is easy to break with prompt-generated edits. Use the admin UI for article edits.