Skip to main content
Glama
Grjhoan

zendesk-admin-mcp

by Grjhoan

zendesk-admin-mcp

A local MCP server for Zendesk administration work. Zendesk adopted MCP on the client side — its agentic AI consumes external servers — but never shipped a server of its own that a host application could use. This fills that gap, with a deliberately narrow scope.

It does not wrap the whole API. It exposes 13 tools covering five concrete admin jobs, because a server with 200 tools floods the context window and makes the model choose worse.

You: "Which triggers haven't fired in the last 30 days?"
     "Who has the heaviest open backlog right now?"
     "Maria is leaving on Friday — what's still assigned to her?"
     "Find the tickets from the customer calling from +57 300 123 4567."

Purpose

Zendesk admin work involves a lot of questions that are tedious to answer through the UI: which business rules are dead weight, where the backlog is piling up, who still holds admin privileges, and what is left hanging when an agent leaves. Each of those means clicking through several admin screens and cross-referencing by hand.

This server turns those questions into tool calls an AI assistant can make directly, and returns aggregated summaries rather than raw record dumps, so the model can reason about the answer instead of drowning in it.

Related MCP server: Zendesk MCP Server

Features

Connection

Tool

What it does

whoami

Verifies credentials and shows which account and role the server operates as. On an auth failure, reports what it tried to connect with.

Tool

What it does

find_tickets

Finds tickets by ticket id, requester email, subject or phone number. Email, subject and phone can be combined; ticket id is exclusive. Each result links straight to the agent interface.

Business-rule auditing

Tool

What it does

audit_business_rules

Triggers, automations and macros: finds inactive rules, rules unused in 30 days, rules not modified in months, and duplicate titles.

list_ticket_fields

Inventory of ticket fields, flagging inactive and custom ones.

Backlog and SLAs

Tool

What it does

list_sla_policies

SLA policies with their targets by priority and metric.

backlog_health

Counts by status and priority, unassigned tickets, and the most stalled ones.

agent_workload

Distribution of open tickets per agent, heaviest load first.

Security

Tool

What it does

security_overview

Who holds the admin role, unused OAuth tokens, installed apps.

recent_admin_changes

Configuration changes from the audit log. Requires the Enterprise plan.

Users and offboarding

Tool

What it does

find_user

Finds users by name, email or Zendesk search syntax.

offboarding_report

Everything left hanging on a departing agent: open tickets, groups, role, last login. Read-only.

reassign_tickets

Write. Reassigns an agent's open tickets to another agent. Dry run by default.

set_user_status

Write. Suspends, reactivates or changes a user's role. Dry run by default.

Security model

Three layers, in order of importance:

  1. The token's Zendesk role is the real boundary. The server can never do more than that user could already do in the UI. If you want a read-only server, give it a token belonging to a user with read-only permissions.

  2. Writes are off by default. reassign_tickets and set_user_status fail with a clear message while ZENDESK_ALLOW_WRITES is not true.

  3. Dry run by default. Even with writes enabled, both tools report what they would change without touching anything, until you call them with dry_run=false.

Each tool is also advertised to the MCP client with readOnlyHint or destructiveHint, so the host can prompt you for confirmation before the ones that modify data.

Credential handling

No credential is ever written into the source tree. The server reads everything from environment variables, and authentication travels in an HTTP header rather than a URL, so it cannot leak into a logged request line.

Depending on how you install it, your token lives in one of three places:

Install method

Where the token is stored

Claude Desktop extension (.mcpb)

Your OS keychain

Claude Desktop / Claude Code JSON config

That config file, in plain text

Local .env

That file, in plain text — git-ignored by this repo

If you fork or clone this repo, keep .env out of version control. The shipped .gitignore already excludes .env, dist/, and *.mcpb.

A note on API tokens

Zendesk has marked API tokens as deprecated and recommends OAuth. Their own documentation warns that an API token allows impersonating any member of the account, admins included. For a local prototype they are fine; if this reaches production or more than one person, move to OAuth. The server accepts both.

Requirements

  • Python 3.10 or newer

  • A Zendesk account and a token (API token or OAuth)

  • For recent_admin_changes: the Zendesk Enterprise plan

  • For list_sla_policies: a plan that includes SLAs

Installation

git clone https://github.com/Grjhoan/Zendesk_MCP_Server.git
cd Zendesk_MCP_Server
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

Configuration

Copy .env.example to .env and fill it in, or define the variables directly in your MCP client's configuration.

To generate an API token: Admin Center → Apps and integrations → APIs → Zendesk API → Settings, enable Token access and create one. Save it right then; Zendesk will not show it again.

Variable

Required

Description

ZENDESK_SUBDOMAIN

Yes

If you sign in at https://acme.zendesk.com, it is acme.

ZENDESK_OAUTH_TOKEN

One of the two

OAuth token. The recommended option.

ZENDESK_EMAIL + ZENDESK_API_TOKEN

One of the two

Email of the token owner, and the token.

ZENDESK_ALLOW_WRITES

No

true enables the two write tools. Off by default.

If both are set, ZENDESK_OAUTH_TOKEN wins. A value left as an unsubstituted placeholder such as ${user_config.oauth_token} (which an .mcpb bundle can leave behind for a blank optional field) is treated as unset.

Connecting it

This bundles the dependencies, so the extension does not depend on your virtualenv, and stores the token in your OS keychain instead of a plain-text file.

./build_mcpb.sh

Then open Settings → Extensions → Advanced settings and either:

  • Install extension… → pick the generated zendesk-admin.mcpb, or

  • Install unpacked extension… → pick the dist/ folder (not the project root — only dist/ has the rewritten manifest).

Claude will prompt you for the subdomain, credentials and the write toggle.

Build the bundle on the machine you will install it on. It vendors platform-compiled wheels and pins the absolute path of the interpreter that built it, so a bundle built on Linux will not start on macOS. This is also why dist/ and *.mcpb are git-ignored — they are never portable.

Claude Desktop — manual configuration

In ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "zendesk-admin": {
      "command": "/absolute/path/to/zendesk-admin-mcp/.venv/bin/python",
      "args": ["/absolute/path/to/zendesk-admin-mcp/server.py"],
      "env": {
        "ZENDESK_SUBDOMAIN": "acme",
        "ZENDESK_EMAIL": "you@company.com",
        "ZENDESK_API_TOKEN": "...",
        "ZENDESK_ALLOW_WRITES": "false"
      }
    }
  }
}

Use absolute paths: the client does not launch the server from this folder. Restart Claude Desktop after editing.

Claude Code

claude mcp add zendesk-admin \
  --env ZENDESK_SUBDOMAIN=acme \
  --env ZENDESK_EMAIL=you@company.com \
  --env ZENDESK_API_TOKEN=... \
  --env ZENDESK_ALLOW_WRITES=false \
  -- /absolute/path/.venv/bin/python /absolute/path/server.py

Then confirm it is connected:

claude mcp list

Any other MCP client

The server speaks MCP over stdio. Point your client at .venv/bin/python server.py with the environment variables above.

Verification

python tests/test_client.py        # HTTP layer against a mock transport
python tests/test_search_query.py  # find_tickets query building
python tests/test_errors.py        # failures come back readable; whoami never leaks the token
python tests/test_handshake.py     # real MCP handshake and tool listing

All four run without credentials or network access. After that, with credentials in place:

python check_connection.py       # probes every endpoint the tools rely on

This reports which endpoints answer for your account and plan, which is the fastest way to find out what will work before connecting the server to a client. Finally, ask the model to call whoami — the quickest confirmation that the connection and role are what you expect.

Limitations

  • Read-heavy by design. Only two tools write. This is not a general-purpose Zendesk automation server.

  • Plan-gated features. recent_admin_changes needs Enterprise; list_sla_policies needs a plan with SLAs. Both degrade to an explanatory message rather than an error.

  • Results are bounded. Every tool caps how much it fetches and returns a truncated flag when it hits the cap. On very large accounts, treat the numbers as a well-sampled picture rather than a full census.

  • Single account per server instance. Credentials are read once from the environment at startup.

  • Local only. stdio transport, one operator, one set of credentials. There is no multi-user HTTP transport yet.

  • No caching. Repeated audits spend fresh rate-limit quota each run.

  • Ticket search follows the search index. Email matching in find_tickets is exact (no wildcards), and newly created tickets can take a few minutes to appear, so zero results is not proof of absence. Searching by ticket_id bypasses the index and always answers.

  • usage_30d is not universal. Zendesk reports it for triggers and macros but not automations, where it comes back null.

Troubleshooting

No tool raises on a failed call. HTTP errors (401, 403, 404, 422, 429 and any other status), network errors, missing configuration and blocked writes all come back as a result with an error message and a hint, so the MCP client shows what went wrong instead of a bare "Error executing tool".

When whoami hits an auth failure it also returns a configured block — the subdomain, the auth mode (api_token or oauth), whether an email is set, and the token length. The token itself is never included. That is usually enough to tell a wrong subdomain from an empty field from a bad credential.

Symptom

Likely cause

401 from whoami

Wrong subdomain, email or token — or Token access is disabled in Admin Center. The email must be the token owner's. Check the configured block in the response.

403 on a specific tool

The token's role lacks permission for that endpoint. security_overview needs admin.

404 on SLA or audit-log tools

Your plan does not include that feature.

Write tool refuses to run

ZENDESK_ALLOW_WRITES is not true. Once it is, you still need dry_run=false to actually apply.

Server does not appear in the client

Non-absolute paths in the config, or the client was not restarted.

Extension installs but will not start

The .mcpb was built on a different machine or with a different interpreter. Rebuild with ./build_mcpb.sh.

Repeated 429

Rate limited. The client retries up to 4 times honouring Retry-After, then reports it; wait a minute and lower max_items on the heavy tools.

find_tickets finds no user for a phone

The number is not on any user's profile. The tool already retries with a leading +, which Zendesk requires.

Implementation notes

Verified against the official Zendesk documentation:

  • Authentication: basic auth with the {email}/token:{api_token} form in base64, or Bearer for OAuth.

  • Pagination: cursor-based (page[size], links.next, meta.has_more). Offset pagination is capped at 100 pages and 10,000 records, so it is unused.

  • Rate limits: on a 429 the Retry-After header is honoured, with up to 4 retries and a 60-second ceiling per wait.

  • Search: /search/export rather than /search, because the latter caps at 1,000 total results. The export cursor expires after one hour.

  • Ticket search: requester: accepts an email address or a user id, and multi-word subjects are quoted (subject:"cannot log in"). Ticket id has no search keyword, so find_tickets fetches /tickets/{id} directly, which also avoids index lag on new tickets. Phone is a user property, not a ticket one: it resolves through type:user phone:+... first, then searches tickets by requester:<user_id>, ORing several matching users together. Zendesk requires the leading +, so the value is tried as given and then with + prepended.

  • Bulk writes: update_many accepts 100 ids per call and processes asynchronously via job_status.

The Python MCP SDK is on 2.x, where FastMCP was renamed MCPServer. pyproject.toml pins mcp>=2.0,<3.

Contributing

Issues and pull requests are welcome. Please run all the test suites before submitting, and never commit a .env, a built dist/, or a .mcpb bundle.

Ideas that would push this further:

  • Streamable HTTP transport with OAuth 2.1, so several admins can connect from claude.ai or another host with their own credentials.

  • A read cache, to avoid spending rate-limit quota on audits that run often.

  • Tools for views, forms and groups, if the business-rule audit proves useful.

License

MIT — see LICENSE. You are free to use, modify and distribute this in your own environment, commercial or otherwise.

Author

Jhoan Zabala


Not affiliated with or endorsed by Zendesk. "Zendesk" is a trademark of Zendesk, Inc.

Available Tools

13 tools
agent_workloadB
Read-only

Distribution of open tickets by assigned agent, heaviest load first. Shows where work is piling up.

NameRequiredDescriptionDefault
max_ticketsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description usefully adds the aggregation grain and sort order (open-only, heaviest first), but says nothing about how "open" is determined, whether results are paginated, or how max_tickets truncates the data. Modest added value over the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the grouping and ordering. The second sentence slightly restates the first ("heaviest load first" vs. "where work is piling up") rather than adding new information, but there is no meaningful bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be described, and the tool is low complexity. However, for a tool whose only knob truncates the result set at a default of 1000, the silence on max_tickets and on what counts as an "open" ticket leaves real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single max_tickets parameter, and the description never mentions it. The default of 1000 and the effect of lowering it (truncation vs. filtering agents) are left entirely unexplained, so the description does not compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (open tickets), the grouping dimension (assigned agent), and the ordering (heaviest load first), which lets an agent distinguish it from list-style siblings like find_tickets. It stops short of explicitly contrasting itself with backlog_health or reassign_tickets, but the verb-less noun phrase is still specific enough to identify the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Shows where work is piling up" implies a capacity/triage use case, which is genuine but soft guidance. There is no statement of when to prefer this over backlog_health or find_tickets, nor any prerequisite or exclusion. Usage is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_business_rulesA
Read-only

Audit triggers, automations and macros looking for dead rules.

Detects four problems: inactive rules, rules unused over the last 30 days, rules not modified in stale_days, and duplicate titles. kind accepts "all", "triggers", "automations" or "macros".

NameRequiredDescriptionDefault
kindNoall
stale_daysNo
max_per_kindNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the exact four detection categories and the fact that 'unused' is measured over a 30-day window while 'stale' is measured against stale_days. It stops short of explaining result volume or the max_per_kind cap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and target, followed by the detection list and the kind enumeration. Nothing is redundant and no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. For a read-only, zero-required-parameter audit tool the description is nearly sufficient; the only substantive omission is any explanation of max_per_kind, which at 0% schema coverage is undocumented everywhere.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It does well on two of three parameters – enumerating valid kind values and tying stale_days to the 'not modified in stale_days' check – but max_per_kind is never mentioned in either the description or the schema, leaving its purpose and the 500 default undisclosed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (audit) and resource (triggers, automations and macros) plus the goal ('looking for dead rules'), and enumerates the four problem classes it detects. No sibling tool overlaps this domain, so an agent can identify it unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the purpose – call it when you want to find dead automation rules – but there is no explicit when-to-use, when-not-to-use, or prerequisite statement. Since none of the sibling tools is a plausible alternative for this task, the lack of routing guidance is a minor but real gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

backlog_healthA
Read-only

X-ray of the open backlog: counts by status and priority, plus the most stalled tickets. stale_days defines how many days without an update make a ticket stale.

NameRequiredDescriptionDefault
stale_daysNo
sample_sizeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, so the safety profile is covered structurally. The description adds the semantic definition of `stale_days` ('days without an update'), which is genuinely useful, but says nothing about result size, pagination, or scope limits beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences that front-load the output shape before the parameter gloss. 'X-ray' is a minor flourish but doesn't cost clarity; every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no prose, and annotations cover the read-only safety profile. What remains is a partially documented second parameter, which is a small but real gap for a two-parameter analytical tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description bears the burden. It defines `stale_days` clearly but leaves `sample_size` (which presumably controls how many stalled tickets are returned) entirely unexplained in both schema and description. Partial compensation, hence a 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource and output ('counts by status and priority, plus the most stalled tickets'), so an agent knows exactly what this tool produces. It does not, however, distinguish itself from analytical siblings like agent_workload or security_overview, so the sibling differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'open backlog' and 'stalled tickets' — an agent can infer this is for backlog triage — but there is no explicit when-to-use/when-not statement or named alternative tool. Nothing misleads, but the agent must infer the routing itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_ticketsA
Read-only

Find tickets by ticket id, requester email, subject or phone number.

Provide at least one of the four. ticket_id fetches that ticket directly and excludes the others. email, subject and phone can be combined and are all applied together. The phone is the one on the user's profile, not a ticket field, so the user is located first and then their tickets.

NameRequiredDescriptionDefault
emailNo
phoneNo
subjectNo
ticket_idNo
max_resultsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description earns credit beyond that by disclosing a non-obvious behavioral detail: the phone must be the user's profile phone, not a ticket field, so the tool resolves the user first and then lists their tickets. It does not mention result limits or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs: the search keys are front-loaded in the first sentence, then the interaction rules. Every sentence carries distinct information with no repetition of the name or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not needed, and the zero-required-parameter schema is offset by the explicit 'at least one' rule. The remaining gaps are minor: no note on capping/pagination with max_results or behavior when no matches are found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden and does so well for the four filter parameters: it explains ticket_id exclusivity, the combinability of email/subject/phone, and the special semantics of phone. max_results (default 50) is not addressed at all, which leaves one of five parameters undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (find) and resource (tickets) and enumerates the exact search keys: ticket id, requester email, subject, phone. No sibling in the list is a ticket-search tool, and the one adjacent tool (find_user) is clearly distinct, so an agent can select this without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a hard precondition ('Provide at least one of the four') and spells out the selection rules: ticket_id is exclusive and suppresses the others, while email/subject/phone combine and are ANDed together. It gives no guidance on when to prefer this over other lookup paths or what happens when nothing matches, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_userA
Read-only

Find users by name, email or any term of the Zendesk search syntax. Returns id, role and status.

NameRequiredDescriptionDefault
queryYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the returned fields, but since an output schema exists that information is largely redundant and no pagination, result-limit, or empty-result behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core capability front-loaded and no filler. The return-value sentence is somewhat redundant given the output schema, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only search tool with annotations and an output schema, the description covers the essential scope. Only secondary details like result limits or search-syntax edge cases are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'query' parameter has no schema description, so the description must carry the load. It does say the query accepts names, emails, or general Zendesk search syntax, which is meaningful, but it gives no syntax examples, quoting rules, or format constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find users') plus the searchable fields, and names the return shape. It is distinguishable from find_tickets, but it never explicitly contrasts itself with that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mention of 'name, email or any term of the Zendesk search syntax' implies how to use it, but there is no explicit when-to-use guidance, no exclusions, and no routing to siblings like find_tickets or whoami.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sla_policiesA
Read-only

List the SLA policies with their targets by priority and metric.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds only the shape of the returned data ('targets by priority and metric'), which is useful context but not rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; every clause earns its place by stating the resource and the returned content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, an output schema covering return values, and annotations covering the safety profile, the description supplies everything an agent needs to select and invoke the tool. Only the absence of explicit usage guidance keeps it short of perfect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4. There is nothing further the description could reasonably add about parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List') and resource ('SLA policies') and summarizes the content returned ('targets by priority and metric'). It is clear, though it does not explicitly contrast itself with siblings, which is acceptable since none of the siblings touch SLA policies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this tool versus alternatives, and no prerequisites or exclusions are mentioned. For a zero-argument read tool the usage is largely self-evident, but the description offers no guidance at all.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ticket_fieldsB
Read-only

Inventory of ticket fields, flagging which are inactive and which are system fields. Useful before cleaning up forms.

NameRequiredDescriptionDefault
include_inactiveNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that results flag inactive and system fields, which is useful context, but says nothing about auth scope, rate limits, or pagination. With annotations carrying safety, a 3 fits the modest extra value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loading what the tool returns and then the use case. No filler, though the second sentence is a soft hint rather than high-value content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-format explanation is unnecessary, and read-only annotations cover the mutation question. The remaining gap is the include_inactive parameter and its default, which neither schema text nor description addresses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter include_inactive (default true) is never explained. The mention of 'inactive' gestures at the concept but does not clarify whether the toggle filters or merely annotates them, leaving the agent to infer behavior from a default it cannot see in the text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource ('ticket fields') with an inventory/list action and adds what the output reveals (inactive vs system flags). It is distinguishable from siblings like list_sla_policies or find_tickets, though it does not explicitly name a competitor to avoid.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful before cleaning up forms' gives a use context, but there is no explicit when-to-use vs when-not, no prerequisites, and no named alternative. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

offboarding_reportA
Read-only

Everything left hanging on an agent before deactivating them: assigned open tickets, the groups they belong to, role and last login. Read-only; it changes nothing.

NameRequiredDescriptionDefault
user_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The safety profile is already declared by annotations (readOnlyHint=true, destructiveHint=false, openWorldHint=true), and 'Read-only; it changes nothing' merely restates them. The description does add the inventory of what the report surfaces, but adds no permission requirements, scoping, or freshness/pagination behavior beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first front-loads the payload inventory, the second disposes of the safety question. No filler, nothing repeated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description usefully previews report contents. For a one-parameter read-only tool this is nearly sufficient; only the identity/format of user_id is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for the single user_id parameter, yet it never mentions it — an agent cannot tell whether it takes a numeric ID, an email, or a username from the description. 'An agent' implies the target but supplies no format or acceptance detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (an agent's offboarding state) and enumerates exactly what is returned: assigned open tickets, groups, role, last login. The framing 'before deactivating them' plus 'read-only; it changes nothing' cleanly separates it from the mutating sibling set_user_status and the narrower find_user/agent_workload tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'before deactivating them' gives a clear use context — run this prior to offboarding an agent. It does not name an alternative tool or state exclusions (e.g., when to prefer agent_workload or find_user instead), so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reassign_ticketsA
Destructive

Reassign an agent's open tickets to another agent.

With dry_run true (the default) it only reports which tickets would be touched, without modifying anything. Set dry_run to false to execute.

NameRequiredDescriptionDefault
dry_runNo
to_user_idYes
max_ticketsNo
from_user_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing the dry-run default and what the non-destructive mode actually returns, which is exactly the kind of context an agent needs before a destructive bulk operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the operation and followed by the mode switch. The hard line breaks split single sentences awkwardly, but there is no filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the dry-run behavior is well covered. However, for a destructive bulk mutation it omits what qualifies as an 'open ticket,' what happens to tickets beyond max_tickets, and whether elevated permissions are required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden, and it only elaborates on dry_run (default true, report-only behavior, how to execute). The three other parameters — from_user_id, to_user_id, and max_tickets — receive no explanation of meaning or constraints, leaving half the surface documented only by self-evident names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('reassign an agent's open tickets to another agent'), making it immediately distinguishable from read-only siblings like find_tickets and agent_workload. It does not, however, explicitly contrast itself with adjacent mutation tools such as offboarding_report or set_user_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the two execution modes (report-only vs. execute) and their trigger, which is genuine usage guidance for the tool itself. It gives no guidance on when this tool is appropriate versus siblings that also touch ticket ownership, and no prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recent_admin_changesA
Read-only

Recent configuration changes according to the audit log.

action accepts create, destroy, exported, login or update. source_type accepts user, rule, ticket, apitoken, among others. Requires the Enterprise plan.

NameRequiredDescriptionDefault
daysNo
actionNo
max_itemsNo
source_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds non-obvious context the annotations cannot: the data comes from the audit log and the tool is plan-gated to Enterprise, which is exactly the kind of entitlement constraint an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the resource and source, followed by parameter hints and the plan constraint. No filler, though the value enumeration is slightly list-like rather than integrated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the Enterprise gate plus source is disclosed. The gaps are the undocumented `days` and `max_items` parameters and the absence of any default-behavior note (e.g., 7-day window), which matter for a tool whose schema has no descriptions at all.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It partially does: it enumerates accepted values for `action` (create, destroy, exported, login, update) and gives examples for `source_type`. But `days` and `max_items` are left completely undocumented, and the 'among others' phrasing makes the value lists non-exhaustive, so compensation is incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (recent configuration changes from the audit log), so an agent knows this is an audit-log query rather than a mutation. It does not differentiate itself from the sibling audit_business_rules, which is also audit-related, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a hard prerequisite ('Requires the Enterprise plan'), which is genuine usage guidance. However, it never says when to prefer this tool over audit_business_rules or other siblings, and gives no when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

security_overviewB
Read-only

Security overview of the account: who holds the admin role, which OAuth tokens exist and which have gone unused, and which apps are installed.

NameRequiredDescriptionDefault
unused_token_daysNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the read-only nature and external-world reach are covered. The description adds the scope of what's returned, which is useful, but doesn't mention the unused-token threshold semantics or result size.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One efficient sentence with the resource front-loaded and the three content categories enumerated. No padding, though a hint about usage context would have been worth the space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need not be explained, and annotations cover safety. But with 0% param coverage, the description should clarify the unused_token_days parameter, and it offers no differentiation from sibling security tools — leaving gaps for a tool that overlaps several siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter unused_token_days only has a default of 90 in the schema with no explanation. The description alludes to 'unused' tokens but doesn't define the window or explain how this parameter controls it, leaving the core parameter undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific subject (account security overview) and enumerates the concrete contents: admin role holders, OAuth tokens including unused ones, and installed apps. It is distinguishable from siblings like whoami or recent_admin_changes, though it overlaps conceptually with offboarding_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus the security-adjacent siblings (whoami, recent_admin_changes, offboarding_report). The agent must infer the appropriate context from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_user_statusA
Destructive

Suspend or reactivate a user, and/or change their role.

role accepts end-user, agent or admin. With dry_run true (the default) it only reports the proposed change against the current state.

NameRequiredDescriptionDefault
roleNo
dry_runNo
user_idYes
suspendedNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is partly covered. The description adds a genuinely important behavioral fact not in the annotations: dry_run defaults to true and only reports the proposed change against current state, which prevents accidental mutation. It still omits what an actual suspension does (active sessions, tokens, reversibility) and any permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler; the capability statement is front-loaded and the dry_run caveat follows immediately. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. For a destructive, four-parameter mutation tool the description covers the safe-preview mode and role vocabulary but leaves the mutation's side effects and authorization requirements unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden and does explain two of four parameters well: the accepted role values (end-user, agent, admin) — critical since the schema declares no enum — and dry_run's default and effect. user_id and suspended are never described beyond what their names imply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb pair and resource: 'Suspend or reactivate a user, and/or change their role.' It even extends beyond the tool name set_user_status by revealing the role-change capability. However, it never references any sibling tool, so an agent gets no explicit routing signal versus find_user or offboarding_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the operations described (suspend/reactivate/role change), and the dry_run default gives a safe-preview path, but there is no explicit when-to-use or when-not-to-use guidance and no named alternative among the twelve siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiA
Read-only

Verify the Zendesk connection and show which account and role the server operates as. Use this first to confirm the credentials work.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description goes beyond that by disclosing what the tool reveals (account and role) and its role as a credential/auth verification step, which is genuine added context; only return-format details are absent, and an output schema exists anyway.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the diagnostic purpose front-loaded before the usage instruction. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only probe with full annotation coverage and an existing output schema, the description supplies everything an agent needs: what it does, what it returns conceptually, and that it should be called first.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameter-level guidance is needed or missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: verify the Zendesk connection and report the account and role the server runs as. That is clear and unambiguous, and no sibling tool does anything comparable. It does not explicitly name a sibling to differentiate itself, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this first to confirm the credentials work" gives an explicit, actionable trigger: run it as the initial diagnostic before other calls. It does not describe when not to use it or name an alternative, but for a unique diagnostic tool no meaningful alternative exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.2.0
    • First observedagent_workload
    • First observedaudit_business_rules
    • First observedbacklog_health
    • First observedfind_tickets
    • First observedfind_user
    • First observedlist_sla_policies
    • First observedlist_ticket_fields
    • First observedoffboarding_report
    • First observedreassign_tickets
    • First observedrecent_admin_changes
    • First observedsecurity_overview
    • First observedset_user_status
    • First observedwhoami

TDQS

A3.6/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes: auditing (audit_business_rules, recent_admin_changes), lookup (find_user, find_tickets), and reporting (backlog_health, agent_workload, security_overview). Minor overlap exists between whoami and security_overview (both inspect account/role state) and between find_user and offboarding_report (both surface role/status), but descriptions differentiate them adequately.

Naming Consistency3/5

Action-oriented tools follow verb_noun (find_user, find_tickets, reassign_tickets, set_user_status, audit_business_rules), but a large group of reporting tools use bare noun phrases (backlog_health, agent_workload, security_overview, recent_admin_changes, offboarding_report), plus the outlier whoami. The split is somewhat defensible but not a single predictable pattern, so conventions are mixed though still readable.

Tool Count5/5

At 13 tools the set is well-scoped for a Zendesk admin server, sitting comfortably within the ideal range. Each tool earns its place by covering a distinct audit, lookup, or remediation concern without obvious redundancy.

Completeness4/5

The surface covers auditing, security, workload, offboarding, lookup, and some write operations (reassign_tickets, set_user_status) with dry-run safety. However, several audit tools identify problems (dead rules, inactive fields) with no corresponding cleanup/mutation tool, and broader ticket maintenance operations are absent, leaving minor gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to search tickets, manage tags, create tickets, inspect automations, and more in Zendesk.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to audit and analyze Zendesk instances through a read-only MCP interface, providing tools for triggers, automations, analytics, and cross-reference queries.
    74
    MIT