Skip to main content
Glama
rlowndes9

Zendesk MCP Server

by rlowndes9

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_instancesA

List every Zendesk instance configured for this server, with default and currently-sticky markers. Call this once at session start to discover what instances are reachable; then use set_instance to lock onto one. For cross-instance comparisons, leave the sticky instance alone and pass instance: per-call to whichever tool you invoke.

set_instanceA

Lock the session onto a single Zendesk instance, every subsequent call defaults to it unless you pass instance: per-call. Call this once per session; the sticky instance is how you avoid repeating yourself across dozens of tool calls. Use list_instances first if you don't know what's configured.

current_instanceA

Returns the currently active sticky instance, or null if none has been set. Cheap sanity check, call this when you're unsure whether set_instance has been run yet.

refresh_instanceA

Invalidate the in-memory cache for an instance (or scope to specific kinds: like ["triggers"]), forcing the next call to re-fetch from Zendesk. Call this after the user makes a change in the Zendesk admin UI so subsequent reads see the new state. When kinds is omitted, the per-instance HTTP client is also dropped, so edits to instances.json (rotated tokens, fixed creds) take effect on the next call without a server restart. Most other tools also accept refresh: true for one-off invalidation; reach for refresh_instance when you need to wipe several kinds at once.

list_triggersA

Returns triggers as paginated skeletons (id, title, active, updated_at). Default limit: 100; pass cursor to walk pages, fields to project additional columns, filter for active/category/title-contains/updated-since, or verbose: true for full bodies. For "which triggers do X?" questions prefer find_triggers_by_tag / find_triggers_by_field / find_trigger_conflicts, they filter inside conditions and actions server-side and return only the matches with why_matched breadcrumbs. list_triggers without a filter on instances with thousands of triggers can be slow on first call (cold cache); subsequent calls slice from the cache and are near-instant.

get_triggerA

Fetch one trigger by ID with full conditions and actions. Use after list_triggers / find_triggers_by_* to inspect a specific rule's body. For health audits over the whole trigger set, prefer audit_trigger_health.

find_triggers_by_tagA

Find triggers that reference a specific tag, scoped by mode: sets (action adds), removes (action removes), condition (read in current_tags), or any (union). Each match carries a why_matched breadcrumb so you can see exactly where it hit. Always reach for this before list_triggers + manual scan, it operates over the cached verbose corpus with no extra HTTP. For the broader "which tags exist at all?" question use list_tags_in_use; for a one-shot tag-hygiene audit use audit_tag_sprawl.

find_triggers_by_fieldA

Find triggers that touch a named field in any condition or action, answers "which triggers reference ticket_form_id 42?", "which triggers set status to solved?", "which triggers route to group_id 7?". Optional value narrows to an exact match (string-coerced). Prefer this over list_triggers for any field-reference question, it scans the cached verbose corpus with why_matched breadcrumbs and zero extra HTTP. For impact-analysis on a custom ticket field specifically, find_field_usage checks triggers + automations + macros + views + forms in one call.

find_trigger_conflictsA

Surface pairs of active triggers that fight each other, same all-block precondition signature with contradicting effects. Two classes: field_overwrite (both write different values to the same field) and tag_set_remove_pair (one sets a tag, the other removes it). Pass trigger_id to scope to conflicts involving one rule, or include_inactive: true for cleanup audits. For a full trigger hygiene report (conflicts plus orphaned references, deactivated-but-referenced, ordering anomalies, empty rules), call audit_trigger_health instead, it bundles this analyzer with the support-kind checks. Operates over the cached verbose corpus, no extra HTTP.

list_ticket_fieldsA

Returns ticket fields (system + custom) as paginated skeletons (id, type, key, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true for full bodies including dropdown custom_field_options. For "is it safe to delete this field?" call find_field_usage, it scans every rule and form for references with why_matched breadcrumbs. For a full field hygiene report, audit_field_health bundles unused / inactive-only / empty-options / not-on-any-form checks.

get_ticket_fieldA

Fetch one ticket field by ID with full body (dropdown options, regex, etc). For impact analysis before deletion, prefer find_field_usage.

list_ticket_formsA

Returns ticket forms as paginated skeletons (id, name, active, default, ticket_field_ids, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. For "is it safe to retire this form?" call find_form_usage, it scans triggers, automations, macros, and views for references. Form lists are typically tiny (single digits to dozens), so straight enumeration is usually fine.

get_ticket_formA

Fetch one ticket form by ID with the full ordered list of ticket_field_ids. For impact analysis before retirement, prefer find_form_usage.

list_custom_statusesA

Returns custom ticket statuses as paginated skeletons (id, status_category, agent_label, active, default, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Custom-status lists are tiny (handful of entries), so straight enumeration is fine. For deeper hygiene checks (which rules reference deactivated statuses, etc.) trace via find_triggers_by_field with field: "status".

get_custom_statusA

Fetch one custom ticket status by ID. For "which rules set this status?" use find_triggers_by_field with field: "status" and the status value.

list_trigger_categoriesA

Returns trigger categories (the folders shown in the Admin UI trigger list) as paginated skeletons (id, name, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. For "are any triggers pointing at a missing category?" call audit_trigger_health, it reports orphaned_references including category orphans. To list triggers in one category, list_triggers with a category_id filter is fine.

get_trigger_categoryA

Fetch one trigger category by ID. For category-orphan detection across triggers use audit_trigger_health.

list_organization_fieldsA

Returns organization-level custom fields (the schema, not values) as paginated skeletons (id, type, key, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true for dropdown options. Note these are distinct from list_user_fields (user-level) and list_ticket_fields (ticket-level). For values on a specific organization, fetch with get_organization and read organization_fields.

get_organization_fieldA

Fetch one organization-field schema entry by ID with full body (dropdown options, regex). Distinct from a value on an organization, for that, fetch the organization and read organization_fields.

list_user_fieldsA

Returns user-level custom fields (the schema, not values) as paginated skeletons (id, type, key, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true for dropdown options. Distinct from list_ticket_fields and list_organization_fields. For values on a specific user, fetch with get_user and read user_fields.

get_user_fieldA

Fetch one user-field schema entry by ID with full body. Distinct from a value on a user, for that, fetch the user and read user_fields.

list_brandsA

Returns brands as paginated skeletons (id, name, subdomain, active, default, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Plan-gated, multi-brand requires the appropriate Zendesk plan; on single-brand instances you'll see a single default brand. Brand lists are tiny, straight enumeration is fine.

get_brandA

Fetch one brand by ID with full body (signature template, host mapping, etc).

list_localesA

Returns locales enabled on the instance as paginated skeletons (id, locale, name, default, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Use to discover which default_locale_id values are valid for list_dynamic_content variants.

list_custom_rolesA

Returns custom agent roles as paginated skeletons (id, name, team_member_count, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true for the full permission grid. Plan-gated, custom roles require Enterprise; degrades to upstream_error on lower plans. Distinct from system roles (admin, agent, end-user).

get_custom_roleA

Fetch one custom role by ID with the full permission grid. Enterprise-plan-gated.

list_schedulesA

Returns business-hours schedules as paginated skeletons (id, name, time_zone, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true to inline weekly intervals. Plan-gated, schedules require Professional+. For "what are the actual business hours?" call list_business_hours with a schedule_id, it composes intervals + holidays, which the schedule list alone doesn't cover.

get_scheduleA

Fetch one schedule by ID, including its weekly intervals. For schedule + holidays in one call use list_business_hours, Zendesk holidays live on a separate sub-resource and get_schedule alone won't surface them.

list_business_hoursA

Composite that returns the weekly intervals and the holidays for one schedule in a single response. Reach for this rather than get_schedule when answering "when is this schedule open?", Zendesk splits hours and holidays across two endpoints; this tool joins them. Plan-gated alongside schedules themselves.

list_sla_policiesA

Returns SLA policies as paginated skeletons (id, title, position, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true for full filter conditions and policy_metrics. Plan-gated, SLAs require Professional+. For "which SLA fires on group X?" call find_group_usage, it includes SLA filter conditions in its scan.

get_sla_policyA

Fetch one SLA policy by ID with full filter and policy_metrics. For impact analysis on a referenced group, use find_group_usage.

list_webhooksA

Returns webhooks (the modern outbound integration mechanism) as paginated skeletons (id, name, status, endpoint, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. For per-webhook delivery history use list_webhook_invocations with a webhook_id, that's where you'll find request/response timing and HTTP status. list_targets is the legacy equivalent, most modern instances should be on webhooks.

get_webhookA

Fetch one webhook by ID with full body (auth, signing key, subscriptions). For delivery history, use list_webhook_invocations.

list_webhook_invocationsA

Returns the delivery history for one webhook, every fire with http_status, request/response timing, and outcome. Default limit: 100; pass cursor, fields, filter. The right tool for "is this webhook actually working?", failures and slow responses surface here. For instance-wide configuration changes (not webhook deliveries), use list_audit_logs.

list_targetsA

Returns legacy outbound targets (URL/email integration endpoints, deprecated by Zendesk in favor of webhooks) as paginated skeletons (id, type, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Modern instances should use list_webhooks, surface targets only for migration audits. Targets have no per-call invocation log; use list_audit_logs for change history.

get_targetA

Fetch one legacy target by ID with full body. For new integrations prefer get_webhook.

list_dynamic_contentA

Returns dynamic content items (the localizable snippets used in macros, triggers, automations) as paginated skeletons (id, name, default_locale_id, variants_count, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true to inline variant bodies per locale. Plan-gated, Professional+; degrades to upstream_error on lower plans. Cross-reference variant locales with list_locales to spot missing translations.

get_dynamic_contentA

Fetch one dynamic content item by ID with all locale variants. Plan-gated to Professional+.

list_audit_logsA

Returns instance-wide configuration audit logs as paginated skeletons (id, source_type, actor_name, action, change_description, created_at), every admin/config change with attribution. Enterprise-plan-gated; on lower plans returns upstream_error with the underlying http_status (403/404). Default limit: 100; pass cursor, fields, filter (server-side filters for source_type/action are honored). For per-ticket field changes use get_ticket_audits, this tool is admin-config only, not ticket-level.

list_routing_attributesA

Returns skill-based-routing attribute definitions (e.g. "Skill", "Language", "Region") as paginated skeletons (id, name, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Plan-gated, requires omnichannel routing; degrades to upstream_error (403/404) when the feature isn't enabled. For the values inside one attribute use list_routing_attribute_values; for the legacy "skills" entry-point use list_skills.

get_routing_attributeA

Fetch one routing attribute definition by ID. Plan-gated, degrades to upstream_error on 403/404 when omnichannel routing is off. For the attribute's values, call list_routing_attribute_values.

list_routing_attribute_valuesA

Returns the values defined under one routing attribute (e.g. the actual skills under a "Skill" attribute) as paginated skeletons (id, attribute_id, name, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Plan-gated, degrades to upstream_error when omnichannel routing is off. To see which agents have a given value, use list_agent_skill_assignments per agent.

list_skillsA

Convenience wrapper that resolves a "skills"-like routing attribute and returns its values as skeletons. Pass attribute_id to target one specifically, or attribute_name (case-insensitive; defaults to "skill"/"skills"). Modern Zendesk has no /skills.json endpoint, this tool exists because LLMs ask for "skills" by name; under the hood it's list_routing_attribute_values against the skill attribute. Plan-gated. For agent assignments use list_agent_skill_assignments.

list_agent_skill_assignmentsA

Returns the routing-attribute values an agent holds (i.e. which skills/queues that user is eligible for) as paginated skeletons. Backed by /api/v2/users/{user_id}/instance_values.json, the canonical SBR-assignment endpoint. Plan-gated, degrades to upstream_error when omnichannel routing is off. Scope-gated because it touches user data (config_plus_audits or full). For attribute/value catalogs (not assignments), use list_routing_attributes / list_routing_attribute_values.

list_ticketsA

Returns tickets as paginated skeletons (id, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true for full bodies. Scope-gated, requires the instance to be configured at scope config_plus_audits or full; on config you get a scope_blocked envelope. For specific lookups prefer search (full Zendesk query syntax: type:ticket status:open), list_tickets over a busy instance pulls everything and is rarely what you want. For a single ticket's context use get_ticket with include_comments / include_audits.

get_ticketA

Fetch one ticket by ID; optionally inline its include_comments thread and/or include_audits history in the same call. Scope-gated (config_plus_audits or full); blocked calls return scope_blocked. Use the inline includes when you need conversational context, they save a round-trip vs. calling get_ticket_comments / get_ticket_audits separately. For pure SLA / responsiveness numbers, get_ticket_metrics is cheaper than parsing audits.

get_ticket_commentsA

Return the comment thread for one ticket as paginated skeletons (id, type, author_id, body, html_body, public, created_at). Scope-gated (config_plus_audits or full). Pass verbose: true for via-channel info and attachments. For "what changed on this ticket and why?" use get_ticket_audits instead, comments only carry the textual conversation, audits carry rule attribution.

get_ticket_auditsA

Returns the audit history for a ticket, every state change with rule attribution and event timestamps. Defaults to limit: 100 events; pass since to bound by date, event_types: ["Change"] to skip Comment events entirely (much smaller response). Scope-gated, requires config_plus_audits or full; at config_plus_audits Comment-event bodies are auto-redacted. Use this for forensic debugging ("why did this macro send the ticket to the wrong group?"), via.source on each audit names the trigger / macro / app that made the change. For pure timing data, get_ticket_metrics is cheaper.

list_side_conversationsA

List side conversations (Collaboration add-on) attached to a ticket as paginated skeletons. Plan-gated, on instances without the Collaboration add-on the call degrades to a structured upstream_error envelope with the underlying http_status, not a thrown failure. Also scope-gated (config_plus_audits or full). Use to surface the parallel email/Slack thread on a ticket; for the main public conversation use get_ticket_comments.

get_ticket_metricsA

Fetch the ticket_metric record for one ticket, reply count, reply/resolution times, reopens, station counts, on-hold time. Scope-gated (config_plus_audits or full). Use this for SLA / responsiveness questions; use get_ticket_audits for "why did this happen?" Audits carry rule attribution and field-level changes; metrics carry only the timing aggregates and are much cheaper.

list_usersA

Returns users as paginated skeletons (id, name, email, role, organization_id, active, timestamps). Default limit: 100; pass cursor, fields, filter, or verbose: true. Scope-gated, requires config_plus_audits or full; on config returns scope_blocked. For finding a specific user prefer search (e.g. type:user email:foo@bar.com), full enumeration on a large customer base is rarely the right call. For an agent's SBR skill values, use list_agent_skill_assignments.

get_userA

Fetch one user by ID with full profile details. Scope-gated (config_plus_audits or full). For lookup by email or other criteria, use search with type:user.

list_organizationsA

Returns organizations as paginated skeletons (id, name, domain_names, timestamps). Default limit: 100; pass cursor, fields, filter, or verbose: true. Scope-gated, requires config_plus_audits or full. For finding a specific organization prefer search with type:organization name:"Acme"; full enumeration is expensive and rarely needed. For org-level custom field metadata see list_organization_fields.

get_organizationA

Fetch one organization by ID. Scope-gated (config_plus_audits or full). For lookup by name or domain, use search with type:organization.

list_groupsA

Returns agent groups as paginated skeletons (id, name, description, default, deleted, timestamps). Default limit: 100; pass cursor, fields, filter, or verbose: true. Group lists are typically small (dozens), so this is usually fine to call without filtering. For "is it safe to delete this group?" call find_group_usage, it scans triggers, automations, views, and SLA policies for references with why_matched breadcrumbs.

get_groupA

Fetch one group by ID. For impact analysis before deletion, prefer find_group_usage over fetching and inspecting manually.

list_macrosA

Returns macros as paginated skeletons (id, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. For "which macros are unused?" call find_unused with kind: "macros", it consults Zendesk's usage_30d stats and gives a confident answer where it can. For tag / field impact across macros + triggers + automations + views, use find_field_usage or audit_tag_sprawl.

get_macroA

Fetch one macro by ID with full actions. For "is this macro safe to delete?" prefer find_unused; for impact analysis on a referenced field/form/group, use find_field_usage / find_form_usage / find_group_usage.

list_viewsA

Returns views as paginated skeletons (id, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. For "which views are unused?" call find_unused with kind: "views", it uses Zendesk's usage_30d to give a confident answer. For impact analysis on a field/form/group referenced by views, use find_field_usage / find_form_usage / find_group_usage.

get_viewA

Fetch one view by ID with full conditions. For "is this view used?" prefer find_unused; for what fields/forms/groups it references, use the corresponding find_*_usage analyzer.

list_automationsA

Returns automations (time-based rules) as paginated skeletons (id, title, active, updated_at). Default limit: 100; pass cursor, fields, filter, or verbose: true. Automation firing data is not exposed by the Zendesk API on standard plans, so find_unused returns indeterminate for automations rather than guessing. For tag / field reference questions across automations + triggers + macros, prefer find_field_usage or audit_tag_sprawl.

get_automationA

Fetch one automation by ID with full conditions and actions. For impact analysis on referenced fields/forms/groups, use the corresponding find_*_usage analyzer.

searchA

Run a Zendesk v2 Search query across tickets, users, organizations, and groups; returns mixed-type results in their native shape. Use the standard query syntax (e.g. type:ticket status:open, type:user email:foo@bar.com, type:organization tags:vip). Always reach for this before list_tickets / list_users / list_organizations when you're looking for specific records, the search index is much faster than enumeration. Scope-gated when results include tickets/users/orgs (config_plus_audits or full).

get_talk_statsA

Fetch the current account-overview snapshot for Zendesk Talk (voice channel), average wait/handle time, calls in queue, agents online. Plan-gated to instances with Talk enabled; degrades to a structured upstream_error envelope otherwise. Snapshot only, for historical voice analytics use the Zendesk Explore product directly.

list_chatsA

List Zendesk Chat conversations as paginated items in their native shape (no skeleton projection, chat payloads are already compact). Default limit: 100; pass cursor, fields, or filter. Plan-gated, degrades to upstream_error on instances without the Chat add-on. Scope-gated when chats include user/ticket data (config_plus_audits or full).

find_field_usageA

Find every reference to a custom ticket field across triggers, automations, macros, views, and ticket forms, returns references with why_matched breadcrumbs and reference_count. The right tool for "is it safe to delete this field?" Operates over the cached verbose corpus, no extra HTTP unless refresh: true. For a full field-hygiene report (unused / inactive-only / empty options / not on any active form), use audit_field_health instead, it bundles this analyzer.

find_form_usageA

Find every reference to a ticket form across triggers, automations, macros, and views, returns references with why_matched breadcrumbs. The right tool for "is it safe to retire this form?" Operates over the cached verbose corpus, no extra HTTP. For broader form hygiene (forms with no active rules, etc.), audit_field_health covers the form-side checks too.

find_group_usageA

Find every reference to an agent group across triggers, automations, views, and SLA policies, returns references with why_matched breadcrumbs. The right tool for "is it safe to delete this group?" Operates over the cached verbose corpus, no extra HTTP unless refresh: true. For broader trigger-orphan detection (including dangling group ids), audit_trigger_health checks group, form, field, and category orphans in one pass.

list_tags_in_useA

Inventory every tag referenced across triggers, automations, and macros, with where-used rows (kind, id, title, mode), suspected near-duplicates (case-insensitive, separator-stripped, Levenshtein-1), and a set_only flag for tags written but never read in conditions. Operates over the cached verbose corpus, no extra HTTP unless refresh: true. For a full tag-sprawl audit (clusters of dupes, top-N usage distribution) call audit_tag_sprawl, it bundles this analyzer with clustering. For "which rules touch one specific tag?" use find_triggers_by_tag.

find_unusedA

Detect unused macros and views by reading Zendesk's usage_30d stats; returns confident verdicts only where data exists. kind: "triggers" and kind: "automations" always return indeterminate, firing data is not exposed by the Zendesk API on standard plans, so the tool refuses to guess. For trigger / automation cleanup, combine find_trigger_conflicts, audit_trigger_health, and find_field_usage / find_group_usage instead.

summarize_instanceA

One-call dashboard for a Zendesk instance, counts of every config object (active/inactive splits where applicable) plus headline metrics (oldest/newest trigger, biggest trigger category, deactivated-but-positioned triggers). Run this first when picking up a new client engagement, it primes the cache for everything that follows, so subsequent analyzer / audit calls are essentially free. Tolerates per-kind upstream errors (plan-gated endpoints don't fail the whole composite); failures are listed in notes.

audit_field_healthA

Composite ticket-field hygiene report: flags fields referenced by nothing, fields referenced only by inactive rules, dropdown/multiselect fields with empty option lists, and custom fields not on any active form. Skips system fields (subject, status, priority, etc.). The right starting point for field-cleanup work, bundles find_field_usage plus the option-list and form-coverage checks. Tolerates per-kind upstream errors with notes.

audit_trigger_healthA

Composite trigger-hygiene report: conflicts (overlapping preconditions with contradicting effects), deactivated_but_referenced (dead triggers still chained), orphaned_references (pointing at missing groups/forms/fields/categories), ordering_anomalies (inactive triggers in early slots, duplicate positions), and empty_rules. The right starting point for trigger cleanup work, bundles find_trigger_conflicts plus the orphan/order/empty checks in one call. Tolerates per-kind upstream errors on support kinds (notes listed in notes); a missing trigger list is fatal.

audit_tag_sprawlA

Composite tag-hygiene report: full inventory (per-tag where-used, dupe suspects, set_only flag), clustered groups of suspected duplicates (vip / VIP / v_i_p collapse together), set_only tags written but never read, and a top-N usage distribution. The right starting point for tag-cleanup work, bundles list_tags_in_use with clustering. For "which rules touch tag X?" use find_triggers_by_tag instead. Tolerates per-kind upstream errors with notes.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

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/rlowndes9/zendesk-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server