Skip to main content
Glama
fruggr

Zendesk MCP Server by Fruggr

Zendesk MCP Server

Glama score MCP Registry npm version License: MIT Node.js

A Model Context Protocol (MCP) server that puts Zendesk inside your AI assistant, for both sides of the conversation.

For agents: it finds answers in the Help Center; drafts, updates and translates articles while keeping the languages in sync; and handles Support tickets end to end, comments, triage and image attachments included.

For your customers: it opens the same door the Help Center's "Submit a request" form does. They pick the kind of request, get walked through the questions that form actually asks, attach a screenshot, then follow the ticket — read the replies, answer back, close it when it's resolved. See End-user mode.

It all happens in plain language, without switching apps.

It does roughly what the Zendesk agent for Microsoft 365 Copilot does, minus the tie to one vendor: it drops into any MCP client (Claude Desktop, Claude Code, Cursor, VS Code, and the rest). And it always acts with each user's own Zendesk permissions, never a shared admin key.

What your assistant can do

Ask in natural language; the assistant works out the context and the intent, then calls the right tools on your behalf.

  • Find answers in the Help Center. "How do I request a software license?" or "what's the time-off policy?" surfaces the right article, matched by meaning rather than by keyword.

  • Create, view and update tickets without leaving the conversation: open a ticket, check its status, add a public reply or an internal note, change the priority or the assignee, mark it solved.

  • Summarize a ticket for a report or a quick decision. The assistant pulls the details and the full comment thread and gives you the gist in a sentence.

  • Read the screenshots and photos attached to a ticket. Error dialogs, UI captures and product photos are handed to your assistant's own model as images, so it can describe them or act on what they show.

  • Search and triage your queue in plain language: "show me my open tickets about billing from this week."

  • Draft and maintain knowledge-base articles. You can write a new one, or revise a large one a single section at a time, so the whole HTML body never has to round-trip through the model.

  • Submit and follow a request as a customer, not an agent. Choose between the kinds of request the vendor offers, answer only the questions that form asks, and then track it: what was replied, what you replied, and whether it's done.

Related MCP server: Zendesk MCP Server

Why this server

Most Zendesk integrations run on a shared admin API key, which hands every user full access to every ticket, and bolt on a fixed set of tools. This one is built differently.

  • Per-user authentication, OAuth only. Both transports use OAuth 2.1 PKCE: each user signs in with their own Zendesk credentials, so the assistant sees and touches exactly what that person is allowed to, the same scoping you get by signing into Zendesk directly. Static API tokens are deliberately not supported (why).

  • Two audiences, one server. Because auth is per-user rather than a shared admin key, the same install serves your agents and your customers — the end-user surface is a namespace you switch on, speaking the API path Zendesk reserves for requesters. Most Zendesk MCP servers are agent-only by construction.

  • Section-based article editing. For large Help Center articles, read and rewrite one section at a time (parsed by h1/h2/h3 headings) instead of shuffling the full HTML body through the assistant. On a targeted edit that cuts tokens by a factor of 10 to 100.

  • Native multimodal attachments. Ticket images come back as native MCP image content, so the client's own model (Claude, GPT, Gemini, whichever) sees the pixels directly. No server-side vision model, no extra API key, and nothing tying you to one provider. Non-image attachments come back as text references, and both image caps are configurable.

  • A tool surface you can cap. Expose every operation as its own tool, group them into namespace proxies, or collapse everything into a single unified tool. You can also filter by namespace or down to read-only operations, so each context loads only the surface it needs (see Tool surface).

  • Two deployment shapes, same auth story. Run it on your laptop as a stdio MCP server, or deploy it as a private remote MCP server reached over HTTP, with one Zendesk session per request and each client carrying its own user's token.

  • A lean stack: the official MCP TypeScript SDK (@modelcontextprotocol/server) plus zod, speaking to the Zendesk Support and Help Center (Guide) APIs.

Look elsewhere when:

  • You need Zendesk products outside Support and Guide (Talk, Explore analytics, Sell). Those endpoints aren't covered.

  • You need a single shared service account, or static API-token auth. This server supports neither, by design (see below).

What this server does not do

There is no API-token authentication. The server speaks OAuth 2.1 PKCE and nothing else: no ZENDESK_EMAIL + ZENDESK_API_TOKEN (Basic auth) mode, in any transport. That is deliberate, for two reasons.

  1. API tokens are insufficiently secure. A Zendesk API token is a long-lived, static, shared secret that carries the full rights of the user who issued it. There is no per-user scoping, no short expiry, and no per-user consent or revocation. OAuth 2.1 PKCE issues per-user, revocable tokens instead.

  2. API tokens don't scale. A single static credential can't attribute actions to individual users, and it can't be revoked granularly. It also makes a multi-user remote deployment unsafe: over HTTP it would expose the issuing user's rights to every caller.

If you specifically need an API-token or service-account mode (headless CI with a shared account, say), use one of the other Zendesk MCP servers that support it. A few are listed under Inspiration & related projects.

Quick start: local (stdio)

The default shape: one developer, one Zendesk account, OAuth 2.1 PKCE in the browser. You need Node.js >= 22 and a Zendesk instance (Support or Suite).

Install

# Run without installing
npx -y @fruggr/zendesk-mcp-server <your-subdomain>

# Or install globally
npm install -g @fruggr/zendesk-mcp-server
zendesk-mcp-server <your-subdomain>

Signing in needs a Zendesk OAuth client, so register one first (next section).

Zendesk OAuth setup

  1. Go to Admin Center → Apps and integrations → APIs → OAuth Clients

  2. Create a public client:

    • Identifier: <your-subdomain>_zendesk (or set ZENDESK_OAUTH_CLIENT_ID)

    • Redirect URL: http://localhost:27439/callback (change the port to match OAUTH_CALLBACK_PORT / --callback-port if you override it; Zendesk accepts several redirect URLs, one per line)

If the client restricts its allowed scopes, it needs read — plus write unless the server runs with --read-only, which asks Zendesk for the read scope alone.

On the first tool call the server starts the sign-in flow: it opens a browser window and returns the authorize URL in a tool message. The call does not block waiting for sign-in, so authenticate in the browser and then retry the request. The token is persisted to an owner-only file and reused across restarts, so you don't authenticate again every time your MCP client respawns the server (path and overrides: OAUTH_TOKEN_FILE). Several instances can run side by side — a read-write one and a --read-only one, say — without trading credentials.

MCP client wiring

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "zendesk": {
      "command": "npx",
      "args": ["-y", "@fruggr/zendesk-mcp-server", "<your-subdomain>", "--mode", "single"]
    }
  }
}
claude mcp add zendesk -- npx -y @fruggr/zendesk-mcp-server <your-subdomain> --mode single

Add to your .vscode/mcp.json:

{
  "servers": {
    "zendesk": {
      "command": "npx",
      "args": ["-y", "@fruggr/zendesk-mcp-server", "<your-subdomain>", "--mode", "single"]
    }
  }
}

Something not working? See Troubleshooting.

Quick start: remote (HTTP)

Experimental. The HTTP transport ships, but it has not yet been exercised end-to-end against a real Zendesk tenant from every MCP client. Local stdio is the supported path.

You can also deploy a private remote MCP server for one Zendesk account. It is its own OAuth authorization server: web clients such as claude.ai and ChatGPT add it by URL and register themselves, each user signs in to Zendesk through it, and no shared admin key or per-client Zendesk setup is involved. Each release also ships a hardened, distroless container image for it (ghcr.io/fruggr/zendesk-mcp-server), signed and attested. The full guide covers the image, the one redirect URL to add to your Zendesk OAuth client, the master secret and grant store, --public-url behind a reverse proxy, trusted clients, MCP client wiring, CORS and what stays the operator's job: docs/http-deployment.md.

Tool surface

Tools are grouped into namespaces: Tickets, Help Center, Users & Organizations, Search, and Requests — the end-user surface, which is opt-in and covered under End-user mode. The server registers them in one of three modes, so you can trade granularity against context budget:

  • all: every operation as its own tool, for clients with good tool selection;

  • namespace (default): one proxy tool per namespace, a balanced middle ground;

  • single: a single zendesk tool, for models with limited tool slots.

Proxies take { "operation": "<tool_name>", "params": { … } } and validate params through the original schema. --namespace, --tool and --read-only filter tools before the proxies are built, so each proxy describes only the operations that survive.

There's one way to pick the inventory (--namespace / --tool), --mode packages it, and --read-only narrows it. When the combination isn't obvious, don't guess — --print-tools has the server answer what it would expose, with no credentials needed.

Every tool with its description and its read/write mode: docs/mcp-tools-reference.md. The flags and worked examples: docs/configuration.md.

End-user mode

The audience for everything above is a Zendesk agent. This section is about the other one: your customers.

On the web, a customer opens a ticket through the Help Center's "Submit a request" form — they pick a kind of request, fill in the fields that kind asks for, attach a file, and later come back to read the replies. End-user mode is that same journey, in their assistant.

Who it's for

A vendor pointing their customers at an MCP server, so support happens where those customers already work. They install it themselves, sign in with their own Help Center account, and never see anything that isn't theirs.

Turning it on

The end-user tools live in the requests namespace, and it is opt-in: an agent install shouldn't inherit tools built for someone else, and one of them (marking a request solved) doesn't work under an agent token at all — Zendesk accepts it and silently does nothing. help_center is worth serving alongside it, since a customer who can search the knowledge base often doesn't need to open a ticket in the first place.

The flags, and how to have the server print what a combination exposes: docs/configuration.md.

The journey it supports

  • See what kinds of request are available. The forms the vendor offers, by their customer-facing names.

  • Learn what one of them asks. The questions on that form, which are required, and for dropdowns the exact choices — so the assistant can gather them in conversation instead of guessing at a payload.

  • Submit it, with attachments.

  • Follow it. List their requests, read one with its whole conversation (each reply attributed, and support agents marked as such), reply back, and mark it solved when it is.

What it asks of the Zendesk account

Nothing the agent side doesn't already need, plus one thing: at least one ticket form marked visible to end users, because that is what a customer picks between. Sign-in is interactive, through a browser, by design — there is no scripted or headless path to an end-user token, which is the same protection that stops anyone else signing in as your customer.

The prerequisites in full: docs/configuration.md. The step-by-step walkthrough, written for someone who doesn't work in a terminal: docs/end-user-onboarding.md.

What a customer can't do — and shouldn't

A customer can do less than an agent. That's the point, not a gap:

  • Only their own tickets. Enforced by Zendesk, not by us.

  • No internal notes, in either direction. Agent-only notes never appear in what this surface returns — Zendesk filters them out of the requester's view of a ticket entirely.

  • No priority or type. Zendesk drops both when a customer sets them; triage stays with the agents.

  • Closing a ticket only once an agent has picked it up. Until then Zendesk won't let the requester solve it, so the tool says so rather than pretending.

  • No search across the ticket base, no user lookups, no views, no macros.

Help Center context

Beyond tools, the server hands the LLM the structure of your Help Center: the active locales, the category → section tree with IDs, the visibility segments and the permission groups. With those in hand it uses real IDs instead of guessing or fuzzy-matching names. It all arrives through MCP-native channels, namely the instructions blob sent on initialize plus pull-only resources for the topology and for reading (or pinning) individual articles. The resources are fetched with the caller's own token, and clients that don't support resources ignore them silently.

What's exposed, what the promoted-article pre-listing costs in requests, and how to turn each piece off: docs/help-center-context.md.

Configuration

The complete reference for the CLI flags (--mode, --namespace, --read-only, --transport, --public-url, and so on) and the environment variables (ZENDESK_SUBDOMAIN, OAUTH_TOKEN_FILE, PUBLIC_URL, the attachment-vision caps) lives in docs/configuration.md. Every variable has its own anchor, so you can deep-link a specific setting.

Troubleshooting

Browser not opening during OAuth login, the callback port already in use, having to re-authenticate every time, and Permission denied on the Guide-admin endpoints are covered in docs/troubleshooting.md. Restart with LOG_LEVEL=debug for the full OAuth flow trace.

Development

Setting up the repo, the toolchain, dev mode and how to test a PR branch are covered in CONTRIBUTING.md. Architecture and code-style conventions live in AGENTS.md.

FAQ

Which Zendesk products are supported? Zendesk Support (tickets, users, organizations) and the Help Center / Guide (articles, sections, categories, translations, labels, content tags, segments, attachments). Talk, Explore and Sell are out of scope.

Do I need a Zendesk admin API key? No, and the server doesn't support one. Each user authenticates with their own credentials and the server acts with exactly their permissions (why).

Is it safe to run via npx? Releases are published from CI via npm Trusted Publishing (OIDC), so each version carries a build provenance attestation you can verify on its npm page. No secrets are ever logged by the server.

Contributing

Pull requests are welcome, AI-assisted ones included, as long as the human author has read and validated every line. The guide, the author checklist and the review workflow are in CONTRIBUTING.md.

Versions follow SemVer and are released automatically from Conventional Commits; the history is in CHANGELOG.md.

This project was built with reference to:

License

MIT


Built and maintained by Digital4better for the Fruggr project.

Available Tools

53 tools
add_private_noteAdd Private Note

Add an internal note (not visible to requester) to a ticket, optionally with file attachments (uploaded via the Zendesk Uploads API and carried on the note). The note is appended to the ticket thread; use add_public_comment instead when the reply should be visible to the requester.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesNote text (internal, agent-only). Plain text or HTML; not shown to the requester.
ticket_idYesTicket ID — the numeric id of the ticket to annotate. Obtain it from search_tickets or list_tickets.
attachmentsNoFiles to attach to this note (base64-encoded content).
add_public_commentAdd Public Comment

Add a public comment (visible to requester) to a ticket, optionally with file attachments (uploaded via the Zendesk Uploads API and carried on the comment). The comment is appended to the ticket thread and emails the requester; use add_private_note instead for an internal, agent-only note.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesComment text sent to the requester. Plain text or HTML; visible in the ticket.
ticket_idYesTicket ID — the numeric id of the ticket to reply on. Obtain it from search_tickets or list_tickets.
attachmentsNoFiles to attach to this comment (base64-encoded content).
archive_articleArchive Help Center ArticleA
DestructiveIdempotent

Archive (soft-delete) a Help Center article: it is removed from the Help Center but can be restored from the Guide admin UI. Returns a confirmation message; the article and all its translations become invisible to end users. This is the only removal the Zendesk API offers — permanent deletion is not available via the API (do it from the Guide admin UI). To only hide an article temporarily while keeping it in the knowledge base, use update_article with draft: true (unpublish) instead. Guarded by a required confirm flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesExplicit safety guard: must be set to true to archive the article. Any other value refuses the operation without calling Zendesk.
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: it is a soft-delete that is restorable from the Guide admin UI, the article and all translations become invisible to end users, and it returns a confirmation message. The statement that permanent deletion is unavailable via the API is a critical 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.

Conciseness4/5

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

The destructive semantics are front-loaded in the first clause and each sentence carries useful information. There is mild redundancy with 'Guide admin UI' appearing in two separate sentences, but overall it is efficient and well-ordered.

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 destructive mutation with no output schema, the description covers the safety profile, restore path, end-user impact, and return value. An agent has everything needed to call it correctly and safely.

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 100%, so both parameters are fully documented in the schema itself, including the confirm safety guard. The description only echoes the guard ('Guarded by a required confirm flag') without adding syntax or format detail beyond what the schema provides, so the baseline of 3 applies.

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 verb and resource ('Archive (soft-delete) a Help Center article') and immediately clarifies the semantics of the operation. It distinguishes itself from the sibling update_article by naming it explicitly as the non-destructive alternative.

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

Usage Guidelines5/5

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

Explicitly tells the agent when to use this tool versus alternatives: it is the only removal the API offers, permanent deletion is not available, and update_article with draft: true should be used to hide temporarily. This covers when-to-use, when-not, and named alternatives.

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

compare_translationsCompare Article TranslationsA
Read-onlyIdempotent

Compare two locales of the same article to decide whether the target translation needs work, reporting independent signals instead of one ambiguous verdict. (1) Header — a "Freshness" verdict for the target, derived from the two translations' updated_at timestamps: if the source was edited after the target it is "likely behind, review recommended" (with the day gap), otherwise "up to date". This is the primary staleness signal and is always available. (2) Zendesk's own per-translation "outdated" flag for the target ("yes"/"no"/"unknown"), shown as a secondary overlay: it is only set through Guide's native "mark out of date" workflow and NOT by API edits, so a "no" does not by itself mean current — prefer Freshness. (3) A global structure check (section count and heading-tag sequence); on mismatch the header warns the per-index rows may be misaligned. (4) A per-section table matched by index, status "ok" (present in both), "missing" (present in source, absent in target) or "extra" (present in target, absent in source). (5) Per-section source/target word counts, INFORMATIONAL ONLY: a length difference between languages is normal and is deliberately NOT flagged as a divergence — do not read a word-count gap as an edit regression or staleness. Read-only; performs three Help Center GET calls (both translations plus the translations list for the outdated flag).

ParametersJSON Schema
NameRequiredDescriptionDefault
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.
source_localeYesReference locale to diff against, e.g. "en-us". Usually the article source_locale (from get_article).
target_localeYesTarget locale to compare against source

TDQS

A4.4/5.0
Behavior5/5

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

With annotations already covering the read-only/safe profile, the description adds substantial behavioral context: it discloses that the outdated flag is set only by Guide's native workflow and NOT by API edits, that structure mismatches warn of row misalignment, and that it performs three GET calls. This is exactly the beyond-schema context an agent needs to interpret output correctly.

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?

Front-loaded with purpose followed by five numbered signals, so structure is legible. It is dense and long, but with no output schema nearly every sentence carries necessary return-value semantics, so the length is largely earned.

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?

No output schema exists, and the description fully compensates by enumerating each returned signal (Freshness, outdated flag, structure check, per-section table, word counts) and their semantics. For a read-only comparison tool, nothing an agent needs to call and interpret it is missing.

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 100%, so all three parameters are already documented with descriptions. The description consistently uses 'source' and 'target' but adds no format or constraint details beyond what the schema provides, so baseline 3 applies.

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 verb (compare) and resource (two locales of the same article) plus the decision it supports (whether the target translation needs work). An agent can distinguish this from siblings like find_translation_gaps or list_article_translations without opening a schema.

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?

Strong guidance on how to use the result — 'prefer Freshness' over the outdated flag, and warnings that word-count gaps must not be treated as divergence. However, it never explicitly names when to choose this tool over sibling gap-analysis tools, so the comparison framing is left implicit.

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

create_articleCreate Help Center ArticleA

Create a new article in a section and return the created article with its id. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesArticle body as HTML (this becomes the source-locale content).
draftNoWhen true (default), the article is created unpublished; set false to publish immediately.
titleYesTitle of the new article, in its source locale.
localeNoSource locale for the article, e.g. "en-us" or "fr". Defaults to the Help Center's default locale; becomes the article's source_locale.
promotedNoWhen true, marks the article as promoted (featured) in its section. Defaults to false.
author_idNoAuthor user ID. Defaults to the authenticated user.
section_idYesSection that will contain the article (numeric id from list_sections).
label_namesNoLabel names for search ranking (use list_labels to see existing labels)
content_tag_idsNoContent tag IDs (use list_content_tags to find them)
user_segment_idNoUser segment ID for visibility (use list_user_segments to find it; if that is forbidden because the token is not a Guide admin, reuse the user_segment_id of an existing article from get_article). Defaults to everyone.
permission_group_idYesPermission group ID (use list_permission_groups to find it; if that is forbidden because the token is not a Guide admin, reuse the permission_group_id of an existing article from get_article).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover the safety profile (not read-only, not idempotent, not destructive). The description adds genuinely useful behavior beyond them: the tool returns the created article with its id, and the supplied locale becomes the article's source_locale. It does not mention the draft/publish default or any rate/permission constraints, which keeps it short of a 5.

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?

Three compact sentences, front-loaded with the core action and return value, then the permission prerequisite, then the sibling handoff. No 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?

For an 11-parameter creation tool with no output schema, the description covers the key gaps an agent needs: the return value, the critical required permission_group_id, and the translation follow-up path. It leaves some behavioral detail (draft default behavior, author default) to the schema, which is acceptable given full schema coverage.

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 100%, including usage hints like list_sections/list_labels/list_user_segments, so the schema carries parameter explanation. The description only reinforces permission_group_id and the locale↔source_locale relationship, adding marginal value over structured data.

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?

Specific verb (Create) plus resource (article in a section) and it states the return (created article with id). It is clearly distinguishable from sibling create_article_translation, which it explicitly names as the follow-up for other locales.

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?

Gives sequencing guidance: use list_permission_groups to obtain the required permission_group_id, and use create_article_translation afterwards for other locales. It does not state when-not-to-use this tool (e.g. for existing articles, where update_article applies), so it stops short of full routing.

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

create_article_attachmentCreate Article AttachmentA

Upload a file to a Help Center article and return the created attachment (its id, file name, content type, size and content URL). Not idempotent: calling it again uploads another copy rather than replacing the previous one. This is for article assets — for files on support tickets use get_ticket_attachments, and to see an article's existing attachments use list_article_attachments.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_nameYesName to store the file under, including its extension (e.g. "screenshot.png"); used as the download name.
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.
file_base64YesThe file's raw bytes as a base64-encoded string; the server decodes them before upload. At most 10420224 characters (about 7.45 MB of file); the HTTP transport additionally caps request bodies at 4 MB.
content_typeNoMIME type of the file, e.g. "image/png" or "application/pdf". Defaults to application/octet-stream when omitted.application/octet-stream

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, but the description adds the concrete consequence of non-idempotency ('uploads another copy rather than replacing'), which is actionable beyond the boolean. It also compensates for the absent output schema by enumerating the returned fields. It does not mention auth/permission requirements, so not a full 5.

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?

Three sentences, front-loaded with the core action and return value, followed by the important non-idempotency caveat and sibling routing. No filler; every sentence 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 write tool with no output schema, the description supplies what the schema cannot: the shape of the return value, the non-idempotency behavior, and disambiguation from related attachment tools. Nothing an agent needs to call it correctly is missing.

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 100%, so the schema already documents all four parameters including base64 encoding, size limits and MIME type. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.

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 verb (upload) and resource (file to a Help Center article), and explicitly describes the return payload. It distinguishes itself from siblings by naming both get_ticket_attachments and list_article_attachments, so an agent can tell it apart without opening other schemas.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'for files on support tickets use get_ticket_attachments' and 'to see an article's existing attachments use list_article_attachments.' Both the when-to-use and the alternatives are stated.

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

create_article_translationCreate 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesTranslated body (HTML)
draftNoCreate the translation as a draft (not visible to end users). Defaults to false (published).
titleYesTranslated article title.
localeYesTarget locale (e.g., "fr", "de")
article_idYesID of the existing article to translate.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the safety profile (not read-only, not idempotent, not destructive, open-world). The description adds meaningful context beyond them: the article-existence prerequisite, the no-existing-translation constraint (which effectively explains the non-idempotent behavior), and the return payload (locale, title, draft state). It does not mention permission/auth requirements, which is the remaining gap.

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?

Front-loads the core action, then the prerequisites, the constraint with alternatives, and the input requirement. Every sentence carries distinct information with no repetition.

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 mutation tool with no output schema, the description covers the action, prerequisites, constraint, alternatives, required inputs, and even the shape of the returned translation. Nothing an agent needs to invoke it correctly is missing.

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 100%, so all five parameters are already documented in the schema. The description only reinforces the body requirement ('full HTML body') and the locale/draft concepts, adding marginal meaning over the structured fields. Baseline 3 is appropriate.

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 verb (create) and resource (article translation) scoped to a locale, and explicitly distinguishes itself from create_article (which creates the source article) and update_article_translation (which modifies an existing translation). An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicitly states the precondition (article must already exist, use create_article first), the constraint (target locale must not already have a translation), and names the two alternatives — update_article_translation for modifying and list_article_translations for discovering existing locales. Nothing is left to inference.

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

create_content_tagCreate 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 (filter by name_prefix) 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesContent tag name as shown to end users (e.g., "billing", "getting-started").

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds useful behavior beyond that: it discloses the return payload ('returns the created tag with its id') and implies a non-idempotent duplicate risk by recommending a lookup first. Permission requirements and the consequence of duplicates are not stated, keeping it short of a 5.

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?

Three tightly written sentences: purpose first, then what it returns and the duplicate-avoidance workflow, then the contrasting alternative. Every sentence carries distinct information with no repetition.

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?

Despite having no output schema, the description states the return value ('the created tag with its id'), covers the create-then-attach lifecycle, and routes to the correct alternative for a closely related concept. Nothing needed to invoke it correctly is missing.

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?

Only one parameter, and schema description coverage is 100% with a clear description and example values ('billing', 'getting-started'). The description's 'end-user visible labels' phrasing reinforces the schema rather than adding new syntax or constraint detail, so the baseline 3 for fully documented schema applies.

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 verb+resource ('Create a new content tag for Guide articles') and immediately defines what a content tag is and how it differs from article labels, a sibling concept (list_labels). An agent can distinguish it from manage_tags and list_content_tags without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit pre-flight step ('check list_content_tags first, filter by name_prefix, to avoid duplicates'), the follow-up attachment path ('content_tag_ids of create_article or update_article'), and a named alternative for the when-not case (internal search-ranking labels → list_labels).

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

create_ticketCreate Zendesk Ticket

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. Discover custom field ids and their accepted option values with list_ticket_fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags to set on the new ticket. Each tag is a single lowercase token (join multi-word tags with an underscore). Use manage_tags later to add or remove individual tags.
typeNoTicket type. One of problem, incident, question, task.
subjectYesTicket subject — the short summary line shown in ticket lists and search results.
group_idNoId of the group to assign the ticket to.
priorityNoTicket priority. One of urgent, high, normal, low.
assignee_idNoUser id of the agent to assign the ticket to.
descriptionYesTicket description — the body of the request. It becomes the ticket's first public comment (visible to the requester).
custom_fieldsNoCustom field values as { id, value } pairs (field ids come from your Zendesk admin settings). Call list_ticket_fields first to discover the numeric field ids and, for dropdown/multiselect fields, the exact option values Zendesk accepts.
find_translation_gapsFind Help Center Translation GapsA
Read-onlyIdempotent

Audit the Help Center tree for a target locale and report every category and section that has no translation, or one that is still an unpublished draft. Use it before or after translating articles: an article published in a second locale is unreachable while its parent section only exists in the source locale. Listing sections in that locale cannot answer this — a node with no translation is simply absent, without saying why, and a node whose translation is an unpublished draft may still be listed under its draft name — so this audit reads the draft flag on each node instead of trusting that listing. Costs two listings and covers up to 100 categories and 100 sections; past that only the first page of each level is audited, and the report says so — pass category_id to narrow it. Fix what it reports with set_section_translation / set_category_translation.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeYesLocale to audit, e.g. "fr" or "de" — usually a non-default active locale of the Help Center (zendesk-hc://topology lists them). A locale that is not active is reported as a warning, since every node would then look untranslated.
category_idNoRestrict the audit to this category and the sections it contains (id from list_categories). Omit to sweep the whole tree, which costs two listings and covers up to 100 categories and 100 sections.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses the cost (two listings), the coverage cap (100 categories and 100 sections, only first page past that, with a self-reporting caveat), the inactive-locale warning, and crucially that it reads the draft flag rather than trusting the listing. This is exactly the kind of behavior an agent cannot infer from 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?

Front-loads the purpose in the first sentence and keeps every clause information-bearing. The second sentence is a dense run-on with multiple em-dash clauses, which slightly hurts scannability, but no content is padding.

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?

With no output schema, the description still tells the agent what the report contains (gaps plus the reason: missing vs unpublished draft) and its limits. Combined with the routing to fix tools, nothing an agent needs to call it correctly is missing.

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 coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains the tradeoff of omitting category_id (full sweep costs two listings, capped at 100/100) versus passing it to narrow the audit, and notes the inactive-locale warning behavior for locale.

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 verb (audit), resource (Help Center tree for a target locale), and precisely what it reports: categories/sections with no translation or only an unpublished draft. It is unambiguously distinguishable from the listing siblings like list_sections/list_articles.

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

Usage Guidelines5/5

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

Explicitly says when to use it (before/after translating articles) with the concrete motivating scenario of an article being unreachable while its parent section only exists in the source locale. It names the alternative (listing sections in that locale) and explains why it fails, and routes fixes to set_section_translation / set_category_translation.

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

get_articleGet Help Center ArticleA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoLocale for translated version
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so safety is covered. The description adds value beyond that by disclosing the return payload (body as HTML, metadata, source_locale, available translations) and the token-cost tradeoff, which the annotations do not express.

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?

Four tight sentences, each earning its place: retrieval scope, routing alternative, locale option, return shape. It is front-loaded with the core action and contains no filler.

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?

There is no output schema, yet the description enumerates the return contents (body HTML, metadata, source_locale, translations). Combined with complete parameter coverage and annotation-backed safety, an agent has everything needed to call it correctly.

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 100%, so both parameters are already documented in the schema (article_id even names its source tools). The description's note that locale fetches a translated version is a small addition but largely restates the schema's own 'Locale for translated version' text, so the baseline 3 applies.

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 verb (Retrieve) and resource (an article) and clarifies scope: 'by ID with full body content'. It explicitly distinguishes itself from the sibling tools get_article_outline and get_article_section, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Names the alternative tools (get_article_outline + get_article_section) and the exact condition that selects them ('For large articles ... to save tokens'). This is explicit when-to-use/when-to-prefer-alternative guidance, not merely implied context.

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

get_article_outlineGet Article OutlineA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoLocale of the body to outline (defaults to article source_locale)
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds real behavioral value beyond annotations: it discloses the return shape (h1/h2/h3 sections with word counts) and that translations with outdated status are bundled in — non-obvious extra content the agent should expect.

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 with the primary behavior front-loaded and the sibling routing second. Every clause earns its place; nothing is padded.

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 output schema, the description does the necessary work of describing the return payload (sections, word counts, translation status), which is what an agent needs to decide to call it. What it omits — ordering, pagination, empty-article behavior — is minor for a read-only outline 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 100%, and both params (article_id, locale) are documented in the schema. The description only restates the locale default that the schema already states, adding no syntax or format detail beyond it, so the baseline 3 applies.

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 verb and resource ('Return a compact outline of an article') and details exactly what the outline contains — h1/h2/h3 sections with word counts plus translation/outdated status. An agent can distinguish it from get_article and get_article_section without opening a schema.

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?

Explicitly routes the agent to a sibling: 'Use get_article_section to fetch a specific section,' which distinguishes outline-level vs section-level access. It stops short of stating when to prefer this over get_article for a full body, but the alternative is named with a selecting condition.

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

get_article_sectionGet Article SectionA
Read-onlyIdempotent

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). The "## [n] hN: ..." line at the top is a label, not part of the content.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoOutput format. "html" (default) is round-trip safe. "markdown" is lossy on some HTML structures — use only for human review, not before update_article_section.html
localeYesLocale of the body (e.g., "en-us", "fr")
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.
section_indexYes0-based index of the section (see get_article_outline)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, but the description adds real behavioral context beyond them: markdown lossiness on specific structures (pre/br, multi-p table cells), the round-trip hazard with update_article_section, and the fact that the leading '## [n] hN:' line is a label rather than content.

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?

Front-loaded with the core purpose, then prerequisites, then format guidance. Every sentence carries information, though the middle format sentence is dense and could be trimmed slightly.

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 output schema, the description does the work of describing what comes back in each format and warns about the lossy representation and label line. It stops short of covering error cases (e.g., invalid section_index) or whether nested subsections are included.

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 coverage is 100%, so the baseline is 3; the description still adds meaning beyond the schema by explaining the risk profile of the markdown enum value and by documenting an undocumented aspect of the returned content (the label line at the top).

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 verb (Retrieve), resource (content of a single section of an article), and scope qualifiers (single section, given locale), which cleanly separates it from get_article and get_article_outline 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 Guidelines5/5

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

Explicitly names the prerequisite tool ('Use get_article_outline first to discover section indexes') and gives a conditional rule for the format parameter (html default vs markdown only for human review), including a when-not case (not before update_article_section).

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

get_current_userGet Current Zendesk UserA
Read-onlyIdempotent

Get the currently authenticated Zendesk user. Useful to verify identity and permissions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, covering the safety and mutation profile. The description adds the scope that this returns the authenticated user and a use case, but says nothing about auth requirements, rate limits, or return shape. With annotations doing the heavy lifting, a 3 is appropriate.

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, front-loaded with the core action and followed by a brief use case. No filler or repetition; every sentence 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 simple, zero-parameter read tool with rich annotations and no output schema, the description gives the agent everything needed: what it retrieves, whose identity it targets, and why one would call it. No critical details are missing.

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 the rubric sets the baseline at 4. The schema is empty and the description introduces no additional parameter semantics, which is acceptable for a no-argument tool.

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 clear verb and resource ('Get the currently authenticated Zendesk user'), and the 'currently authenticated' scope inherently distinguishes it from sibling tools like get_user or search_users. However, it does not explicitly name an alternative, so it falls short of a 5 under the rubric.

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?

Provides a clear use case: 'Useful to verify identity and permissions.' This tells the agent when to reach for the tool, but it does not state when not to use it or name alternatives such as get_user, so it lacks exclusion guidance.

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

get_linked_incidentsGet Linked IncidentsA
Read-onlyIdempotent

Get all incident tickets linked to a problem ticket. Returns the list of incidents that reference the given problem (Zendesk problem/incident relationship); useful to gauge a problem's blast radius before resolving it.

ParametersJSON Schema
NameRequiredDescriptionDefault
problem_idYesProblem ticket ID — the numeric id of the ticket of type "problem" whose linked incidents to list. Obtain it from search_tickets or list_tickets.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered by structured data. The description adds useful semantics about what is returned (incidents referencing the given problem) and the underlying Zendesk relationship model, but nothing on auth, scoping, or result limits.

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 action front-loaded and the rationale trailing it. Nothing is wasted, though the parenthetical restatement of the relationship is slightly redundant with the opening clause.

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?

One required parameter, no nested objects, and no output schema, so the description carries a small burden. It correctly conveys the return content (a list of linked incidents) and the domain relationship, which is sufficient for an agent to call it correctly; only pagination/result-volume behavior is unaddressed.

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 100%, and the parameter description already explains the ID's meaning and even points to search_tickets/list_tickets for obtaining it. The description adds little beyond 'the given problem,' so baseline 3 applies.

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 verb and resource ('Get all incident tickets linked to a problem ticket') and immediately clarifies the Zendesk problem/incident relationship. No sibling tool in the list performs this linkage retrieval, so the purpose is unambiguous and distinguishable.

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?

Explicitly gives the use case: 'useful to gauge a problem's blast radius before resolving it.' That is clear context for when to reach for this tool, but it names no alternatives or when-not conditions (e.g., use get_ticket for a single ticket's details).

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

get_organizationGet Zendesk OrganizationA
Read-onlyIdempotent

Retrieve a single organization by its numeric id. Returns full details (name, tags, domains, notes) — more than the name/id that search or list_organizations surface. Use list_organizations to browse or search for a name-based lookup.

ParametersJSON Schema
NameRequiredDescriptionDefault
organization_idYesOrganization ID — the numeric id of the Zendesk organization to fetch. Obtain it from list_organizations, search, or a user record.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuine value with no output schema present by naming the returned fields (name, tags, domains, notes) and noting it is richer than list/search results. It stops short of mentioning auth scope or failure modes for an invalid id.

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?

Three short sentences with zero filler: purpose, payload differentiation, and the routing alternative, all front-loaded in that order.

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 single-param read tool with no output schema, the description covers purpose, routing, and field-level return content, which is enough to call it correctly. Missing only edge details such as behavior on an unknown id.

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 100% and the single parameter is fully documented in the schema, including where to obtain the id. The description only echoes 'numeric id', so this is the baseline 3 for a schema that does the lifting.

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 verb (Retrieve) and resource (a single organization) with the keying constraint (numeric id), and explicitly contrasts the richer payload against what search or list_organizations return. An agent can distinguish it from list_organizations without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use this for a known numeric id, use list_organizations to browse or do a name-based lookup. That names both the alternative and the condition that selects it.

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

get_ticketGet Zendesk TicketA
Read-onlyIdempotent

Retrieve a Zendesk ticket by ID, including its live SLA state (per-metric stage and breach countdown) when an SLA policy applies, plus its comments if requested. Returns ticket details (subject, status, priority, assignee, tags, description) and optionally all comments/internal notes. It also lists the followers and email CCs on the ticket, resolved to names, which is how you tell who a ticket update actually reaches: followers are notified of updates including internal notes, email CCs take part in the public correspondence, and being the requester makes someone neither. Both lists come back empty on an account where the "CCs and followers" setting is not enabled in Zendesk. The per-ticket Show endpoint exposes no SLA, so the SLA block is resolved via a scoped search and may be absent for a very high-volume requester or a just-updated ticket; SLA targets and policy conditions live in list_sla_policies. This returns the ticket as it stands now; for the history of changes behind that state (who changed what, and when), use get_ticket_history. The comment thread is appended in one block — the first page of comments Zendesk returns, cut past the response character limit — so on a long ticket read it with list_ticket_comments, which pages the comments and returns the newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
ticket_idYesTicket ID — the numeric id of the ticket to fetch. Obtain it from search_tickets or list_tickets.
include_commentsNoWhen true, appends the full public comment and internal note thread to the response. Defaults to false to keep the payload small; enable it when you need the conversation, not just the ticket fields. On a long thread prefer list_ticket_comments — this flag appends one unpaginated block, so comments past Zendesk's first page are absent and the rest is cut at the response character limit.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare a safe idempotent read, and the description adds substantial context beyond them: SLA is resolved via a scoped search and may be missing for very high-volume requesters or just-updated tickets, follower/CC lists come back empty when the 'CCs and followers' setting is disabled, and the appended comment block is unpaginated and char-limit-truncated. These are non-obvious behavioral traits that materially affect interpreting results.

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?

Front-loaded with the core purpose and then layered with caveats in a single dense paragraph. Every sentence carries real information, though the paragraph is long and the SLA/followers/comment caveats could be visually separated for faster scanning.

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 two-parameter read tool with no output schema, the description covers the important gotchas: partial SLA availability, empty follower/CC lists under a setting, truncated comment threads, and sibling redirection. Nothing an agent needs to call and interpret this correctly is missing.

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 coverage is 100%, so the schema already carries both parameters; the baseline is 3. The description goes slightly beyond by explaining the semantic consequence of include_comments (one unpaginated block, cut at the character limit, first page only) and where to get a ticket_id, adding marginal value over the schema text.

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 verb+resource (retrieve a Zendesk ticket by ID) and enumerates the scope: SLA state, comments, followers, email CCs. It distinguishes itself from get_ticket_history and list_ticket_comments explicitly, so an agent can route without opening schemas.

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

Usage Guidelines5/5

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

Explicitly names alternatives and the conditions selecting them: use get_ticket_history for change history, list_ticket_comments for paginated threads on long tickets, list_sla_policies for SLA target definitions. When-to-use and when-to-avoid are both present.

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

get_ticket_attachmentsGet Zendesk Ticket AttachmentsA
Read-onlyIdempotent

Retrieve ticket attachments. Images are embedded inline; other files are listed as text references.

ParametersJSON Schema
NameRequiredDescriptionDefault
ticket_idYesTicket ID — the numeric id of the ticket whose attachments to fetch. Obtain it from search_tickets or list_tickets.
attachment_idsNoAttachment IDs to fetch directly (e.g. extracted from a previous list_ticket_comments or get_ticket(include_comments=true) call). When provided, skips the comments fetch entirely. When omitted, all attachments of the ticket are returned.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive, lowering the bar. The description adds genuinely useful return-shape context not covered by any output schema: images come back embedded inline while other files appear as text references, which affects how an agent should present results.

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 primary action front-loaded and the output-format nuance second. Every clause earns its place.

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 output schema, the description usefully sketches the return format, and the schema fully documents both parameters. Gaps are minor: no mention of pagination or size limits and no routing to alternatives, but nothing required to invoke the tool correctly is missing.

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 100% and the schema already explains ticket_id sourcing and that attachment_ids skips the comments fetch. The description adds no parameter detail, so the baseline 3 applies.

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 ("Retrieve ticket attachments") that an agent can distinguish from article-attachment siblings like list_article_attachments by name. It does not explicitly call out the sibling boundary, but the ticket scope is unambiguous.

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 tool instead of get_ticket(include_comments=true) or list_ticket_comments, and no mention of the attachment_ids fast path that skips the comments fetch. An agent must infer the workflow from the schema alone.

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

get_ticket_historyGet Zendesk Ticket HistoryA
Read-onlyIdempotent

Read a ticket's change history — its audit trail — as a chronological, oldest-first timeline of who changed what and when. Each entry shows the actor (name and id) and the channel, then the field changes that update carried (status, priority, assignee, group, tags, custom fields) as before → after, with assignee/requester/group ids resolved to names. Comments appear as one-line presence markers (public comment vs internal note added), not their text — fetch the bodies with list_ticket_comments (or get_ticket(include_comments=true) for a short thread). Purely system-generated notification events (trigger emails, collaborator/CC notifications, pushes) are filtered out — note this filters notification delivery, not CC-list edits, which are shown as changes — and an update carrying only such events produces no entry, so the timeline stays a readable narrative rather than a raw log. Use it to answer "what happened on this ticket?", "why was it reassigned?" or "when did it go to pending?", reading oldest-first so the founding context is not missed. Read-only, and cursor-paginated oldest-first: pass the returned cursor to page a long-lived ticket toward its most recent changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page. The timeline is ordered oldest-first, so paging forward moves toward the most recent changes.
page_sizeNoAudits (ticket updates) per page (1-100, default 100). Each audit is one update to the ticket and may expand to several change lines; audits carrying only system events are dropped, so a page can render fewer entries than this.
ticket_idYesTicket ID — the numeric id of the ticket whose change history to read. Obtain it from search_tickets or list_tickets.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint/idempotentHint/destructiveHint), but the description adds substantial non-obvious behavior: system-generated notification events are filtered out (while CC-list edits are not), an update with only such events produces no entry, comments appear as presence markers not text, and pagination is oldest-first. This is rich behavioral context beyond structured fields.

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?

Dense and front-loaded, leading with what is returned before the filtering caveat and the usage guidance. It is long, but nearly every clause carries information; a small amount could be tightened without loss.

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?

No output schema exists, yet the description thoroughly specifies the return contents (actor name/id, channel, before→after field changes with ids resolved to names, comment presence markers) and the filtering semantics. An agent has everything needed to call and interpret this tool correctly.

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 coverage is 100%, so baseline is 3, but the description reinforces cursor direction ('pass the returned cursor to page ... toward its most recent changes') and explains that a page can render fewer entries than page_size due to event filtering. It adds meaning but largely parallels the already-detailed schema descriptions.

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 verb+resource ('Read a ticket's change history — its audit trail') and precisely characterizes the output shape (chronological oldest-first timeline of who changed what and when). It explicitly distinguishes itself from siblings by naming list_ticket_comments and get_ticket(include_comments=true) as the way to get comment bodies.

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

Usage Guidelines5/5

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

Gives concrete triggering questions ('what happened on this ticket?', 'why was it reassigned?', 'when did it go to pending?') and names the alternative tool for a related need (comment text). Also explains why to read oldest-first. This is explicit when-to-use plus alternatives.

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

get_userGet Zendesk UserA
Read-onlyIdempotent

Retrieve a single user by their numeric id. Returns the full user record (name, email, role, organization, tags). Use search_users when you only have a name or email, or get_current_user for the authenticated identity.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesUser ID — the numeric id of the Zendesk user to fetch. Obtain it from search_users, or from the requester/assignee fields of a ticket.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds value by listing the returned fields, which matters since there is no output schema, but it does not address failure modes (e.g., not-found behavior) or 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 compact sentences: purpose first, then routing guidance. No redundant or filler content, and the lookup constraint is front-loaded.

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 single-parameter getter with full schema coverage, the definition covers purpose, key, return shape, and sibling routing. Nothing an agent needs to invoke it correctly is missing.

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 100% and the single parameter already documents the numeric id plus where to obtain it (search_users, ticket requester/assignee). The description's mention of 'numeric id' merely reinforces the schema, so baseline 3 is appropriate.

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 verb (retrieve) and resource (a single user) with the exact lookup key (numeric id), which distinguishes it from bulk/list siblings. It also enumerates the return payload (name, email, role, organization, tags).

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

Usage Guidelines5/5

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

Explicitly routes the agent: use search_users when only a name or email is available, and get_current_user for the authenticated identity. Both alternatives are named with the condition that selects them.

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

get_view_ticketsGet Tickets In A ViewA
Read-onlyIdempotent

Read the tickets inside a Zendesk view, in the view's own configured sort order — the same order the agent sees in the Zendesk UI — which is the natural way to work a named queue like "Unassigned tickets" or "Breaching today". Accepts the view by title or by numeric id (discover both with list_views); a title is matched case-insensitively against the agent's active views, and on no match the available titles are returned so you can retry in one step. Tickets come back with the same fields as list_tickets and are cursor-paginated; there is no live SLA block here (use search_tickets when you need per-ticket SLA state), and sort_by/sort_order override the view's order when you want a different cut.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewYesThe view to read: its exact title as shown in Zendesk (e.g. "Unassigned tickets") or its numeric id from list_views. A title is matched case-insensitively against your active views; on no match the tool returns the available titles instead of erroring, so you can retry with a correct one.
cursorNoPagination cursor from a previous response; omit for the first page.
sort_byNoOptional column to sort by, overriding the view's own sort. Must be one of the view's columns (e.g. "status", "priority", "updated_at", or a custom field id); "subject" and "submitter" are not sortable. Omit to keep the view's configured order.
page_sizeNoTickets per page (1-100, default 100).
sort_orderNoSort direction applied to sort_by: "asc" (oldest/lowest first) or "desc" (newest/highest first). Only meaningful together with sort_by; omit to keep the view's configured direction.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/destructive=false, so safety is covered. The description adds real behavioral context beyond them: the no-match fallback returns available titles instead of erroring, results are cursor-paginated, and there is deliberately no SLA block. It stops short of describing auth requirements or any rate limits.

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?

Front-loaded with the core action and ordered intuition, with fallback behavior and pagination appended where they belong. Dense but nearly every clause carries information; the SLA/parenthetical aside and the sort override reminder are the only parts that could be trimmed.

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?

No output schema exists, so the description must carry the return contract, and it does reference the field shape via list_tickets and notes cursor pagination. It leaves the exact field list implicit through that sibling reference, which is adequate but not fully self-contained for a 5-parameter tool.

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 coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema states only in isolation: that title matching is case-insensitive against active views and that sort_by/sort_order operate as overrides of the view's configured order. It does not add format detail for cursor beyond what the schema says.

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?

Specific verb and resource ('Read the tickets inside a Zendesk view') plus scope (view's own configured sort order). It explicitly carves out territory against siblings: not list_tickets (same field shape but unfiltered), not search_tickets (no live SLA block). An agent can pick this tool without opening another schema.

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

Usage Guidelines5/5

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

Names the conditions that select this tool ('the natural way to work a named queue') and routes to alternatives explicitly: list_views to discover ids/titles, search_tickets when per-ticket SLA state is needed, sort_by/sort_order when a different cut is wanted. Both when-to-use and when-not-to-use are present.

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

list_article_attachmentsList Article AttachmentsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
article_idYesID of the Help Center article whose attachments to list.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuinely useful detail beyond that: it returns metadata only (id, name, content type, size, URL) rather than file bytes, and clarifies both inline and block attachments are included — a non-obvious inclusion rule.

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?

Three tight sentences, front-loaded with the core action, then return shape, then sibling routing. Every sentence earns its place with no redundancy.

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 single-parameter list tool with no output schema, the description covers purpose, return contents, scope boundary, and sibling alternatives. Nothing an agent needs to call it correctly is missing.

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 100% (article_id is fully documented), so the schema carries parameter semantics. The description adds no syntax, format, or filtering detail about article_id, so baseline 3 applies.

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 verb and resource ("List all attachments for an article") and immediately scopes it to Help Center articles, distinguishing it from get_ticket_attachments and create_article_attachment. An agent can identify the correct tool without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the alternative for a different context ("for attachments on support tickets use get_ticket_attachments instead") and routes file creation to create_article_attachment. Both the when-to-use and the when-not-to-use are stated, not implied.

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

list_articlesList Help Center ArticlesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
localeNoRestrict to a single locale, e.g. "en-us" or "fr". Omit for the default locale.
sort_byNoField to sort by; "position" (the default) is the manual order set in Guide.position
page_sizeNoArticles per page (1-100, default 100).
section_idNoRestrict the listing to one section (numeric id from list_sections). Omit to list articles across all sections.
sort_orderNoSort direction: ascending or descending.asc
include_translationsNoInclude available translation locales per article (causes 1 extra API call per article)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the read-only, idempotent, non-destructive profile. The description adds real behavioral value beyond that: metadata-only returns, and the important caveat that include_translations must be re-sent on each paginated request (plus its per-article API cost).

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?

Front-loads the core purpose in the first clause, then adds filtering, sorting, and the pagination caveat in tight, waste-free sentences. No redundancy that could mislead.

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 read-only listing tool with no output schema and full schema coverage, the description supplies everything needed to call it correctly: scope, return granularity, optional filters, sorting, and the pagination re-send caveat.

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 100%, so the schema already documents all seven parameters in detail. The description adds little, and its enumeration of sort_by values ("title", "created_at", "updated_at") is actually incomplete versus the schema, which also includes "position" as the default.

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 verb+resource ("List articles") and immediately bounds the scope ("metadata only, no body"). It also names the sibling get_article as the tool for full content, so an agent can distinguish the two without opening either schema.

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?

Explicitly routes the agent to get_article when full content is needed, and describes the optional section/locale filtering context. It does not address when to prefer the sibling search_articles over this listing tool, so a routing gap remains.

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

list_article_translationsList Article TranslationsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive, so the safety profile is covered. The description adds real behavioral value by disclosing that only metadata is returned and enumerating which fields, which prevents an agent from expecting body content.

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 waste, with the payload constraint front-loaded before the routing advice. 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?

With no output schema, the description compensates by naming the returned fields, and the single parameter is fully documented in the schema. Nothing needed to call this tool correctly is missing.

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?

There is one parameter and schema description coverage is 100% — the schema already explains article_id and where to obtain it. The description mentions 'locale' only as an argument to the sibling tool, adding nothing about this tool's own parameter, so baseline 3 applies.

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 verb (list) and resource (translations for an article) and immediately scopes the payload: metadata only, no body, with the exact fields (locale, title, draft, updated_at). An agent can distinguish this from get_article or create_article_translation without opening a schema.

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 names the alternative (get_article with locale) and the condition that selects it (full translated content). The 'metadata only, no body' framing also implicitly states when not to use this tool, though there is no explicit exclusion or prerequisite beyond that.

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

list_categoriesList Help Center CategoriesA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
localeNoLocale for category names (e.g., "en-us", "fr"). Defaults to the Help Center default locale.
page_sizeNoCategories per page (1-100, default 100).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile needs no repetition. The description adds genuinely new behavioral context: entries contain id/name/locale and results are cursor-paginated, which the annotations do not convey.

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?

Four short sentences, front-loaded with the purpose and followed by hierarchy, return shape, pagination, and parameters. Slightly dense with routing detail, but no sentence is wasted.

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-required-param list tool with a fully documented schema and annotation-covered safety profile, nothing material is missing; return fields, pagination, locale behavior, and follow-up tools are all covered without an output schema.

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 coverage is 100%, so the baseline is 3; the description earns above baseline by explaining that locale controls the translation used for category names. It also reinforces the pagination model behind the cursor parameter, adding meaning beyond the field labels.

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 verb and resource (list Help Center categories) and immediately locates it in the Guide hierarchy, distinguishing it from list_sections and list_articles. An agent can tell exactly what this returns and where it sits.

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?

Gives an explicit drill-down path (category id → list_sections → list_articles) and a condition for using the locale parameter. It stops short of stating when NOT to use it (e.g., when you already have a category id), but the routing context is clear.

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

list_category_translationsList Category TranslationsA
Read-onlyIdempotent

List the translations of a Help Center category: for each locale, the localized name, whether a description is set, and whether the translation is published or still a draft. Reach for this when a category looks wrong in a locale, because list_categories with that locale cannot settle it: a category with no translation is omitted from it, while a category whose translation is an unpublished draft may still be listed there under the draft name — so appearing in that listing does not mean published, and the draft flag here is what decides. Fix either case with set_category_translation; to sweep every category and section at once, use find_translation_gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault
category_idYesCategory ID — the numeric id of the Help Center category. Obtain it from list_categories or the zendesk-hc://topology resource.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive). Beyond that, the description discloses meaningful behavioral nuance: untranslated categories are omitted from list_categories while unpublished drafts may still appear there, and the draft flag here is authoritative. It doesn't cover pagination or exact return shape, but adds real 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?

Front-loads the verb and resource, then adds only information that routes the agent correctly. It is on the longer side, but nearly every clause carries actionable distinction rather than filler.

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?

With no output schema, the description correctly describes the returned fields, and single-parameter input is fully covered by the schema. An agent has everything needed to select and invoke the tool correctly.

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 100% and the single category_id parameter is already fully documented in the schema (including where to obtain it). The description adds no parameter-level detail, so the baseline 3 applies.

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 verb and resource ('List the translations of a Help Center category') and enumerates exactly what is returned per locale (localized name, description presence, published vs draft). It clearly distinguishes itself from siblings like list_categories and set_category_translation.

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

Usage Guidelines5/5

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

Explicitly states when to reach for it ('when a category looks wrong in a locale') and why the obvious alternative fails (list_categories omits untranslated categories and lists drafts). It names the fix tool (set_category_translation) and the bulk alternative (find_translation_gaps).

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

list_content_tagsList Content TagsA
Read-onlyIdempotent

List Guide content tags, which are end-user-visible labels that help readers find related articles. Results are cursor-paginated (follow the returned cursor to enumerate the full list) and sorted by name by default. Pass name_prefix to look a tag up by the start of its name — do this before create_content_tag to reuse an existing tag rather than fragment the taxonomy. For internal, non-end-user search labels, see list_labels instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
sort_byNoField to sort by; "name" (the default) lists tags alphabetically.name
page_sizeNoContent tags per page (1-30, default 30). The Guide content-tags endpoint caps each page at 30; follow the returned cursor to enumerate the full list.
sort_orderNoSort direction: ascending or descending.asc
name_prefixNoReturn only content tags whose name starts with this prefix (prefix match — not a substring or fuzzy search). Use the full name to check whether a specific tag already exists before creating it.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds non-obvious behavioral context beyond that: results are cursor-paginated and must be enumerated by following the returned cursor, and sorting defaults to name. It does not mention auth requirements or rate limits, but the pagination/ordering disclosure is genuinely additive.

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?

Three sentences, each load-bearing: identity/scope first, then pagination and ordering behavior, then the lookup workflow and the sibling alternative. No filler, no restatement of the title, and the most decision-relevant facts are front-loaded.

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 read-only, paginated list tool, the description covers everything needed to call it correctly: what it returns, how to page through it, default ordering, the prefix-lookup workflow, and the boundary with list_labels. No output schema exists, but the description adequately characterizes the returned collection and its pagination contract.

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 100%, so all five parameters are already documented, including that name_prefix is a prefix match rather than a fuzzy/substring search and the page_size cap of 30. The description paraphrases these rather than adding format or unit detail, so the baseline of 3 applies; the only extra is the workflow intent behind name_prefix, which is more usage than parameter semantics.

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 verb and resource ('List Guide content tags') and immediately defines the domain object as 'end-user-visible labels that help readers find related articles'. It explicitly separates itself from the sibling list_labels by scoping those as 'internal, non-end-user search labels', so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance: pass name_prefix and 'do this before create_content_tag to reuse an existing tag rather than fragment the taxonomy'. It also names the alternative tool and the condition that selects it ('For internal, non-end-user search labels, see list_labels'). Both a positive workflow and an exclusion are provided.

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

list_labelsList Article Labels
Read-onlyIdempotent

List all article labels. Labels improve Help Center search ranking and are not visible to end users. Attach them to an article through the label_names parameter of create_article or update_article.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

list_macrosList Zendesk MacrosA
Read-onlyIdempotent

List the active macros available to the authenticated user. A macro bundles a canned reply and/or a set of field changes (status, priority, assignee, group, tags, custom fields) an agent applies to a ticket in one gesture; this returns each macro id, title, description, availability scope, and its ordered list of actions, offset-paginated. Results are scoped by per-user OAuth to what the current user can see, so no shared admin key is needed. Pass a macro id from here to preview_macro_diff to preview its effect on a specific ticket.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number for offset pagination. Increment it while keeping `per_page` fixed to fetch subsequent pages; page 1 is the first page.
per_pageNoNumber of results per page for offset pagination (1-100). Pair with `page` to walk large result sets; the response header reports the total count and whether more pages remain.

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, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds real context beyond that: results are scoped by per-user OAuth to what the current user can see and no shared admin key is needed, plus the offset-paginated return shape.

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?

The purpose is front-loaded in the first sentence, followed by definition, return shape, scoping and routing. It is denser than strictly needed (the macro definition sentence is long), but each clause carries information and nothing is redundant.

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?

With no output schema, the description compensates by enumerating the returned fields, and it also covers pagination behavior, auth scoping, and the follow-up tool. An agent has everything needed to call and then chain this tool correctly.

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 100% and both parameters (page, per_page) are fully documented in the schema itself. The description only notes 'offset-paginated' generically without adding format or default details beyond what the schema already provides, so the baseline 3 applies.

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 gives a specific verb (List) and resource (active macros), then defines what a macro is and what is returned (id, title, description, availability scope, ordered actions). It clearly distinguishes this from siblings like list_labels and list_views by describing the resource and its scope.

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 explicitly routes the agent forward: 'Pass a macro id from here to preview_macro_diff to preview its effect on a specific ticket,' which is genuine when-to-use guidance for a sibling. It does not, however, state when this tool should NOT be used or contrast it against other listing tools beyond that single forward reference.

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

list_organizationsList Zendesk OrganizationsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
page_sizeNoOrganizations per page (1-100, default 100).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds value by disclosing the return shape (name/id plus basic fields) and that results are cursor-paginated, though it doesn't mention rate limits or page-size behavior beyond the schema.

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 sentences, front-loaded with the core action and pagination, followed by alternatives and a brief domain note. Dense and mostly waste-free, though the closing sentence about organizations grouping end users is useful context rather than strictly essential.

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 output schema, the description appropriately fills the gap by naming returned fields and pagination semantics. It is nearly complete for a simple list tool; only finer pagination termination details are absent, which the cursor parameter largely covers.

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 100% and both parameters (cursor, page_size) are fully documented in the schema. The description only restates 'with pagination' and adds no syntax or format detail beyond the structured fields, so baseline 3 applies.

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 verb and resource ('List all organizations with pagination') and immediately names the returned fields, then explicitly distinguishes itself from get_organization and search. An agent can select this over its siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit alternatives and the condition selecting each: use get_organization with an id for full details (tags, domains, notes), or search for query-based lookups by name. This is a clear when-to-use-this vs when-to-use-something-else routing.

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

list_permission_groupsList Permission GroupsA
Read-onlyIdempotent

List all Guide permission groups. Use this to find the permission_group_id required when creating articles.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the use case but does not disclose return format, pagination, or any behavior beyond what annotations provide.

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 no wasted words. The purpose is front-loaded and the usage guidance follows directly.

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 simple no-parameter read-only list tool with rich annotations, the description is mostly sufficient: it states what is returned and why to call it. It could optionally mention the shape of returned records, but no output schema exists and the omission is minor.

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, and the empty schema confirms this. Per the rubric, a zero-parameter tool has a baseline of 4 when schema coverage is complete.

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 uses a specific verb and resource: 'List all Guide permission groups.' It is clear what the tool does, though it does not explicitly contrast itself with sibling list tools such as list_labels or list_content_tags.

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 gives a concrete usage context: 'Use this to find the permission_group_id required when creating articles.' That tells the agent when the tool is useful, but it does not mention exclusions or alternative tools.

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

list_promoted_articlesList Promoted Help Center ArticlesA
Read-onlyIdempotent

List the promoted ("featured") Help Center articles — the small, editorially-curated set surfaced at the top of their sections. Returns metadata only (no body); use get_article for full content. COST: the Help Center API has no server-side promoted filter, so this scans article pages (one Zendesk API request per page, up to ARTICLE_RESOURCES_SCAN_MAX_PAGES, default 20) and filters client-side — potentially costly on a large Help Center. Each call performs a fresh, uncached scan, so avoid calling it repeatedly. On a very large Help Center some promoted articles may be omitted, and both the omission and the number of pages scanned are flagged in the output. Lists the default locale. To promote or unpromote an article, use update_article with promoted (requires Help Center admin / Guide admin rights).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, yet the description adds substantial non-obvious behavior: no server-side promoted filter, client-side filtering over up to ARTICLE_RESOURCES_SCAN_MAX_PAGES (default 20) API requests, no caching, and possible omission of promoted articles on very large Help Centers that is flagged in the output.

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?

Front-loaded with the purpose and the get_article/update_article routing, then the cost model. It is dense and slightly long, but nearly every clause carries operational value; only minor tightening is possible.

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?

No output schema exists, and the description compensates by stating what is returned (metadata only, no body), that the default locale is used, and that truncation and page counts are surfaced in the output. Nothing an agent needs to decide whether to call it is missing.

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?

There are zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It does usefully clarify the implicit scoping behavior — that it lists the default locale — which an agent could otherwise assume was configurable.

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 verb and resource ('List the promoted ("featured") Help Center articles') and narrows the scope precisely ('the small, editorially-curated set surfaced at the top of their sections'). It explicitly differentiates from siblings: 'use get_article for full content' and 'use update_article with `promoted`' to mutate.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (reading the curated featured set), when-not-to-use (full content belongs to get_article), the mutation alternative (update_article, with the admin-rights prerequisite), and a strong operational caveat to avoid repeated calls. Nothing is left to inference.

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

list_sectionsList Help Center SectionsA
Read-onlyIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
localeNoLocale for section names (e.g., "en-us", "fr"). Defaults to the Help Center default locale.
page_sizeNoSections per page (1-100, default 100).
category_idNoRestrict to sections of this category (id from list_categories). Omit to list every section.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low. The description adds real behavioral context the annotations lack: results are cursor-paginated and locale defaults to the Help Center default if omitted. It stops short of describing ordering or empty-page behavior.

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?

Front-loaded with purpose, then hierarchy, return fields, pagination and workflow in four tight sentences. Each sentence carries distinct information, though the hierarchy explanation is somewhat parenthetical to the call itself.

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?

No output schema exists, but the description compensates by listing the returned fields, the pagination mechanism, and the default locale behavior. Combined with full schema coverage, an agent has everything needed to call it correctly on the first try.

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 100%, so the schema already documents cursor, locale, page_size and category_id with types, defaults and bounds. The description largely restates these ('ids come from list_categories', 'pass a locale'), adding only light sourcing context rather than new semantics. Baseline 3 applies.

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 verb+resource ('List Help Center sections') and situates it precisely in the Guide hierarchy (category → section → article), which cleanly separates it from siblings list_categories and list_articles. It also enumerates the returned fields, so an agent knows exactly what it gets.

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

Usage Guidelines5/5

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

Explicitly routes the agent: pass category_id (which comes from list_categories) to scope to one category, then use a returned section id with list_articles. This names the prerequisite call and the downstream call, covering both when and how to use it.

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

list_section_translationsList Section TranslationsA
Read-onlyIdempotent

List the translations of a Help Center section: for each locale, the localized name, whether a description is set, and whether the translation is published or still a draft. Reach for this when a section looks wrong in a locale, because list_sections with that locale cannot settle it: a section with no translation is omitted from it, while a section whose translation is an unpublished draft may still be listed there under the draft name — so appearing in that listing does not mean published, and the draft flag here is what decides. Fix either case with set_section_translation; to sweep every category and section at once, use find_translation_gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault
section_idYesSection ID — the numeric id of the Help Center section. Obtain it from list_sections or the zendesk-hc://topology resource.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantive behavioral context beyond them: untranslated sections are omitted from listings, and draft translations may appear under the draft name, so 'listed' does not imply 'published'. It also discloses the shape of the returned data without an output schema.

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?

Front-loaded with purpose and the returned fields, then the usage scenario and routing. The middle clause explaining the draft-listing nuance is dense but load-bearing rather than padding, so the length is justified even if the sentence is somewhat convoluted.

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?

With no output schema, the description compensates by describing the returned fields, and it supplies the parameter's origin, the disambiguating rules, and both follow-up routes. An agent has everything needed to call it correctly and interpret the result.

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 100% and the single section_id parameter is already documented in the schema, including its source (list_sections or the topology resource). The description adds no further syntax or format detail, so the baseline 3 applies.

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 verb and resource ('List the translations of a Help Center section') and enumerates the returned fields (localized name, description set, published/draft). It explicitly distinguishes itself from the sibling list_sections by naming the exact situation where the two differ.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('when a section looks wrong in a locale'), explains why the obvious alternative (list_sections) cannot answer the question, and names both the remediation tool (set_section_translation) and the bulk alternative (find_translation_gaps). Nothing about when-to-use vs alternatives is left to inference.

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

list_sla_policiesList SLA PoliciesA
Read-onlyIdempotent

List the configured SLA policies with their filter conditions and per-priority reply/resolution targets. Use this to explain why a given target applies to a ticket and to reconstruct deadlines deterministically instead of hard-coding the policy matrix. Requires an admin token (or a custom role granted the SLA-management permission); a standard agent token gets 403 here, though it can still read live per-ticket SLA via get_ticket / search_tickets.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number for offset pagination. Increment it while keeping `per_page` fixed to fetch subsequent pages; page 1 is the first page.
per_pageNoNumber of results per page for offset pagination (1-100). Pair with `page` to walk large result sets; the response header reports the total count and whether more pages remain.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description correctly focuses on what annotations cannot convey: the admin-token requirement and the concrete 403 failure mode for standard agent tokens, plus the workaround. It stops short of describing pagination behavior or output shape details beyond the field list, but the auth disclosure is genuinely additive.

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?

Front-loaded with the resource and payload, then usage, then access constraints. Two sentences with no filler, though the second sentence is dense and could be split for readability.

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 output schema, the description carries the return-value burden and does so at a summary level (filters + per-priority targets) while covering auth and pagination. Adequate for a read-only list tool, short only of exact field-level detail.

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 100% and both page/per_page descriptions already explain offset pagination, total-count headers and the 100 cap. The description adds nothing about the parameters, so the baseline 3 applies.

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?

Specific verb+resource ("List the configured SLA policies") plus a precise statement of what is returned: filter conditions and per-priority reply/resolution targets. An agent can distinguish it from get_ticket/search_tickets, which return per-ticket SLA state rather than the policy matrix.

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

Usage Guidelines5/5

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

Explicitly states the use case (explain why a target applies, reconstruct deadlines instead of hard-coding the matrix) and names the alternative path for live per-ticket SLA via get_ticket / search_tickets. Both when-to-use and the fallback are given.

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

list_ticket_commentsList Zendesk Ticket CommentsA
Read-onlyIdempotent

Read a ticket's conversation — public replies and internal notes with their full bodies — one cursor-paginated page at a time, newest comment first. Each entry carries the comment id, the author resolved to a name, the timestamp, whether it is public or internal, and the ids of any attached files. Prefer this over get_ticket(include_comments=true) whenever a thread is long or you only need the latest exchange: get_ticket appends the thread as one unpaginated block and cuts it past the response character limit, which drops the most recent comments first. Keep sort_order "desc" (the default) to read the latest reply first and follow the returned cursor to walk further back in time, or pass "asc" to replay the conversation forward from the ticket's opening description. For who changed which field and when — without comment bodies — use get_ticket_history; to download the attached files themselves, pass the attachment ids shown here to get_ticket_attachments.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page. Zendesk issues it for the ordering that response used, so after changing sort_order drop the cursor and start again from the first page.
page_sizeNoComments per page (1-100, default 20). The default is deliberately small because comment bodies are long and a bigger page risks being cut short by the response character limit; follow the returned cursor rather than raising it.
ticket_idYesTicket ID — the numeric id of the ticket whose conversation to read. Obtain it from search_tickets or list_tickets.
sort_orderNoChronological direction of the page. "desc" (the default) starts at the most recent comment and walks backward in time, which is what you want to see the latest reply; "asc" replays the conversation forward, starting from the ticket's opening description — that first comment therefore lands on the last page under "desc".desc

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), so this adds context instead: the truncation behavior of the alternative tool and which end it drops, cursor invalidation when sort_order changes, and the deliberately small default page size rationale. These are non-obvious operational traits an agent cannot infer from annotations or schema.

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?

Front-loaded with purpose and returns, followed by tool routing and parameter guidance — a sensible ordering. It is dense and the final sentence runs long, but each clause carries a distinct routing or behavioral fact rather than filler.

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?

With no output schema, the description enumerates the returned fields (comment id, resolved author name, timestamp, public/internal flag, attachment ids), and it covers pagination, ordering, and sibling alternatives. An agent has everything needed to invoke and use the result correctly.

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 coverage is 100%, so much of the parameter detail duplicates the schema (cursor semantics, page_size bounds, sort_order enum). The description still adds decision-level guidance — keep the default 'desc' for the latest reply, follow the cursor rather than raising page_size — which is meaning beyond the raw field definitions.

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 verb and resource ('Read a ticket's conversation — public replies and internal notes with their full bodies') and immediately scopes the retrieval model (cursor-paginated, newest first). It explicitly distinguishes itself from get_ticket, get_ticket_history, and get_ticket_attachments by name.

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

Usage Guidelines5/5

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

Gives an explicit routing rule: 'Prefer this over get_ticket(include_comments=true) whenever a thread is long or you only need the latest exchange,' and explains why (unpaginated block truncated past the character limit, dropping newest comments). It also routes field-change history to get_ticket_history and file downloads to get_ticket_attachments.

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

list_ticket_fieldsList Ticket FieldsA
Read-onlyIdempotent

List the ticket field definitions configured on this Zendesk (both system fields and custom fields), returning each field's id, type, whether it is active/required, and — for dropdown and multiselect fields — the valid option values. Use this to discover the numeric field ids and accepted option tags that create_ticket and update_ticket expect in their custom_fields argument, so a natural-language intent ("set severity to High") maps to the right id and a value Zendesk will accept instead of a blind guess. Read-only reference lookup; cursor-paginated in Zendesk's default field order.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
page_sizeNoTicket field definitions per page (1-100, default 100).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/destructive, so the safety profile is known. The description adds real value beyond them: the exact returned attributes (id, type, active/required, dropdown option values) and pagination behavior ('cursor-paginated in Zendesk's default field order'). It stops short of richer detail like rate limits or total-count semantics, so 4 rather than 5.

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?

Front-loaded with what it returns, then why to call it, then behavioral notes. Three dense sentences with no filler; 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?

No output schema exists, so the description carries the burden of explaining return values, and it does so concretely (id, type, active/required, option values). Combined with the pagination note, an agent has everything needed to call and interpret this 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 100%, so cursor and page_size are fully documented in the schema itself. The description only alludes to pagination generally and adds no syntax or format detail beyond the schema, making the baseline 3 correct.

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?

Specific verb (List) plus resource (ticket field definitions) with explicit scope: system fields and custom fields, plus the returned attributes. It is immediately distinguishable from siblings like list_labels, get_ticket, or create_ticket.

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

Usage Guidelines5/5

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

Explicitly states when to use it: to discover numeric field ids and option tags that create_ticket and update_ticket expect in custom_fields, with a concrete example ('set severity to High'). This routes the agent to the correct tool and names the downstream alternatives.

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

list_ticketsList Zendesk TicketsA
Read-onlyIdempotent

List tickets with cursor-based pagination, in Zendesk's default order (ascending ticket id), not by recency. Page size is controlled by page_size (not per_page, which is the offset-based parameter used by search_tickets); paginate by passing the returned cursor. To find tickets by recency or any other criterion, use search_tickets with a query.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
page_sizeNoTickets per page (1-100, default 100).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds non-obvious behavior: results are ordered by ascending id rather than recency, and pagination is cursor-based via a returned cursor. It omits details like rate limits or total-count behavior, so it stops short of a 5.

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?

Three front-loaded sentences with zero filler: ordering/nature first, pagination mechanics second, alternative tool routing last. Every clause carries decision-relevant 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?

For a two-parameter list tool with no output schema, the description covers ordering, pagination mechanics, and sibling routing, which is close to everything needed. It does not describe the returned ticket shape or cursor header/field name, a minor remaining gap.

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 coverage is 100%, so both parameters are already documented and the baseline is 3. The description goes further by clarifying that page_size (not per_page) controls page size here and that the cursor is returned by the previous response and passed back to paginate, adding real semantic value beyond the schema.

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 verb and resource plus the exact ordering semantics ('Zendesk's default order (ascending ticket id), not by recency'), and explicitly names the sibling it is not (search_tickets). An agent can distinguish it from the many list_*/get_* siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use routing: use this for cursor-based enumeration, use search_tickets with a query to find tickets by recency or any other criterion. It even warns that search_tickets uses per_page instead of page_size, which is exactly the disambiguation an agent needs.

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

list_user_segmentsList User SegmentsA
Read-onlyIdempotent

List all user segments. User segments control article visibility (who can view). Use the ID when creating or updating articles.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered by structured data. The description adds domain context ('segments control article visibility'), but says nothing about pagination, result size, or whether the list is exhaustive for the workspace.

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?

Three short sentences, front-loaded with the core action, followed by the meaning of the resource and how the output is consumed. No filler or repetition.

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 zero-parameter, read-only list tool with no output schema, the definition covers what it returns conceptually (segment IDs) and how they are used. Minor gap: it does not describe the shape of each returned segment beyond the ID.

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 the baseline is 4. There are no parameter semantics to explain, and the description correctly avoids inventing any input requirements.

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 gives a specific verb+resource ('List all user segments') and goes further by explaining what a segment is ('control article visibility (who can view)'). It does not name a sibling or explicitly distinguish itself from adjacent listing tools like list_permission_groups, so it stops 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 hints at downstream usage ('Use the ID when creating or updating articles'), which tells the agent why the result matters, but it never states when to prefer this tool or what alternatives exist (e.g., permission groups vs. user segments). The guidance is implied rather than explicit.

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

list_viewsList Zendesk ViewsA
Read-onlyIdempotent

List the agent's active Zendesk views — the saved ticket queues ("Unassigned tickets", "My open tickets", "Breaching today") the agent sees in the Zendesk UI — each with its current ticket count so you can tell at a glance where the workload sits. Views are per-agent scoped, so per-user auth returns exactly the queues this agent can see, with no shared key. Counts come from Zendesk's cache and can lag by up to about an hour (shown as "(count updating)" while a fresh value is still being computed); pass a view's title or id to get_view_tickets to read the tickets inside it.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response; omit for the first page.
page_sizeNoViews per page (1-100, default 100).

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/non-destructive annotations, it discloses genuinely non-obvious behavior: per-agent scoping tied to per-user auth, counts served from Zendesk's cache with up to ~1 hour lag, and the '(count updating)' sentinel state. These are exactly the gotchas an agent needs and are not derivable from structured fields.

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?

Front-loads the core purpose and keeps to one dense paragraph where each clause (examples, counts, scoping, staleness, hand-off) carries information. Slightly long and clause-heavy, but no filler sentences.

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?

With no output schema, the description still conveys the return shape (views each with a ticket count) and the caveat about stale counts. Combined with the annotated safety profile and a fully covered 2-param schema, nothing needed to call it correctly is missing.

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 100%, so cursor and page_size are already fully documented in the schema. The description adds no parameter-level detail (no mention of pagination or page-size tradeoffs), so the baseline 3 applies.

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 verb and resource (list Zendesk views) and immediately grounds it with concrete examples ('Unassigned tickets', 'My open tickets') and the payload (views with current ticket counts). It also names the sibling get_view_tickets as the follow-up tool, so an agent can distinguish it without opening either schema.

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?

Clearly signals the context of use ('tell at a glance where the workload sits') and hands off explicitly to get_view_tickets for drilling into tickets. It lacks an explicit when-not-to-use statement or a mention of list_tickets/search_tickets as alternatives, so it stops short of the top band.

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

manage_tagsManage Ticket TagsA
DestructiveIdempotent

Add or remove tags on a ticket. Performs an incremental read-modify-write: it fetches the ticket's current tags, adds those in add and deletes those in remove, then saves the merged set — tags you don't list are left untouched and duplicates are collapsed. Adding a tag already present, or removing one that is absent, is a no-op (idempotent). Returns the ticket's full tag set after the update. Use this for incremental tag edits; to overwrite the entire tag set at once, or to change tags alongside other fields, use update_ticket instead. Find the ticket id via search_tickets or list_tickets.

ParametersJSON Schema
NameRequiredDescriptionDefault
addNoTags to add. Zendesk tags are single tokens: a value containing spaces is stored as separate tags rather than one tag, so join multi-word tags yourself with an underscore or dash (e.g. "urgent_request"). Adding a tag already on the ticket is a no-op. Omit to only remove.
removeNoTags to remove. Removing a tag that is not present is a no-op; tags not listed here stay in place. Omit to only add.
ticket_idYesTicket ID — the numeric id of the ticket whose tags to modify. Obtain it from search_tickets or list_tickets.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare idempotent/destructive/openWorld, but the description adds the mechanism the annotations cannot express: an incremental read-modify-write that merges rather than replaces, collapses duplicates, leaves unlisted tags untouched, and returns the full post-update tag set. This is exactly the kind of beyond-annotation context that prevents data loss.

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?

Front-loaded with the core action, then mechanics, then routing to alternatives. Dense and mostly waste-free, though the mechanics and idempotency points could be trimmed by a sentence without losing meaning.

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?

Though there is no output schema, the description states the return value ('full tag set after the update'), the mutation semantics, and the sibling routing. Nothing an agent needs to call this correctly and safely is missing.

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 coverage is 100% and already documents add/remove omission and no-op semantics, so the baseline is 3. The description goes slightly beyond the schema by stating the merge/duplicate-collapse behavior and that unlisted tags survive, which clarifies how the two arrays interact.

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 verb pair and resource ('Add or remove tags on a ticket') and immediately names the sibling it is not for ('to overwrite the entire tag set at once ... use update_ticket instead'). An agent can distinguish it from update_ticket or create_content_tag without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('incremental tag edits') plus an explicit when-not with the named alternative (update_ticket for overwrite or combined field changes). It even tells the agent how to obtain the required ticket_id via search_tickets or list_tickets.

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

preview_macro_diffPreview a Macro Diff on a TicketA
Idempotent

Preview the exact changes a macro would make to a specific ticket, as a before → after diff, WITHOUT saving anything. Orchestrates two reads — the ticket's current state and Zendesk's macro-apply preview (which returns the whole resulting ticket) — and returns only the fields the macro actually changes (status, priority, assignee, group, tags, custom fields) plus the canned reply with its public/internal flag; unchanged and identity fields are omitted. Nothing is committed: to apply it, follow up with update_ticket for the field changes and add_public_comment or add_private_note for the reply. This deliberate two-step keeps the mutation explicit and reviewable rather than hidden. Find macro ids via list_macros and the ticket id via search_tickets or list_tickets.

ParametersJSON Schema
NameRequiredDescriptionDefault
macro_idYesMacro ID — the numeric id of the macro to preview. Obtain it from list_macros.
ticket_idYesTicket ID — the numeric id of the ticket to preview the macro against. Obtain it from search_tickets or list_tickets.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it explains the two underlying reads (current ticket + macro-apply preview), that unchanged/identity fields are omitted, the exact returned shape (status, priority, assignee, group, tags, custom fields + reply with public/internal flag), and that nothing is persisted. The idempotentHint=true is consistent with a stateless preview.

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?

Dense and front-loaded: the no-save guarantee and returned-fields summary come first, followed by the follow-up path and id sourcing. The rationale sentence about the 'deliberate two-step' is mildly editorial but still earns its keep by justifying the design.

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?

With no output schema, the description carries the burden of describing the return value, and it does so precisely (only changed fields, reply with its visibility flag, omissions noted). No annotation or schema gaps remain for an agent to call and interpret this tool correctly.

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 100%, so both integer parameters are already documented in the schema, including where to obtain them. The description repeats that sourcing guidance but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

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?

Specific verb (preview) + resource (macro diff on a ticket) with explicit scope: it returns only the fields the macro changes plus the canned reply, and commits nothing. This distinguishes it cleanly from update_ticket, which is named as the actual mutator.

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

Usage Guidelines5/5

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

States exactly when to use it (to see a macro's effect before applying) and routes the agent to update_ticket, add_public_comment, and add_private_note for the follow-up write. It also names list_macros, search_tickets, and list_tickets for obtaining the required ids.

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

reorder_articleReorder Help Center ArticleA
DestructiveIdempotent

Reorder an article within its current section by moving it relative to its siblings (top, bottom, or before/after another article), and return whether the new order was applied. This is the reliable way to satisfy "put this article first/last" requests: it writes the minimal set of article positions needed to make the order deterministic, because Zendesk leaves newly created articles tied at position 0 where a plain position update is silently ambiguous. It does NOT move the article to a different section — use update_article with section_id for that. Zendesk exposes no way to read whether a section is manually or automatically sorted, so when the section is sorted automatically (by date or alphabetically) the position writes are ignored; this tool detects that after the fact and returns guidance to switch the section to manual ordering in Guide. A move may reposition several neighbouring articles; when that count exceeds a configurable safety threshold the call is refused unless confirm is set to true.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesWhere to move the article relative to its section siblings: "top" (becomes first), "bottom" (becomes last), or "before"/"after" a specific reference article. "before" and "after" require reference_article_id.
confirmNoSafety guard for large reorders. When the move would rewrite more article positions than the configured threshold (REORDER_CONFIRM_THRESHOLD, default 20), the tool refuses and reports the count until you pass true here. Has no effect on small reorders.
normalizeNoWhen true, also renumber every article in the section to contiguous positions (0, 1, 2, …) so the stored positions stay tidy. Defaults to false, which writes the fewest positions possible and lets gaps remain. Either way the confirmation threshold still applies.
article_idYesArticle ID — the numeric id of the article to move within its section. Obtain it from list_articles or search_articles.
reference_article_idNoThe sibling article to position next to when target is "before" or "after" (numeric id from list_articles). Must belong to the same section and differ from article_id; leave it unset for "top" or "bottom".

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint/readOnlyHint=false/idempotent, but the description goes well beyond them: it explains the position-0 tie ambiguity that motivates minimal writes, discloses that auto-sorted sections silently ignore writes and how that is detected after the fact, and describes the threshold-based refusal requiring confirm. These are non-obvious behavioral traits an agent cannot infer from structured fields.

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?

Front-loaded with the action and scope, then layered caveats, with zero filler sentences. It is dense and slightly long, but nearly every clause carries decision-relevant information.

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?

Covers the action, the exclusion, the failure mode (auto-sorted sections), the safety gate, and even the return value ("return whether the new order was applied") in the absence of an output schema. Nothing needed to call it correctly is missing.

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 100%, so every parameter including target, confirm, and normalize is already documented in the schema. The description restates the confirm/threshold behavior but adds nothing beyond the schema and never mentions normalize. Baseline 3 is appropriate when the schema does the heavy lifting.

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 verb and resource (reorder an article within its current section) plus the precise mechanism (relative to siblings: top, bottom, before/after). It explicitly contrasts itself with the sibling update_article for cross-section moves, so an agent can distinguish it without opening a schema.

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

Usage Guidelines5/5

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

Explicitly names the trigger scenario ("put this article first/last" requests) and the alternative (update_article with section_id) for the case this tool does not cover. It also states the automatic-sorting condition under which the tool will not work, which is exactly the kind of when-not guidance that prevents wasted calls.

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

search_articlesSearch Help Center ArticlesA
Read-onlyIdempotent

Full-text search across Help Center articles (metadata only, no body). Use get_article for full content. Supports locale filtering. Returns total count.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number for offset pagination. Increment it while keeping `per_page` fixed to fetch subsequent pages; page 1 is the first page.
queryYesFull-text query matched against article titles and body. Plain keywords; combine with the locale filter to scope to one language.
localeNoFilter by locale (e.g., "en-us", "fr")
per_pageNoNumber of results per page for offset pagination (1-100). Pair with `page` to walk large result sets; the response header reports the total count and whether more pages remain.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds genuinely useful context not in the annotations: results are metadata only and exclude article bodies, and the response reports a total count. It does not disclose ranking behavior or empty-result handling, so it is solid but not rich.

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?

Three short sentences with zero filler; the scope constraint (metadata only) and the alternative tool are front-loaded before secondary details like locale and count.

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 output schema, the description usefully states that a total count is returned, and annotations carry the safety profile. Pagination and query semantics live in the schema. What is missing is only marginal – ranking/relevance behavior and how results are ordered.

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 100% – each of the four parameters is documented in the schema, including pagination mechanics. The description only echoes locale filtering, which the schema already explains, so a baseline 3 is appropriate.

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 verb and resource ('Full-text search across Help Center articles') with an explicit scope qualifier ('metadata only, no body'). It also names the sibling tool that serves the complementary need (get_article), so an agent can distinguish it without opening either schema.

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?

Explicitly routes the agent to get_article when full content is needed, and notes locale filtering is supported. However, it gives no guidance on when to prefer this over list_articles/list_sections or other sibling listing tools, so the exclusion set is partial.

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

search_ticketsSearch Zendesk TicketsA
Read-onlyIdempotent

Search tickets using Zendesk query syntax, returning each result with its live SLA state (per-metric stage and breach countdown) when an SLA policy applies. Examples: "status:open assignee:me", "priority:urgent ticket_type:incident". Returns total count, so queue triage like "breaching today" works without a per-ticket fetch.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number for offset pagination. Increment it while keeping `per_page` fixed to fetch subsequent pages; page 1 is the first page.
queryYesZendesk ticket search query — field filters like "status:open", "assignee:me", "priority:urgent ticket_type:incident", combined with free text. A "type:ticket" scope is added automatically, so filter the ticket kind with ticket_type: (e.g. ticket_type:incident), never type: (which the API rejects here).
per_pageNoNumber of results per page for offset pagination (1-100). Pair with `page` to walk large result sets; the response header reports the total count and whether more pages remain.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive safety, and the description adds real behavioral value: SLA enrichment on each result and a total count in the response. It doesn't discuss pagination limits, but the schema covers that, so this is above baseline.

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 tight sentences, front-loaded with the core action and SLA behaviour before examples. The parenthetical SLA clause is information-dense but slightly heavy; nothing is wasted.

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 read-only search tool with a fully documented schema, no output schema, and annotations covering the safety profile, the description supplies everything needed: query syntax, the SLA shape of results, and the total-count return.

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 100%, so the query/page/per_page semantics are already fully documented. The description's examples of valid query syntax are helpful but largely overlap what the schema's query description states, so baseline 3 applies.

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 verb and resource (search tickets) plus a distinctive capability: results carry live SLA state per metric. This clearly separates it from list_tickets, get_ticket, and the generic search sibling.

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?

Gives concrete query examples and a clear use case ('breaching today' queue triage without a per-ticket fetch), which tells the agent when this tool is the efficient path. It never explicitly names exclusions or the alternative sibling (list_tickets), so it stops 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.

search_usersSearch Zendesk UsersB
Read-onlyIdempotent

Search for users by name, email, or other criteria using Zendesk search query syntax. Returns total count.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number for offset pagination. Increment it while keeping `per_page` fixed to fetch subsequent pages; page 1 is the first page.
queryYesZendesk user search query — free text matched against name and email, and/or field filters like "email:jane@acme.com", "role:agent", "organization_id:123". A "type:user" scope is added automatically.
per_pageNoNumber of results per page for offset pagination (1-100). Pair with `page` to walk large result sets; the response header reports the total count and whether more pages remain.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered structurally. The description adds only 'Returns total count' and the note that query syntax is expected; it says nothing about pagination limits or result ordering beyond what the schema documents.

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 core verb/resource and no filler. 'Returns total count' is a slightly weak closer given there is no output schema to compare against.

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?

With no output schema, the description carries the burden of describing the response, and it only mentions the total count, leaving result shape, ordering, and pagination semantics to the schema. For a three-parameter search tool it is minimally adequate but not complete.

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 100%, and the schema documents page, per_page, and query syntax in detail, so the baseline is 3. The description restates the query capabilities ('name, email, or other criteria') without adding format, syntax, or constraint detail beyond the schema.

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 ('Search for users') plus the query mechanism, so an agent knows exactly what this returns. It does not distinguish itself from generic siblings like `search`, `search_tickets`, or `search_articles`, but the 'users' resource is unambiguous.

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 when-to-use guidance at all: nothing says to prefer this over the generic `search` sibling, nor when to reach for `get_user` (exact lookup) versus this query tool. The agent must infer the choice entirely.

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

set_category_translationCreate or Update a Category TranslationA
DestructiveIdempotent

Create or update the translation of a Help Center category in one locale, and return the resulting translation (locale, localized name, draft state). Creates the translation when the locale has none and updates it otherwise, so no listing call is needed first; only the fields you pass are written, which makes "publish this draft" a single draft: false. Use it to make a category reachable in a locale where its sections or articles are already translated — a gap find_translation_gaps reports and list_categories cannot explain.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLocalized category name for this locale (sent as the API's translation `title`). Required when the locale has no translation yet; omit on an existing one to leave its name untouched, for instance when only publishing a draft.
draftNoPublication state: false publishes the translation, making the category visible to end users in this locale; true keeps (or puts) it back as a draft. Defaults to false when creating; omit on an existing translation to leave its state unchanged.
localeYesLocale to write, e.g. "fr" or "de". Must be an active locale of the Help Center (zendesk-hc://topology lists them); list_category_translations shows which ones the category already has.
category_idYesCategory ID — the numeric id of the category whose translation to write. Obtain it from list_categories, find_translation_gaps or the zendesk-hc://topology resource.
descriptionNoLocalized category description for this locale (sent as the API's translation `body`). Omit to leave an existing description untouched; pass an empty string to clear it.

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing upsert semantics (creates when absent, updates otherwise), partial-write semantics ('only the fields you pass are written'), and draft toggling as a one-call publish. It does not address permissions/auth or the destructiveHint in terms of what an unintended write could overwrite, but the partial-write and omit-to-preserve rules cover most of that risk.

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 dense sentences, front-loaded with the upsert behavior and return shape before the routing hint. Every sentence carries information, though the third sentence is long and slightly overloaded with sibling references.

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?

No output schema exists, yet the description names the return payload (locale, localized name, draft state). Combined with the upsert, partial-update and draft rules, an agent has everything needed to call it correctly without a prior listing call.

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 coverage is 100%, so the baseline is 3, but the description adds cross-parameter workflow meaning the schema does not: the draft:false single-call publish pattern, and the create-vs-update distinction that determines when name is required. That interpretation is genuinely useful rather than a restatement.

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 precise verb+resource+scope: create or update the translation of a Help Center category in one locale. It explicitly distinguishes itself from the sibling translation tools by calling out the category-level, single-locale scope and by naming find_translation_gaps and list_categories as adjacent but insufficient.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('make a category reachable in a locale where its sections or articles are already translated'), names the sibling tools that report or cannot resolve the problem (find_translation_gaps, list_categories), and preempts the common alternative of calling a listing call first.

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

set_section_translationCreate or Update a Section TranslationA
DestructiveIdempotent

Create or update the translation of a Help Center section in one locale, and return the resulting translation (locale, localized name, draft state). Creates the translation when the locale has none and updates it otherwise, so no listing call is needed first; only the fields you pass are written, which makes "publish this draft" a single draft: false. Use it to make a section reachable in a locale where its articles are already translated — a gap find_translation_gaps reports and list_sections cannot explain.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLocalized section name for this locale (sent as the API's translation `title`). Required when the locale has no translation yet; omit on an existing one to leave its name untouched, for instance when only publishing a draft.
draftNoPublication state: false publishes the translation, making the section visible to end users in this locale; true keeps (or puts) it back as a draft. Defaults to false when creating; omit on an existing translation to leave its state unchanged.
localeYesLocale to write, e.g. "fr" or "de". Must be an active locale of the Help Center (zendesk-hc://topology lists them); list_section_translations shows which ones the section already has.
section_idYesSection ID — the numeric id of the section whose translation to write. Obtain it from list_sections, find_translation_gaps or the zendesk-hc://topology resource.
descriptionNoLocalized section description for this locale (sent as the API's translation `body`). Omit to leave an existing description untouched; pass an empty string to clear it.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark it destructive and idempotent, and the description adds real behavioral context beyond them: it creates vs updates depending on existing locale, writes only passed fields (partial update), and notes that 'publish this draft' is a single draft: false. That is exactly the mutation-safety and side-effect detail an agent needs.

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 dense sentences, front-loaded with the core action and outcome, then usage. Every clause carries information (upsert, return value, partial write, publish shortcut, routing), though the second sentence packs several ideas tightly.

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?

No output schema exists, yet the description names the return fields (locale, localized name, draft state). Combined with 100% schema coverage for inputs and annotations covering the destructive/idempotent profile, nothing needed to call it correctly is missing.

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 coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema states only per-field: omitting name/description leaves them untouched, and draft:false publishes. The draft publishing interaction is the key operational detail and it is surfaced in prose.

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 verb pair (create or update), the resource (Help Center section translation), and the scope (one locale), and it returns the resulting translation. The 'section' resource cleanly separates it from set_category_translation and create/update_article_translation without needing schema inspection.

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?

Gives a clear when-to-use ('make a section reachable in a locale where its articles are already translated') and ties it to the sibling find_translation_gaps. It implies the upsert removes the need for a prior listing call, but does not explicitly state when a different translation tool (category/article) is the right choice.

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

update_articleUpdate Help Center Article
DestructiveIdempotent

Update article metadata only (draft, promoted, labels as label_names, content tags as content_tag_ids, visibility as permission_group_id / user_segment_id, section_id, sort position, etc.) and return the updated article. Does NOT update content (title, body) — use update_article_translation for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNoSet true to unpublish the article (revert to draft) or false to publish it.
positionNoSort position within the section (manual ordering only; 0 = first/top). New articles default to position 0. To move an article to the END of its section, set this to one more than the highest current position: read the highest position P from list_articles with sort_by="position", sort_order="desc", then set position = P + 1.
promotedNoSet true to promote (feature) the article in its section, or false to unpromote it.
author_idNoUser id of the article author (from search_users).
article_idYesArticle ID — the numeric id of the article to update. Obtain it from list_articles or search_articles.
section_idNoMove the article to this section (numeric id from list_sections).
label_namesNoLabel names for search ranking (use list_labels to see existing labels).
content_tag_idsNoContent tag ids to attach (use list_content_tags to find them).
user_segment_idNoUser segment that controls who can see the article (id from list_user_segments; if that is forbidden because the token is not a Guide admin, reuse the user_segment_id of an existing article from get_article).
permission_group_idNoGuide permission group controlling who can edit (id from list_permission_groups; if that is forbidden because the token is not a Guide admin, reuse the permission_group_id of an existing article from get_article).
update_article_sectionUpdate Article SectionA
DestructiveIdempotent

Replace the body of one article section, heading excluded (the heading is kept as is), in a given locale, leaving the rest of the article intact. The server fetches the current body, replaces the targeted section, and PUTs the full reconstructed body via the Translations API. A leading heading in content that repeats the section heading is removed; any other h1-h3 in content creates new sections and shifts the later indexes (the response warns). section_index 0 is the heading-less intro, which exists only when the body has text before its first heading. 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoInput format. "html" (default) is the safe path. "markdown" is converted to HTML server-side but may introduce artifacts on complex content.html
localeYesLocale of the translation to update
contentYesNew content for the section (heading excluded: send neither the heading nor the "## [n] hN: ..." label line that get_article_section prints). HTML by default, Markdown if format="markdown".
article_idYesArticle ID — the numeric id of the Help Center article. Obtain it from list_articles or search_articles.
section_indexYes0-based index of the section to replace (see get_article_outline). 0 is the heading-less intro when the body has text before its first heading, otherwise the first heading.

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: server fetches current body, reconstructs and PUTs the full body via the Translations API, strips a duplicated leading heading, and warns that other h1-h3 in content spawn new sections and shift later indexes. That index-shifting side effect is exactly the non-obvious behavior an agent needs before writing.

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?

Front-loaded with the core replace semantics, then side-effect warnings, then the format guidance. Dense but every sentence carries operational information; slightly verbose but not padded.

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?

No output schema exists, yet the description pre-announces the response warning about index shifts, and covers the reconstruction/PUT mechanics, locale scoping, and content format expectations. For a destructive mutation tool this is complete.

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 coverage is 100%, so the baseline is 3, but the description genuinely enriches it: section_index 0 is defined as the heading-less intro, and content's heading/label-line exclusion and format trade-offs are explained beyond the schema text.

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 verb and resource ('Replace the body of one article section') and scopes it precisely: heading excluded, one locale, rest of article intact. This cleanly separates it from update_article (whole article), update_article_translation, and set_section_translation.

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?

Gives explicit conditional guidance for format (default html for fidelity; markdown only when you control input) and explains when section_index 0 exists. It does not name sibling alternatives to route between (e.g. full-article vs per-section updates), so it stops short of a full when/when-not/alternative map.

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

update_article_translationUpdate Article TranslationA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoNew full body (HTML) for this locale. Replaces the entire body — for a single-section edit prefer update_article_section. Omit to leave the body unchanged.
draftNoWhen true, keeps this translation as a draft; when false, publishes it.
titleNoNew title for this locale. Omit to leave the current title unchanged.
localeYesLocale of the translation to update, e.g. "en-us" or "fr". Use the source_locale (from get_article) to edit the default language.
article_idYesArticle ID — the numeric id of the article whose translation to update. Obtain it from list_articles or search_articles.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds real value beyond them by explaining WHY it is destructive: it 'replaces the FULL body and re-sends the entire article on each write.' It does not cover permission requirements or the omit-to-leave-unchanged semantics, but the core behavioral trait 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.

Conciseness5/5

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

Three tight sentences with no filler; the destructive full-body replacement caveat and the sibling alternative are front-loaded before the locale guidance.

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 destructive write tool with no output schema, the description covers the replacement behavior, the sibling alternative, and locale semantics. Only minor gaps remain (e.g., no mention of permission/auth requirements), which annotations partially cover.

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 100%, so the schema already documents every parameter including the source_locale/locale relationship. The description's locale guidance largely restates what the locale schema entry says, so baseline 3 applies.

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 verb+resource ('Update article content (title, body) in a specific locale') and distinguishes itself from the closely-named siblings update_article and update_article_section. An agent can tell what it does and how it differs from neighboring tools.

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

Usage Guidelines5/5

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

Explicitly names the alternative ('prefer update_article_section' for targeted edits) with the exact condition that selects it. Also gives positive routing guidance for locale selection ('Use the article's source_locale from get_article... or another locale for translations').

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

update_ticketUpdate Zendesk Ticket
DestructiveIdempotent

Update an existing ticket (status, priority, type, assignee, group, subject, tags, custom fields, followers, email CCs). Only the fields you pass are changed, and the updated ticket is returned. Followers and email CCs are incremental instead of replacing: pass { add, remove } lists of user ids, and the response reports who is subscribed afterwards. Zendesk applies those two silently, so a requested change it did not apply comes back listed as unconfirmed rather than raised as an error. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoReplaces the full tag set on the ticket. Use manage_tags for incremental add/remove.
typeNoTicket type. One of problem, incident, question, task.
statusNoNew ticket status. One of new, open, pending, hold, solved, closed.
subjectNoNew subject line for the ticket; replaces the current subject when provided.
group_idNoId of the group to assign the ticket to.
priorityNoTicket priority. One of urgent, high, normal, low.
email_ccsNoEnd users or agents to add to or remove from the ticket's email CC list, as numeric user ids: { add: [123], remove: [456] }. CCs receive the ticket's public correspondence, subject to your account's triggers. Numeric ids only, no email addresses: resolve the person with search_users first and confirm the match, because a name query can return several users. Zendesk caps a ticket at 48 email CCs and this tool cannot know how many are already set, so going over shows up as an unconfirmed entry in the response rather than a validation error. An id listed in both add and remove is removed. Omit to leave CCs untouched.
followersNoAgents to add to or remove from the ticket's follower list, as numeric user ids: { add: [123], remove: [456] }. Followers are notified of ticket updates, internal notes included, so this controls who hears about the ticket. Numeric ids only, no email addresses: resolve the person with search_users first and confirm the match before writing, because a name query can return several users and removing the wrong id succeeds silently. Adding someone already following, or removing someone who is not, is a no-op. An id listed in both add and remove is removed. Omit to leave followers untouched.
ticket_idYesTicket ID — the numeric id of the ticket to update. Obtain it from search_tickets or list_tickets.
assignee_idNoUser id of the agent to assign the ticket to.
custom_fieldsNoCustom field values as { id, value } pairs (field ids come from your Zendesk admin settings). Call list_ticket_fields first to discover the numeric field ids and, for dropdown/multiselect fields, the exact option values Zendesk accepts.

Tool Schema Changelog

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

  1. 4 tool updatesv3.3.1
    • Changedadd_private_note1 field changed
      • addedInput schema / properties / attachments / items / additionalProperties
        Added value: +false
    • Changedadd_public_comment1 field changed
      • addedInput schema / properties / attachments / items / additionalProperties
        Added value: +false
    • Changedcreate_ticket1 field changed
      • addedInput schema / properties / custom_fields / items / additionalProperties
        Added value: +false
    • Changedupdate_ticket1 field changed
      • addedInput schema / properties / custom_fields / items / additionalProperties
        Added value: +false
  2. 1 tool updatev3.0.1
    • Changedupdate_article_section2 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"New content for the section (heading excluded). HTML by default, Markdown if format=\"markdown\"."New value: +"New content for the section (heading excluded: send neither the heading nor the \"## [n] hN: ...\" label line that get_article_section prints). HTML by default, Markdown if format=\"markdown\"."
      • changedInput schema / properties / section_index / description
        Previous value: -"0-based index of the section to replace (see get_article_outline)"New value: +"0-based index of the section to replace (see get_article_outline). 0 is the heading-less intro when the body has text before its first heading, otherwise the first heading."
  3. 53 tool updatesv2.24.0
    • Changedadd_private_note1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd_public_comment1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedarchive_article1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcompare_translations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate_article1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate_article_attachment1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate_article_translation1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate_content_tag1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate_ticket1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfind_translation_gaps1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_article1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_article_outline1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_article_section1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_current_user1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_linked_incidents1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_organization1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_ticket1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_ticket_attachments1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_ticket_history1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_user1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_view_tickets1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_article_attachments1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_article_translations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_articles1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_categories1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_category_translations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_content_tags1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_labels1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_macros1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_organizations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_permission_groups1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_promoted_articles1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_section_translations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_sections1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_sla_policies1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_ticket_comments1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_ticket_fields1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_tickets1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_user_segments1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_views1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmanage_tags1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedpreview_macro_diff1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreorder_article2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / confirm / description
        Previous value: -"Safety guard for large reorders. When the move would rewrite more article positions than the configured threshold (ZENDESK_REORDER_CONFIRM_THRESHOLD, default 20), the tool refuses and reports the count until you pass true here. Has no effect on small reorders."New value: +"Safety guard for large reorders. When the move would rewrite more article positions than the configured threshold (REORDER_CONFIRM_THRESHOLD, default 20), the tool refuses and reports the count until you pass true here. Has no effect on small reorders."
    • Changedsearch1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_articles1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_tickets1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_users1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedset_category_translation1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedset_section_translation1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate_article1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate_article_section1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate_article_translation1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate_ticket1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  4. 1 tool updatev2.23.0
    • Changedupdate_ticket2 fields changed
      • addedInput schema / properties / email_ccs
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "End users or agents to add to or remove from the ticket's email CC list, as numeric user ids: { add: [123], remove: [456] }. CCs receive the ticket's public correspondence, subject to your account's triggers. Numeric ids only, no email addresses: resolve the person with search_users first and confirm the match, because a name query can return several users. Zendesk caps a ticket at 48 email CCs and this tool cannot know how many are already set, so going over shows up as an unconfirmed entry in the response rather than a validation error. An id listed in both add and remove is removed. Omit to leave CCs untouched.",
        +  "properties": {
        +    "add": {
        +      "description": "User ids to CC on the ticket, at most 48. Omit to only remove.",
        +      "items": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 9007199254740991,
        +        "type": "integer"
        +      },
        +      "maxItems": 48,
        +      "type": "array"
        +    },
        +    "remove": {
        +      "description": "User ids to drop from the CC list. Omit to only add.",
        +      "items": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 9007199254740991,
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / followers
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Agents to add to or remove from the ticket's follower list, as numeric user ids: { add: [123], remove: [456] }. Followers are notified of ticket updates, internal notes included, so this controls who hears about the ticket. Numeric ids only, no email addresses: resolve the person with search_users first and confirm the match before writing, because a name query can return several users and removing the wrong id succeeds silently. Adding someone already following, or removing someone who is not, is a no-op. An id listed in both add and remove is removed. Omit to leave followers untouched.",
        +  "properties": {
        +    "add": {
        +      "description": "User ids to start following the ticket. Omit to only remove.",
        +      "items": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 9007199254740991,
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    "remove": {
        +      "description": "User ids to stop following the ticket. Omit to only add.",
        +      "items": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 9007199254740991,
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
  5. 2 tool updatesv2.22.0
    • Changedadd_private_note1 field changed
      • addedInput schema / properties / attachments / items / properties / file_base64 / contentEncoding
        Added value: +"base64"
    • Changedadd_public_comment1 field changed
      • addedInput schema / properties / attachments / items / properties / file_base64 / contentEncoding
        Added value: +"base64"
  6. 3 tool updatesv2.20.2
    • Changedadd_private_note2 fields changed
      • changedInput schema / properties / attachments / items / properties / file_base64 / description
        Previous value: -"File content encoded as base64."New value: +"File content encoded as base64. At most 10420224 characters (about 7.45 MB of file), and the attachments of one call must stay under that total; the HTTP transport additionally caps request bodies at 4 MB."
      • addedInput schema / properties / attachments / items / properties / file_base64 / maxLength
        Added value: +10420224
    • Changedadd_public_comment2 fields changed
      • changedInput schema / properties / attachments / items / properties / file_base64 / description
        Previous value: -"File content encoded as base64."New value: +"File content encoded as base64. At most 10420224 characters (about 7.45 MB of file), and the attachments of one call must stay under that total; the HTTP transport additionally caps request bodies at 4 MB."
      • addedInput schema / properties / attachments / items / properties / file_base64 / maxLength
        Added value: +10420224
    • Changedcreate_article_attachment2 fields changed
      • changedInput schema / properties / file_base64 / description
        Previous value: -"The file's raw bytes as a base64-encoded string; the server decodes them before upload."New value: +"The file's raw bytes as a base64-encoded string; the server decodes them before upload. At most 10420224 characters (about 7.45 MB of file); the HTTP transport additionally caps request bodies at 4 MB."
      • addedInput schema / properties / file_base64 / maxLength
        Added value: +10420224
  7. 3 tool updatesv2.20.0
    • Changedget_ticket1 field changed
      • changedInput schema / properties / include_comments / description
        Previous value: -"When true, appends the full public comment and internal note thread to the response. Defaults to false to keep the payload small; enable it when you need the conversation, not just the ticket fields."New value: +"When true, appends the full public comment and internal note thread to the response. Defaults to false to keep the payload small; enable it when you need the conversation, not just the ticket fields. On a long thread prefer list_ticket_comments — this flag appends one unpaginated block, so comments past Zendesk's first page are absent and the rest is cut at the response character limit."
    • Changedget_ticket_attachments1 field changed
      • changedInput schema / properties / attachment_ids / description
        Previous value: -"Attachment IDs to fetch directly (e.g. extracted from a previous get_ticket(include_comments=true) call). When provided, skips the comments fetch entirely. When omitted, all attachments of the ticket are returned."New value: +"Attachment IDs to fetch directly (e.g. extracted from a previous list_ticket_comments or get_ticket(include_comments=true) call). When provided, skips the comments fetch entirely. When omitted, all attachments of the ticket are returned."
    • Addedlist_ticket_comments
  8. 1 tool updatev2.17.2
    • Changedfind_translation_gaps1 field changed
      • changedInput schema / properties / category_id / description
        Previous value: -"Restrict the audit to this category and the sections it contains (id from list_categories). Omit to sweep the whole tree, which costs one request per category and per section."New value: +"Restrict the audit to this category and the sections it contains (id from list_categories). Omit to sweep the whole tree, which costs two listings and covers up to 100 categories and 100 sections."
  9. 5 tool updatesv2.17.1
    • Addedfind_translation_gaps
    • Addedlist_category_translations
    • Addedlist_section_translations
    • Addedset_category_translation
    • Addedset_section_translation
  10. 1 tool updatev2.16.1
    • Addedlist_promoted_articles
  11. 9 tool updatesv2.15.0
    • Addedcompare_translations
    • Addedcreate_article
    • Addedcreate_article_attachment
    • Addedget_current_user
    • Addedlist_permission_groups
    • Addedreorder_article
    • Addedsearch_users
    • Addedupdate_article
    • Addedupdate_article_section
  12. 9 tool updatesv2.14.0
    • Removedcompare_translations
    • Removedcreate_article
    • Removedcreate_article_attachment
    • Removedget_current_user
    • Removedlist_permission_groups
    • Removedreorder_article
    • Removedsearch_users
    • Removedupdate_article
    • Removedupdate_article_section

TDQS

A3.8/5.0

Scored across 53 tools

Disambiguation4/5

The descriptions are unusually thorough and explicitly cross-reference sibling tools (e.g. get_ticket vs get_ticket_history vs list_ticket_comments, update_article vs update_article_translation vs update_article_section), so most boundaries are clear. The main overlaps are the generic `search` alongside `search_tickets`/`search_users`/`search_articles`, and the several article-listing tools (list_articles vs list_promoted_articles vs search_articles), which an agent could still occasionally misselect.

Naming Consistency4/5

The set predominantly follows a clean snake_case verb_noun pattern (get_ticket, create_article, list_sections, set_category_translation, preview_macro_diff). A few names break the pattern slightly—`search` is a bare verb, and compound verbs like find_translation_gaps and compare_translations diverge—but nothing is chaotic and conventions are largely predictable.

Tool Count2/5

At 53 tools this is heavy even for a full Zendesk-plus-Guide surface, crossing the 50+ threshold that signals over-expansion. While each tool maps to a real API endpoint, the breadth (tickets, Guide hierarchy, translations, tags/labels, macros, views, SLA, users, orgs) makes the surface large enough to burden selection and discovery.

Completeness4/5

Coverage is broad: full ticket lifecycle (create/read/update/comments/history/tags/attachments), Guide hierarchy, translations, content tags, macros, views, users and organizations. Gaps are minor and mostly on the write side of the ancillary resources—no user or organization creation/update, no ticket deletion, and category/section creation is only indirect via translation setters—but these are edge needs an agent can work around.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A server implementation that provides Claude AI with the ability to interact with Zendesk ticketing systems through various functions including retrieving, searching, creating, and updating tickets.
    7
    261 npm
    16
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI-powered ticket analysis and comprehensive Zendesk API integration via the Model Context Protocol, supporting both API token (CLI) and OAuth 2.1 (web) authentication modes.
    55
    314 npm
    5
    MIT