zendesk_add_tag
Add a tag to a Zendesk ticket. Idempotent: adding an existing tag returns the current tag list without modifying the ticket. Returns JSON with ticket_id and current tags.
Work Zendesk tickets end to end — search, read, reply, assign, tag, apply macros and log time.
LABSCO SUMMARY
Replying to the customer and noting something for colleagues are two different tools rather than one tool with a flag, which is the distinction an agent is most likely to get wrong. The handoff tool is the other thing worth noticing: it turns a ticket and its whole conversation into a Markdown issue draft with an empty reproduction section — exactly the shape a bug tracker wants, and the step that usually gets done badly by hand.
A Zendesk server covering an agent's day: tickets searched, listed and read with their conversation and attachments; public replies and internal notes posted; status, assignee, tags and fields updated; views and macros browsed and applied; users, groups and organisations looked up; and time logged. Two prompts ship with it, surfacing as slash commands in clients that support them.
Python 3.10 or newer, installed into a virtual environment. A Zendesk OAuth client that an admin creates on your instance with read and write scopes and a localhost callback URL; an interactive setup opens the browser once and stores the token locally. The Git-Zen tool needs that Zendesk app installed, and does nothing without it.
One command, then sign in — uvx zendesk-mcp, then approve the OAuth sign-in
USE CASES
Read the ticket, then the whole thread including the internal notes, before deciding anything.
Search by keyword and status, or open a saved view and take what currently matches it.
Write the customer-facing response with the right tool, and leave the working notes on the agent-only one.
Set the status, assign it to the right agent by email, and tag it — tagging twice changes nothing.
List the macros, preview exactly what one would change, then apply it.
Format the ticket and its conversation as a Markdown issue draft, and check what is already linked to it.
Read the running total on the ticket and add what this session took.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
zendesk_add_tagAdd a tag to a Zendesk ticket. Idempotent: adding an existing tag returns the current tag list without modifying the ticket. Returns JSON with ticket_id and current tags.
zendesk_apply_macroApply a macro to a Zendesk ticket. Fetches the macro preview, applies field changes, and posts any comment included in the macro. Returns JSON with id, status, tags, applied_changes, comment_added.
zendesk_assign_ticketAssign a Zendesk ticket to an agent by their email address. Pass 'me' as assignee_email to assign the ticket to yourself (the authenticated user).
zendesk_create_ticketCreate a new Zendesk ticket. subject and description are required. priority: low/normal/high/urgent. type: problem/incident/question/task. requester_id/assignee_id are user IDs (integers). custom_fields is a list of {id, value} dicts. Returns JSON of the created ticket.
zendesk_download_attachmentDownload a Zendesk attachment. Obtain attachment_url and filename from zendesk_list_attachments. ticket_id is required for cache organization. Optional dest_dir overrides the default cache location; the file is written there and (for archives) extracted alongside it. Archives return a file list and unpack_dir — read individual files with your normal file tools. PDFs return up to ~500KB of extracted text. Images are base64-encoded.
zendesk_get_commentsGet all comments (public replies and internal notes) for a Zendesk ticket. Includes attachment metadata but does not download files.
zendesk_get_git_zen_linksGet linked GitLab issues, merge requests, and commits for a Zendesk ticket via the Git-Zen integration. Returns structured lists with state, labels, weight, and direct GitLab links.
zendesk_get_group_usersList the members of a Zendesk group. Returns JSON array of {id, name, email}.
zendesk_get_groupsList all active Zendesk groups (excluding deleted). Returns JSON array of {id, name}.
zendesk_get_organizationFetch a Zendesk organization including its custom fields and tags. Returns JSON with id, name, organization_fields, tags, created_at, updated_at.
zendesk_get_ticketGet a Zendesk ticket by ID. Returns ticket fields including status, priority, requester, assignee, tags, and description.
zendesk_get_ticketsList Zendesk tickets with pagination. page: 1-based page number. per_page: max 100. sort_by: created_at, updated_at, priority, or status. sort_order: asc or desc. Returns tickets plus pagination metadata.
zendesk_get_time_trackingGet time tracking data for a Zendesk ticket. Returns total time spent and time spent on the last update, in both seconds and human-readable format (e.g. '2h 15m').
zendesk_get_viewGet a Zendesk view's definition including filter conditions and execution settings. Returns JSON with id, title, active, conditions, execution.
zendesk_get_view_ticketsGet the tickets currently matching a Zendesk view. Returns JSON array of tickets with essential fields.
zendesk_list_attachmentsList all attachments across all comments for a Zendesk ticket. Returns filename, content type, size, and download URL for each. Use zendesk_download_attachment to fetch file contents.
zendesk_list_custom_statusesList all custom ticket statuses defined in Zendesk. Returns JSON array of {id, agent_label, end_user_label, status_category, active, default}. Use the id when setting custom_status_id on a ticket.
zendesk_list_macrosList all active Zendesk macros with their actions. Returns JSON array of {id, title, description, actions: [{field, value}]}.
zendesk_list_viewsList all active Zendesk views. Returns JSON array of {id, title}.
zendesk_log_timeLog time spent on a Zendesk ticket. Adds seconds to the running total and records it as the last-update time. Returns logged amount and new total in seconds and human-readable format.
zendesk_post_commentPost a public reply on a Zendesk ticket. The reply is visible to the requester. Use for customer-facing responses.
zendesk_post_internal_notePost an internal note on a Zendesk ticket. Internal notes are only visible to agents and are not sent to the requester.
zendesk_preview_macroPreview the effect a macro would have (without applying it). Returns the result payload from Zendesk's apply preview endpoint.
zendesk_remove_tagRemove a tag from a Zendesk ticket. Idempotent: removing a tag that isn't present returns the current tag list without modifying the ticket. Returns JSON with ticket_id and current tags.
zendesk_search_ticketsSearch Zendesk tickets by keyword and/or status. keywords: free-text search (e.g. 'login failure LDAP'). status: new, open, pending, hold, solved, closed — leave empty for all statuses. Returns id, subject, status, requester, assignee, and dates.
zendesk_search_usersSearch Zendesk users by name or email. Returns JSON array of {id, name, email, role}.
zendesk_set_ticket_statusSet the status of a Zendesk ticket. Valid statuses: new, open, pending, hold, solved, closed.
zendesk_ticket_to_gitlab_contextFormat a Zendesk ticket and its comments as an issue draft. Returns Markdown with ticket metadata, full conversation, and an empty Steps to Reproduce section. Use this output as the description when creating an issue in your tracker.
zendesk_update_ticketUpdate one or more fields on a Zendesk ticket. Pass only the fields you want to change. status: new/open/pending/hold/solved/closed. priority: low/normal/high/urgent. type: problem/incident/question/task. assignee_id, requester_id, group_id, custom_status_id are integer IDs. due_at is ISO8601. Returns JSON of the refreshed ticket.
BEFORE YOU INSTALL
29 tools when we connected. zendesk_get_git_zen_links returns a 'not configured' message until you set git_zen_field_id.
CONTEXT COST
Rated by the size of the 29 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
Clone the repository and install it into a virtualenv
git clone https://github.com/michaelrice/zendesk-mcp.git
cd zendesk-mcp
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -e .Run the interactive setup using the venv's Python
.venv/bin/python -m zendesk_mcp setupuvx zendesk-mcpFrom the repository root, after install, register the server with the venv's Python by absolute path:
ZENDESK_MCP_DIR="$(pwd)"
claude mcp add --scope user zendesk -- "$ZENDESK_MCP_DIR/.venv/bin/python" -m zendesk_mcpOptionally, add the read tools to permissions.allow in ~/.claude/settings.json to avoid per-call prompts:
{
"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"
]
}
}