zendesk-mcp
zendesk-mcp
Сервер Model Context Protocol, который предоставляет инструменты чтения и записи тикетов Zendesk для Claude Code и других MCP-клиентов.
Что он делает
Поиск, список (с пагинацией) и получение тикетов Zendesk, комментариев и вложений
Создание новых тикетов и обновление существующих полей тикетов (включая группу, пользовательский статус и теги)
Публикация публичных ответов и внутренних заметок
Установка статуса тикета и назначение тикетов агентам
Просмотр и применение представлений и макросов
Поиск пользователей, групп, организаций и пользовательских статусов
Чтение и запись записей учёта времени
Форматирование тикета как черновика задачи в Markdown для передачи в трекер (GitLab, GitHub, Jira)
Два MCP-промпта (
analyze-ticket,draft-ticket-response) для анализа тикета и составления ответа(Опционально) Предоставление статей Справочного центра Zendesk как MCP-ресурса
(Опционально) Чтение связанных задач / MR / коммитов GitLab через приложение Git-Zen Zendesk
Related MCP server: Zendesk MCP Server
Предварительные требования
Python 3.10 или новее
OAuth-клиент Zendesk. Администратор Zendesk может создать его по адресу:
https://<ваш-субдомен>.zendesk.com/admin/apps-integrations/apis/zendesk-api/oauth_clientsУстановите URL перенаправленияhttp://localhost:8787/callbackи запросите областиread write.
Установка
Установите в локальный виртуальный окружение проекта. Использование venv изолирует zendesk-mcp и его зависимости от системного Python и других проектов, и это рекомендуемый путь для всего нижеследующего.
Из клона этого репозитория:
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -e .Для разработки (также устанавливает pytest):
.venv/bin/pip install -e ".[dev]"В этом README команды используют бинарники venv через
.venv/bin/.... Вы можете вместо этого выполнитьsource .venv/bin/activateодин раз в каждом shell и опустить префикс — результат тот же.
Настройка OAuth
Запустите интерактивную настройку, используя Python из venv:
.venv/bin/python -m zendesk_mcp setupВам будет предложено:
Ваш субдомен Zendesk (например,
acmeдляacme.zendesk.com)ID OAuth-клиента, созданный вашим администратором
Секрет OAuth-клиента
(Опционально) ID поля интеграции Git-Zen — см. Опционально: интеграция Git-Zen
(Опционально) Включить ли ресурс базы знаний Справочного центра — см. Опционально: база знаний Справочного центра
Настройка открывает браузер для шага авторизации OAuth, затем записывает токен в ~/.config/zendesk-mcp/config.json (режим 0600).
Если у вас нет браузера, URL выводится в терминал — откройте его на любом устройстве, нажмите Allow и вставьте полученный URL перенаправления обратно в запрос.
Срок действия токена и обновление
Токены доступа Zendesk истекают. OAuth-клиенты, созданные 2026-04-30 или позже, получают срок действия по умолчанию 30 минут; более старые клиенты выдают бессрочные токены, если не запрошен срок действия. Настройка запрашивает токен доступа на 24 часа и refresh-токен на 90 дней, чтобы поведение было одинаковым в любом случае, и сервер автоматически обновляет токен доступа — до его истечения, а также если Zendesk отклоняет токен в середине запроса.
Чтобы это было возможно, файл конфигурации также хранит refresh_token, expires_at, client_id и client_secret вместе с токеном доступа. Держите файл в режиме 0600; он имеет тот же уровень доверия, что и сам токен доступа. Если ваш OAuth-клиент не возвращает refresh-токен, настройка сообщает об этом, и токен используется как есть.
Повторно запустите .venv/bin/python -m zendesk_mcp setup, когда:
истекает refresh-токен (90 дней без использования), или
вы отзываете разрешение OAuth в Zendesk.
В любом случае инструменты возвращают Zendesk authorization failed: ... Re-run: zendesk-mcp setup вместо непрозрачной ошибки.
Регистрация в Claude Code
Зарегистрируйте MCP-сервер, используя Python из venv по абсолютному пути. Claude Code запускает сервер в новом shell, который не наследует ваш активированный venv, поэтому абсолютный путь обязателен — указание голого python здесь приведёт к ошибке импорта zendesk_mcp.
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Или просто укажите нужный абсолютный путь:
claude mcp add --scope user zendesk -- /absolute/path/to/zendesk-mcp/.venv/bin/python -m zendesk_mcpЗатем добавьте инструменты чтения в permissions.allow в ~/.claude/settings.json, чтобы избежать запросов при каждом вызове:
{
"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"
]
}
}Инструменты записи (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) намеренно не включены в список разрешений по умолчанию — Claude будет запрашивать подтверждение при каждом вызове.
Инструменты
Тикеты
Инструмент | Что делает |
| Поиск тикетов по статусу, приоритету, типу, исполнителю, запросившему, тегам или ключевому слову |
| Список тикетов с пагинацией и сортировкой (page, per_page, sort_by, sort_order) |
| Получение метаданных одного тикета |
| Создание нового тикета (тема, описание, опционально приоритет/тип/assignee_id/requester_id/теги/custom_fields) |
| Обновление одного или нескольких полей существующего тикета (статус, приоритет, тема, тип, assignee_id, requester_id, group_id, custom_status_id, теги, custom_fields, due_at) |
| Получение цепочки обсуждения по тикету |
| Список вложений в тикете |
| Скачивание вложения в локальный кэш-каталог |
| Форматирование тикета и его обсуждения как черновика задачи в Markdown |
| Публикация публичного ответа в тикете |
| Публикация внутренней заметки только для агентов в тикете |
| Установка статуса тикета ( |
| Назначение тикета агенту по email или |
Теги
Инструмент | Что делает |
| Добавление тега к тикету (идемпотентно) |
| Удаление тега из тикета (идемпотентно) |
Представления и макросы
Инструмент | Что делает |
| Список всех активных представлений |
| Получение условий фильтра и настроек выполнения представления |
| Получение тикетов, соответствующих представлению |
| Список активных макросов с их действиями |
| Предпросмотр изменений, которые применит макрос |
| Применение макроса к тикету (применяет изменения полей и публикует комментарий) |
Пользователи, группы и организации
Инструмент | Что делает |
| Поиск пользователей по имени или email |
| Список всех активных групп |
| Список участников группы |
| Получение организации, включая пользовательские поля |
| Список всех пользовательских статусов тикетов и их ID |
Учёт времени
Инструмент | Что делает |
| Чтение записей учёта времени для тикета |
| Запись времени по тикету |
Интеграция Git-Zen
Инструмент | Что делает |
| (только Git-Zen) Получение связанных задач / MR / коммитов GitLab для тикета |
Промпты
Сервер предоставляет два MCP-промпта, которые некоторые клиенты (например, Claude Desktop) отображают как слэш-команды:
Промпт | Аргумент | Что делает |
|
| Просит модель получить тикет и составить сводку, статус/хронологию и ключевые точки взаимодействия |
|
| Просит модель получить тикет и составить ответ для клиента (с шагом подтверждения перед публикацией) |
Опционально: интеграция Git-Zen
Если ваш экземпляр Zendesk использует приложение Git-Zen, инструмент zendesk_get_git_zen_links может читать его полезную нагрузку в пользовательском поле. Найдите ID пользовательского поля Git-Zen в вашем экземпляре в разделе Admin → Tickets → Fields (это числовой ID), затем либо укажите его во время .venv/bin/python -m zendesk_mcp setup, либо отредактируйте ~/.config/zendesk-mcp/config.json, добавив:
{
"git_zen_field_id": 12345678901234
}Без этой настройки zendesk_get_git_zen_links возвращает сообщение "not configured".
Опционально: база знаний Справочного центра
Если в вашем экземпляре Zendesk опубликован Справочный центр, вы можете предоставить его разделы и статьи как MCP-ресурс zendesk://knowledge-base. Ресурс возвращает один JSON-документ, охватывающий все разделы и статьи, с кэшированием на один час.
Это включается по желанию. Включите его, ответив "y" на запрос во время .venv/bin/python -m zendesk_mcp setup, или добавив следующее в ~/.config/zendesk-mcp/config.json:
{
"knowledge_base_enabled": true
}Когда флаг отсутствует или имеет значение false, ресурс не регистрируется, и список ресурсов сервера остаётся пустым для экземпляров без Help Center.
Разработка
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/pytestТесты запускаются на Python 3.10, 3.11 и 3.12 в CI (см. .github/workflows/test.yml).
Публикация релиза
Поднимите версию в pyproject.toml, mcpb/pyproject.toml (и версию, и пин zendesk-mcp==), mcpb/manifest.json и server.json (оба поля), затем запушьте тег v*. Это запускает .github/workflows/release.yml, который публикует в PyPI, упаковывает MCPB-бандл, публикует server.json в MCP Registry и создаёт GitHub-релиз.
Проверьте, что версии совпадают, перед созданием тега — иначе релиз упадёт с явной ошибкой:
python3 .github/scripts/check_versions.py 0.1.5Лицензия
Available Tools
29 toolszendesk_add_tagA
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.
Inputs: tag (required), ticket_id (required). Returns: result
zendesk_apply_macroA
Apply 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.
Inputs: macro_id (required), ticket_id (required). Returns: result
zendesk_assign_ticketA
Assign a Zendesk ticket to an agent by their email address. Pass 'me' as assignee_email to assign the ticket to yourself (the authenticated user).
Inputs: ticket_id (required), assignee_email (required). Returns: result
zendesk_create_ticketA
Create 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.
Inputs: subject (required), description (required), tags, type, +4 more. Returns: result
zendesk_download_attachmentA
Download 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.
Inputs: filename (required), ticket_id (required), attachment_url (required), dest_dir. Returns: result
zendesk_get_commentsA
Get all comments (public replies and internal notes) for a Zendesk ticket. Includes attachment metadata but does not download files.
Inputs: ticket_id (required). Returns: result
zendesk_get_git_zen_linksA
Get 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.
Inputs: ticket_id (required). Returns: result
zendesk_get_groupsA
List all active Zendesk groups (excluding deleted). Returns JSON array of {id, name}.
Inputs: no named parameters. Returns: result
zendesk_get_group_usersB
List the members of a Zendesk group. Returns JSON array of {id, name, email}.
Inputs: group_id (required). Returns: result
zendesk_get_organizationB
Fetch a Zendesk organization including its custom fields and tags. Returns JSON with id, name, organization_fields, tags, created_at, updated_at.
Inputs: organization_id (required). Returns: result
zendesk_get_ticketA
Get a Zendesk ticket by ID. Returns ticket fields including status, priority, requester, assignee, tags, and description.
Inputs: ticket_id (required). Returns: result
zendesk_get_ticketsA
List 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.
Inputs: page, sort_by, per_page, sort_order. Returns: result
zendesk_get_time_trackingA
Get 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').
Inputs: ticket_id (required). Returns: result
zendesk_get_viewA
Get a Zendesk view's definition including filter conditions and execution settings. Returns JSON with id, title, active, conditions, execution.
Inputs: view_id (required). Returns: result
zendesk_get_view_ticketsB
Get the tickets currently matching a Zendesk view. Returns JSON array of tickets with essential fields.
Inputs: view_id (required). Returns: result
zendesk_list_attachmentsA
List 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.
Inputs: ticket_id (required). Returns: result
zendesk_list_custom_statusesA
List 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.
Inputs: no named parameters. Returns: result
zendesk_list_macrosA
List all active Zendesk macros with their actions. Returns JSON array of {id, title, description, actions: [{field, value}]}.
Inputs: no named parameters. Returns: result
zendesk_list_viewsA
List all active Zendesk views. Returns JSON array of {id, title}.
Inputs: no named parameters. Returns: result
zendesk_log_timeA
Log 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.
Inputs: seconds (required), ticket_id (required). Returns: result
zendesk_post_commentA
Post a public reply on a Zendesk ticket. The reply is visible to the requester. Use for customer-facing responses.
Inputs: body (required), ticket_id (required). Returns: result
zendesk_post_internal_noteA
Post an internal note on a Zendesk ticket. Internal notes are only visible to agents and are not sent to the requester.
Inputs: body (required), ticket_id (required). Returns: result
zendesk_preview_macroA
Preview the effect a macro would have (without applying it). Returns the result payload from Zendesk's apply preview endpoint.
Inputs: macro_id (required). Returns: result
zendesk_remove_tagA
Remove 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.
Inputs: tag (required), ticket_id (required). Returns: result
zendesk_search_ticketsA
Search 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.
Inputs: limit, status, keywords. Returns: result
zendesk_search_usersA
Search Zendesk users by name or email. Returns JSON array of {id, name, email, role}.
Inputs: query (required). Returns: result
zendesk_set_ticket_statusB
Set the status of a Zendesk ticket. Valid statuses: new, open, pending, hold, solved, closed.
Inputs: status (required), ticket_id (required). Returns: result
zendesk_ticket_to_gitlab_contextA
Format 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.
Inputs: ticket_id (required). Returns: result
zendesk_update_ticketA
Update 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.
Inputs: ticket_id (required), tags, type, due_at, +8 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Each tool has a clearly distinct purpose, even where operations appear similar (e.g., get_ticket, get_tickets, search_tickets). Descriptions clarify when to use each, and there is no meaningful overlap that would cause an agent to select the wrong tool.
All tools share the 'zendesk_' prefix and mostly follow a verb_noun pattern. There is some mixing between 'get_' and 'list_' for read operations, but overall the conventions are predictable and easy to follow.
With 29 tools, this exceeds the 25-tool threshold for a 'too many' rating. While the scope is broad, the high count makes the surface feel heavy and increases selection complexity, even though each tool is well-scoped individually.
The server covers the full ticket lifecycle including comments, attachments, time tracking, views, and macros. Minor gaps exist such as lack of ticket deletion and user management, but core support workflows are well represented.
Maintenance
Related MCP Connectors
Read tickets, users, orgs, macros and satisfaction ratings; create, update and comment on tickets.
Search and read Zammad tickets, customers and organizations; add notes, replies and ticket updates.
Read tickets, contacts, companies, agents and groups; create, update and reply to tickets.
Work with Enchant help desk tickets: list, read, reply, add notes and labels, manage customers.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with Zendesk to manage tickets, retrieve ticket fields, comments, and priority based on SLA, as well as get unsolved tickets by agent name.1-
- FlicenseNot gradedqualityAmaintenanceEnables users to fetch, create, and update Zendesk tickets and comments, analyze tickets and draft responses, and query Help Center articles as a knowledge base.-
- FlicenseNot gradedqualityAmaintenanceEnables integration with Zendesk to retrieve and manage tickets and comments, analyze tickets, draft responses, and access Help Center articles as a knowledge base.-
- FlicenseNot gradedqualityAmaintenanceEnables retrieving and managing Zendesk tickets and comments, accessing Help Center articles as a knowledge base, and using specialized prompts for ticket analysis and response drafting.-