A Model Context Protocol (MCP) server that provides AI assistants like Claude with seamless integration to Zendesk Support. Enables natural language interactions with Zendesk tickets, allowing you to search, create, update, and manage support tickets through conversational AI.
- π« Complete Ticket Management: Create, read, update, and search Zendesk tickets
- π¬ Comments & Notes: Add public comments and private internal notes
- π Advanced Search: Search tickets using Zendesk's powerful query syntax
- π Incident Management: Retrieve and manage linked incident tickets
- π·οΈ Tag Management: Add and manage ticket tags and metadata
- β‘ Macro Automation: List, retrieve, and apply Zendesk macros to tickets. Enables creating localized draft messages for internal notes based on requester language
- π Dynamic Content: Access localized content items and variants based on ticket locale. Perfect for generating multilingual draft messages for internal team communication
- π Secure Authentication: Uses Zendesk API tokens for secure access
- π Easy Installation: Available via npm, npx, or manual setup
npm install -g zd-mcp-servernpx zd-mcp-servergit clone https://github.com/plusadd/zd-mcp-server.git
cd zd-mcp-server
npm install
npm run buildSet these environment variables in your system or MCP client configuration:
export ZENDESK_EMAIL="your-email@company.com"
export ZENDESK_TOKEN="your-zendesk-api-token"
export ZENDESK_SUBDOMAIN="your-company" # from https://your-company.zendesk.comAdd to your Claude Desktop configuration file:
Location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%/Claude/claude_desktop_config.json
Configuration:
{
"mcpServers": {
"zendesk": {
"command": "npx",
"args": ["-y", "zd-mcp-server"],
"env": {
"ZENDESK_EMAIL": "your-email@company.com",
"ZENDESK_TOKEN": "your-zendesk-api-token",
"ZENDESK_SUBDOMAIN": "your-company"
}
}
}
}Alternative (if installed globally):
{
"mcpServers": {
"zendesk": {
"command": "zd-mcp-server",
"env": {
"ZENDESK_EMAIL": "your-email@company.com",
"ZENDESK_TOKEN": "your-zendesk-api-token",
"ZENDESK_SUBDOMAIN": "your-company"
}
}
}
}Add to ~/.cursor/mcp.json or .cursor/mcp.json in your project:
{
"mcpServers": {
"zendesk": {
"command": "npx",
"args": ["-y", "zd-mcp-server"],
"env": {
"ZENDESK_EMAIL": "your-email@company.com",
"ZENDESK_TOKEN": "your-zendesk-api-token",
"ZENDESK_SUBDOMAIN": "your-company"
}
}
}
}For other MCP-compatible clients (Cline, Windsurf, etc.), refer to their documentation for MCP server configuration. The server supports standard MCP protocols.
| Tool | Description | Example Usage |
|---|---|---|
zendesk_get_ticket |
Retrieve a ticket by ID | "Get ticket #12345" |
zendesk_get_ticket_details |
Get detailed ticket with comments | "Show me full details for ticket #67890" |
zendesk_search |
Search tickets with query syntax | "Find all urgent tickets from last week" |
zendesk_create_ticket |
Create a new ticket | "Create a high priority ticket for login issues" |
zendesk_update_ticket |
Update ticket properties | "Set ticket #555 to solved status" |
zendesk_add_private_note |
Add internal agent notes | "Add a private note about investigation progress" |
zendesk_add_public_note |
Add public customer comments | "Reply to customer with solution steps" |
zendesk_get_linked_incidents |
Get incident tickets linked to problems | "Show incidents related to this problem ticket" |
zendesk_list_macros |
List all available macros | "Show me all available macros" |
zendesk_search_macros |
Search macros by title | "Search for macros containing 'close'" |
zendesk_get_macro |
Get details of a specific macro | "Get details for macro #1010" |
zendesk_apply_macro |
Apply a macro to a ticket | "Apply macro #1010 to ticket #12345" |
zendesk_list_dynamic_content_items |
List all dynamic content items | "List all dynamic content items" |
zendesk_get_dynamic_content_item |
Get details of a dynamic content item | "Get details for dynamic content item #123" |
zendesk_get_dynamic_content_item_variants |
Get all variants of a dynamic content item | "Show all variants for dynamic content item #123" |
zendesk_get_dynamic_content_for_ticket |
Get localized content for a ticket | "Get dynamic content 'welcome_message' for ticket #12345" |
Once configured, you can use natural language with your AI assistant:
"Show me all high priority tickets assigned to me"
"Create a new ticket: Customer can't access dashboard, priority urgent"
"Update ticket #12345 status to pending and add a note about waiting for customer response"
"Find all solved tickets from this week tagged with 'billing'"
"Search for open tickets containing 'password reset'"
"Show me tickets created by john@company.com in the last 30 days"
"Add a public comment to ticket #789: 'We've identified the issue and working on a fix'"
"Add a private note: 'Customer confirmed the workaround is effective'"
"Find all problem tickets that have linked incidents"
"Show me escalated tickets that haven't been updated in 2 days"
"Get details for ticket #456 including all comments and history"
"List all available macros"
"Search for macros containing 'close'"
"Show me details for macro #1010"
"Apply macro #1010 to ticket #12345"
"Apply the 'problem investigation' macro to all open tickets tagged 'urgent'"
"List all dynamic content items"
"Get all variants for dynamic content item 'welcome_message'"
"Get the localized version of 'welcome_message' for ticket #12345 based on the ticket's locale"
"Get macro #1010 and create a draft internal note in the requester's language for ticket #12345"
"Retrieve the 'problem investigation' macro content and get the localized dynamic content for ticket #456, then prepare a draft private note"
"Get macro #1010, find the dynamic content variant matching ticket #789's locale, and create a draft internal note"
- Log in to your Zendesk account
- Go to Admin Center β Apps and integrations β APIs β Zendesk API
- Click Add API token
- Add description: "MCP Server Integration"
- Click Create and copy the token
- Important: Save this token securely - you won't see it again
Your Zendesk URL format: https://YOUR-SUBDOMAIN.zendesk.com
Use YOUR-SUBDOMAIN as the ZENDESK_SUBDOMAIN value.
Ensure your Zendesk user account has:
- Agent role (minimum)
- Ticket access permissions
- API access enabled
zd-mcp-server/
βββ src/
β βββ index.ts # Server entry point
β βββ tools/
β βββ index.ts # Zendesk tool implementations
βββ dist/ # Compiled JavaScript
βββ package.json
βββ tsconfig.json
βββ README.md
git clone https://github.com/plusadd/zd-mcp-server.git
cd zd-mcp-server
npm install
npm run build# Start the server
npm start
# Development mode with auto-rebuild
npm run dev# Test with MCP Inspector (if available)
npx @modelcontextprotocol/inspector zd-mcp-server
# Or test the built version
npx @modelcontextprotocol/inspector node dist/index.jsβ "Authentication failed" errors
- Verify your API token is correct and hasn't expired
- Ensure your email address matches your Zendesk account
- Check that your subdomain is spelled correctly (no
.zendesk.comsuffix)
β "Permission denied" errors
- Verify your Zendesk user has Agent permissions or higher
- Ensure API access is enabled for your account
- Check if your token has the required scopes
β "Server not found" errors
- Ensure you've installed the package:
npm install -g zd-mcp-server - Try using npx instead:
npx zd-mcp-server - Check that your MCP client configuration file syntax is correct
β "Environment variables not set" errors
- Verify all three environment variables are set:
ZENDESK_EMAIL,ZENDESK_TOKEN,ZENDESK_SUBDOMAIN - Restart your MCP client after setting environment variables
- Check for typos in environment variable names
Enable debug logging:
DEBUG=zd-mcp-server:* zd-mcp-serverCheck MCP client logs:
- Claude Desktop:
~/Library/Logs/Claude/(macOS) or%APPDATA%/Claude/logs/(Windows) - Cursor: Check the output panel for MCP server logs
- Terminal: Run server directly to see real-time logs
Zendesk search supports powerful query operators:
# Status-based searches
status:open status:pending status:solved
# Priority searches
priority:urgent priority:high priority:normal priority:low
# Date-based searches
created>2024-01-01 updated<2024-01-31
# Tag searches
tags:billing tags:technical-issue
# Requester searches
requester:customer@company.com
# Complex combinations
status:open priority:high created>2024-01-01 tags:billingWhile the server doesn't directly support batch operations, you can chain commands:
"Search for all urgent tickets, then show me details for the first 3 results"
"Find tickets tagged 'billing', update them to normal priority, and add a note about the billing system maintenance"
Macros are predefined actions that can be applied to tickets to automate common workflows. Use macros to:
- Apply standardized responses and actions
- Update ticket status, priority, or assignee
- Add comments or tags automatically
Note: When applying macros, they typically add public comments. To apply macro content as a private note, you'll need to retrieve the macro content first and then add it as a private note separately.
Use Case: One of the primary use cases for macros in this server is to create draft internal notes (private comments) that are localized based on the requester's language. By combining macro content with Dynamic Content, you can generate draft messages in the appropriate language for internal team communication.
Dynamic Content allows you to store and retrieve localized content that adapts to the ticket's language/locale. This is useful for:
- Multi-language support tickets
- Providing localized responses based on customer language
- Managing content variations for different regions
The server automatically matches content to the ticket's locale (based on requester or ticket locale), falling back to default variants when needed.
Use Case: Combined with macros, Dynamic Content enables creating localized draft messages for internal notes. For example, you can retrieve a macro template and then get the appropriate localized version of dynamic content items based on the ticket requester's language, allowing support agents to prepare draft internal notes in the customer's language for better context and communication.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Found a bug? Please open an issue with:
- Description of the problem
- Steps to reproduce
- Expected behavior
- Your environment (OS, Node.js version, MCP client)
- Relevant log outputs
This project is licensed under the MIT License - see the LICENSE file for details.
- GitHub: https://github.com/plusadd/zd-mcp-server
- npm: https://www.npmjs.com/package/zd-mcp-server
- Zendesk API Docs: https://developer.zendesk.com/api-reference/
- Model Context Protocol: https://modelcontextprotocol.io/
- Issues: GitHub Issues
- Zendesk API: Zendesk Developer Documentation
- MCP Protocol: MCP Documentation
Made with β€οΈ for the MCP and Zendesk communities