Skip to main content
Glama

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

Вам будет предложено:

  1. Ваш субдомен Zendesk (например, acme для acme.zendesk.com)

  2. ID OAuth-клиента, созданный вашим администратором

  3. Секрет OAuth-клиента

  4. (Опционально) ID поля интеграции Git-Zen — см. Опционально: интеграция Git-Zen

  5. (Опционально) Включить ли ресурс базы знаний Справочного центра — см. Опционально: база знаний Справочного центра

Настройка открывает браузер для шага авторизации 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 будет запрашивать подтверждение при каждом вызове.

Инструменты

Тикеты

Инструмент

Что делает

zendesk_search_tickets

Поиск тикетов по статусу, приоритету, типу, исполнителю, запросившему, тегам или ключевому слову

zendesk_get_tickets

Список тикетов с пагинацией и сортировкой (page, per_page, sort_by, sort_order)

zendesk_get_ticket

Получение метаданных одного тикета

zendesk_create_ticket

Создание нового тикета (тема, описание, опционально приоритет/тип/assignee_id/requester_id/теги/custom_fields)

zendesk_update_ticket

Обновление одного или нескольких полей существующего тикета (статус, приоритет, тема, тип, assignee_id, requester_id, group_id, custom_status_id, теги, custom_fields, due_at)

zendesk_get_comments

Получение цепочки обсуждения по тикету

zendesk_list_attachments

Список вложений в тикете

zendesk_download_attachment

Скачивание вложения в локальный кэш-каталог

zendesk_ticket_to_gitlab_context

Форматирование тикета и его обсуждения как черновика задачи в Markdown

zendesk_post_comment

Публикация публичного ответа в тикете

zendesk_post_internal_note

Публикация внутренней заметки только для агентов в тикете

zendesk_set_ticket_status

Установка статуса тикета (new, open, pending, hold, solved, closed)

zendesk_assign_ticket

Назначение тикета агенту по email или me

Теги

Инструмент

Что делает

zendesk_add_tag

Добавление тега к тикету (идемпотентно)

zendesk_remove_tag

Удаление тега из тикета (идемпотентно)

Представления и макросы

Инструмент

Что делает

zendesk_list_views

Список всех активных представлений

zendesk_get_view

Получение условий фильтра и настроек выполнения представления

zendesk_get_view_tickets

Получение тикетов, соответствующих представлению

zendesk_list_macros

Список активных макросов с их действиями

zendesk_preview_macro

Предпросмотр изменений, которые применит макрос

zendesk_apply_macro

Применение макроса к тикету (применяет изменения полей и публикует комментарий)

Пользователи, группы и организации

Инструмент

Что делает

zendesk_search_users

Поиск пользователей по имени или email

zendesk_get_groups

Список всех активных групп

zendesk_get_group_users

Список участников группы

zendesk_get_organization

Получение организации, включая пользовательские поля

zendesk_list_custom_statuses

Список всех пользовательских статусов тикетов и их ID

Учёт времени

Инструмент

Что делает

zendesk_get_time_tracking

Чтение записей учёта времени для тикета

zendesk_log_time

Запись времени по тикету

Интеграция Git-Zen

Инструмент

Что делает

zendesk_get_git_zen_links

(только Git-Zen) Получение связанных задач / MR / коммитов GitLab для тикета

Промпты

Сервер предоставляет два MCP-промпта, которые некоторые клиенты (например, Claude Desktop) отображают как слэш-команды:

Промпт

Аргумент

Что делает

analyze-ticket

ticket_id

Просит модель получить тикет и составить сводку, статус/хронологию и ключевые точки взаимодействия

draft-ticket-response

ticket_id

Просит модель получить тикет и составить ответ для клиента (с шагом подтверждения перед публикацией)

Опционально: интеграция 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

Лицензия

Apache-2.0

Available Tools

29 tools
zendesk_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_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

    A3.7/5.0

    Scored across 29 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers