Labsco
michaelrice logo

zendesk-mcp

from michaelrice

Zendesk MCP server: read/write tickets, comments, attachments, time-tracking, and OAuth-based setup. Optional Git-Zen integration.

๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅโœ“ VerifiedFreeAdvanced setup

zendesk-mcp

A Model Context Protocol server that exposes Zendesk ticket read and write tools to Claude Code and other MCP clients.

What it does

  • Search, list (paginated), and fetch Zendesk tickets, comments, and attachments
  • Create new tickets and update existing ticket fields (including group, custom status, and tags)
  • Post public replies and internal notes
  • Set ticket status and assign tickets to agents
  • Browse and apply views and macros
  • Look up users, groups, organizations, and custom statuses
  • Read and write time-tracking entries
  • Format a ticket as a Markdown issue draft for handoff to a tracker (GitLab, GitHub, Jira)
  • Two MCP prompts (analyze-ticket, draft-ticket-response) for ticket analysis and response drafting
  • (Optional) Expose Zendesk Help Center articles as an MCP resource
  • (Optional) Read linked GitLab issues / MRs / commits via the Git-Zen Zendesk app

Register with Claude Code

Register the MCP server using the venv's Python by absolute path. Claude Code launches the server in a fresh shell that does not inherit your activated venv, so the absolute path is required โ€” pointing at a bare python here will fail to import zendesk_mcp.

Copy & paste โ€” that's it
ZENDESK_MCP_DIR="$(pwd)"   # run this from the repo root, after install
claude mcp add --scope user zendesk -- "$ZENDESK_MCP_DIR/.venv/bin/python" -m zendesk_mcp

Or just inline the absolute path you want:

Copy & paste โ€” that's it
claude mcp add --scope user zendesk -- /absolute/path/to/zendesk-mcp/.venv/bin/python -m zendesk_mcp

Then add the read tools to permissions.allow in ~/.claude/settings.json to avoid per-call prompts:

Copy & paste โ€” that's it
{
  "permissions": {
    "allow": [
      "mcp__zendesk__zendesk_get_ticket",
      "mcp__zendesk__zendesk_get_tickets",
      "mcp__zendesk__zendesk_get_comments",
      "mcp__zendesk__zendesk_list_attachments",
      "mcp__zendesk__zendesk_download_attachment",
      "mcp__zendesk__zendesk_search_tickets",
      "mcp__zendesk__zendesk_ticket_to_gitlab_context",
      "mcp__zendesk__zendesk_list_views",
      "mcp__zendesk__zendesk_get_view",
      "mcp__zendesk__zendesk_get_view_tickets",
      "mcp__zendesk__zendesk_list_macros",
      "mcp__zendesk__zendesk_preview_macro",
      "mcp__zendesk__zendesk_search_users",
      "mcp__zendesk__zendesk_get_groups",
      "mcp__zendesk__zendesk_get_group_users",
      "mcp__zendesk__zendesk_get_organization",
      "mcp__zendesk__zendesk_list_custom_statuses"
    ]
  }
}

Write tools (zendesk_post_comment, zendesk_post_internal_note, zendesk_set_ticket_status, zendesk_assign_ticket, zendesk_create_ticket, zendesk_update_ticket, zendesk_log_time, zendesk_add_tag, zendesk_remove_tag, zendesk_apply_macro) are intentionally not in the default allow-list โ€” Claude will prompt you per call.

Tools

Tickets

ToolWhat it does
zendesk_search_ticketsSearch tickets by status, priority, type, assignee, requester, tags, or keyword
zendesk_get_ticketsList tickets with pagination and sorting (page, per_page, sort_by, sort_order)
zendesk_get_ticketGet one ticket's metadata
zendesk_create_ticketCreate a new ticket (subject, description, optional priority/type/assignee_id/requester_id/tags/custom_fields)
zendesk_update_ticketUpdate one or more fields on an existing ticket (status, priority, subject, type, assignee_id, requester_id, group_id, custom_status_id, tags, custom_fields, due_at)
zendesk_get_commentsGet the conversation thread on a ticket
zendesk_list_attachmentsList attachments on a ticket
zendesk_download_attachmentDownload an attachment to a local cache directory
zendesk_ticket_to_gitlab_contextFormat a ticket and its conversation as a Markdown issue draft
zendesk_post_commentPost a public reply on a ticket
zendesk_post_internal_notePost an agent-only internal note on a ticket
zendesk_set_ticket_statusSet ticket status (new, open, pending, hold, solved, closed)
zendesk_assign_ticketAssign a ticket to an agent by email or me

Tags

ToolWhat it does
zendesk_add_tagAdd a tag to a ticket (idempotent)
zendesk_remove_tagRemove a tag from a ticket (idempotent)

Views & Macros

ToolWhat it does
zendesk_list_viewsList all active views
zendesk_get_viewGet a view's filter conditions and execution settings
zendesk_get_view_ticketsFetch tickets currently matching a view
zendesk_list_macrosList active macros with their actions
zendesk_preview_macroPreview what changes a macro would make
zendesk_apply_macroApply a macro to a ticket (applies field changes and posts any comment)

Users, Groups & Organizations

ToolWhat it does
zendesk_search_usersFind users by name or email
zendesk_get_groupsList all active groups
zendesk_get_group_usersList the members of a group
zendesk_get_organizationFetch an organization including custom fields
zendesk_list_custom_statusesList all custom ticket statuses and their IDs

Time tracking

ToolWhat it does
zendesk_get_time_trackingRead time-tracking entries for a ticket
zendesk_log_timeLog a time entry against a ticket

Git-Zen integration

ToolWhat it does
zendesk_get_git_zen_links(Git-Zen only) Get linked GitLab issues / MRs / commits for a ticket

Prompts

The server exposes two MCP prompts that some clients (e.g. Claude Desktop) surface as slash commands:

PromptArgumentWhat it does
analyze-ticketticket_idAsks the model to fetch the ticket and produce a summary, status/timeline, and key interaction points
draft-ticket-responseticket_idAsks the model to fetch the ticket and draft a customer-facing response (with a confirmation step before posting)

Optional: Git-Zen integration

If your Zendesk instance uses the Git-Zen app, the zendesk_get_git_zen_links tool can read its custom-field payload. Find your instance's Git-Zen custom field ID under Admin โ†’ Tickets โ†’ Fields (it is a numeric ID), then either set it during .venv/bin/python -m zendesk_mcp setup or edit ~/.config/zendesk-mcp/config.json to add:

Copy & paste โ€” that's it
{
  "git_zen_field_id": 12345678901234
}

Without this configured, zendesk_get_git_zen_links returns a "not configured" message.

Optional: Help Center knowledge base

If your Zendesk instance has a published Help Center, you can expose its sections and articles as the zendesk://knowledge-base MCP resource. The resource returns a single JSON document covering all sections and articles, cached for one hour.

This is opt-in. Enable it by either answering "y" to the prompt during .venv/bin/python -m zendesk_mcp setup, or by adding the following to ~/.config/zendesk-mcp/config.json:

Copy & paste โ€” that's it
{
  "knowledge_base_enabled": true
}

When the flag is absent or false, the resource is not registered, keeping the server's resource list empty for instances without a Help Center.

Development

Copy & paste โ€” that's it
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/pytest

Tests run on Python 3.10, 3.11, and 3.12 in CI (see .github/workflows/test.yml).

License

Apache-2.0

<!-- mcp-name: io.github.michaelrice/zendesk-mcp -->