Zendesk MCP Server by Fruggr
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | Log verbosity (debug | info | warn | error). Defaults to 'info'. | |
| ZENDESK_EMAIL | No | Agent email for API token authentication. Required together with ZENDESK_API_TOKEN. | |
| ZENDESK_API_TOKEN | No | Zendesk API token. Required together with ZENDESK_EMAIL. | |
| ZENDESK_SUBDOMAIN | No | Zendesk subdomain (e.g., 'acme' for acme.zendesk.com). If not set, must be provided as a CLI argument. | |
| ZENDESK_OAUTH_CLIENT_ID | No | OAuth client identifier. Defaults to '<subdomain>_zendesk'. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_ticketA | Retrieve a Zendesk ticket by ID, including its comments if requested. Returns ticket details (subject, status, priority, assignee, tags, description) and optionally all comments/internal notes. |
| get_ticket_attachmentsA | Retrieve ticket attachments. Images are embedded inline; other files are listed as text references. |
| search_ticketsA | Search tickets using Zendesk query syntax (e.g., "status:open assignee:me", "priority:urgent type:incident"). Returns total count. |
| create_ticketA | Create a new Zendesk support ticket with subject, description, and optional priority/type/assignee/tags. The description becomes the first public comment of the ticket, and the new ticket id is returned. After creation, use update_ticket to change status or assignee, add_public_comment or add_private_note to reply, and manage_tags to adjust tags. Look up valid assignee_id / group_id and custom field ids via search_users or your Zendesk admin settings. |
| update_ticketA | Update an existing ticket (status, priority, type, assignee, group, subject, tags, custom fields). Only the fields you pass are changed, and the updated ticket is returned. Setting tags here replaces the whole tag set — use manage_tags to add or remove individual tags without overwriting the rest. This tool does not post replies: use add_public_comment or add_private_note for that. Find the ticket id via search_tickets or list_tickets. |
| add_private_noteA | Add an internal note (not visible to requester) to a ticket. |
| add_public_commentA | Add a public comment (visible to requester) to a ticket. |
| list_ticketsA | List tickets with cursor-based pagination, sorted by most recently updated. |
| get_linked_incidentsA | Get all incident tickets linked to a problem ticket. |
| manage_tagsA | Add or remove tags on a ticket. |
| searchA | Search across tickets, users, and organizations. Supports filters like "type:ticket status:open", "type:user role:agent". Returns total count and paginated results (100 per page). Organization results include name and ID only — use get_organization for full details (tags, domains, details). |
| search_articlesA | Full-text search across Help Center articles (metadata only, no body). Use get_article for full content. Supports locale filtering. Returns total count. |
| get_articleA | Retrieve an article by ID with full body content. For large articles, prefer get_article_outline + get_article_section to save tokens. Optionally specify locale for a translated version. Returns body (HTML), metadata, source_locale, and list of available translations. |
| list_categoriesA | List all Help Center categories. Categories are the top level of the Guide hierarchy (category → section → article); each entry includes its id, name and locale. Results are cursor-paginated. Pair a returned category id with list_sections to drill down, then list_articles to reach articles. Pass a locale to read category names in that translation. |
| list_sectionsA | List Help Center sections. Sections are the middle level of the Guide hierarchy (category → section → article) and group related articles; each entry includes its id, name, category_id and locale. Results are cursor-paginated. Pass category_id to list only one category's sections (ids come from list_categories), then use a section id with list_articles. Pass a locale to read section names in that translation. |
| list_articlesA | List articles (metadata only, no body). Use get_article for full content. Optionally filter by section ID and locale. Supports sort_by ("title", "created_at", "updated_at") and include_translations: true to show available translation locales per article. Note: include_translations must be re-sent on each paginated request. |
| list_article_translationsA | List all available translations for an article (metadata only, no body: locale, title, draft, updated_at). Use get_article with locale for full translated content. |
| create_article_translationA | Create a translation for an existing article in a specific locale. The article must already exist (create it with create_article); this adds a new localized version and returns the created translation (locale, title, draft state). The target locale must not already have a translation — use update_article_translation to modify an existing one, and list_article_translations to see which locales exist. Provide the full HTML body. |
| update_article_translationA | Update article content (title, body) in a specific locale. For targeted edits on one or a few sections, prefer update_article_section — this tool replaces the FULL body and re-sends the entire article on each write. Use the article's source_locale (from get_article) for the default language, or another locale for translations. |
| list_permission_groupsA | List all Guide permission groups. Use this to find the permission_group_id required when creating articles. |
| create_articleA | Create a new article in a section. The locale becomes the article's source_locale. Requires a permission_group_id (use list_permission_groups to find available IDs). To add content in other locales afterwards, use create_article_translation. |
| update_articleA | Update article metadata only (draft, promoted, labels, tags, visibility, section, sort position, etc.). Does NOT update content (title, body) — use update_article_translation for that. |
| list_content_tagsA | List all Guide content tags. Content tags are visible to end users and help them find related articles. |
| create_content_tagA | Create a new content tag for Guide articles. Content tags are end-user visible labels that help readers discover related articles; this returns the created tag with its id. Check list_content_tags first to avoid duplicates, then attach the new id via the content_tag_ids parameter of create_article or update_article. For internal search-ranking labels that are not shown to end users, use article labels (list_labels) instead. |
| list_labelsA | List all article labels. Labels improve Help Center search ranking and are not visible to end users. |
| list_user_segmentsA | List all user segments. User segments control article visibility (who can view). Use the ID when creating or updating articles. |
| list_article_attachmentsA | List all attachments for an article. Returns attachment metadata only (id, file name, content type, size, URL), not the file bytes; both inline and block attachments are included. This is for Help Center articles — for attachments on support tickets use get_ticket_attachments instead. Upload new files with create_article_attachment. |
| get_article_outlineA | Return a compact outline of an article (list of sections delimited by h1/h2/h3, with word counts) for the given locale (defaults to source_locale). Includes available translations with their outdated status. Use get_article_section to fetch a specific section. |
| get_article_sectionA | Retrieve the content of a single section of an article in a given locale. Use get_article_outline first to discover section indexes. Default format="html" for round-trip safety. Pass format="markdown" only for human review — the Markdown representation is lossy on some structures ( with , tables with multi- cells are kept as raw HTML to limit the damage, but do not round-trip markdown content back through update_article_section). |
| update_article_sectionA | Replace the content of a single section of an article in a given locale, keeping the rest of the body intact. The server fetches the current body, replaces the targeted section, and PUTs the full reconstructed body via the Translations API. Default format="html" for fidelity. Use format="markdown" only when you control the input and know it does not rely on structures that round-trip poorly (code blocks with line breaks, tables with multi-paragraph cells). The section heading is preserved and is NOT part of the replaced content. |
| compare_translationsA | Compare section structure between two locales of the same article, matched by index. Returns a compact table (one row per section) with status: "ok" (both present, source/target word count ratio within 25%), "different" (word count ratio diverges by more than 25% — size signal only, NOT a semantic divergence: two locales may legitimately differ in verbosity) or "missing" (section absent in target). Useful to spot structurally stale or missing sections; do not interpret "different" as an edit regression on its own. |
| create_article_attachmentA | Upload an attachment to an article. Provide file content as base64-encoded string. |
| get_current_userA | Get the currently authenticated Zendesk user. Useful to verify identity and permissions. |
| search_usersA | Search for users by name, email, or other criteria using Zendesk search query syntax. Returns total count. |
| get_userA | Retrieve a user by ID. |
| get_organizationA | Retrieve an organization by ID. |
| list_organizationsA | List all organizations with pagination. Returns the name and id of each organization plus basic fields; results are cursor-paginated. Use get_organization with an id for full details (tags, domains, notes), or search for query-based lookups by name. Organizations group end users and can be referenced when creating or filtering tickets. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| help-center-topology | Active locales, category → section tree, visibility segments, permission groups, and your role. Read before creating or editing content. |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/fruggr/zendesk-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server