Zammad MCP Server — Agent Workflows

Practical MCP workflows for Zammad 0.2.0 — summarize tickets, tags, attachments, links, and remote HTTP deployment.

Agent Workflows

Version 0.2.0 adds composite tools and helpdesk workflows that reduce tool-chaining in Claude Desktop and Cursor. This page shows copy-paste prompts and the MCP tools behind them.

One-call ticket summary

Instead of calling get_ticket, get_ticket_articles, and tag tools separately, use summarize_ticket:

Summarize Zammad ticket 12345 with summarize_ticket. Show the plain-text thread, tags, and the last customer message.

The response includes:

FieldUse for agents
thread_plainChronological conversation without HTML noise
tagsCurrent ticket tags
last_customer_messageFast context for drafting a reply
last_agent_messageWhat the team already said
article_countThread length / escalation signal

Articles also expose body_plain when MCP_STRIP_HTML=1 (default) on get_ticket and get_ticket_articles.

Search → tag → reply (≤3 tool calls)

Typical support triage in three MCP steps:

  1. Search — search_tickets with a Zammad query:

    state.name:open AND group.name:Support AND customer.email:jane@example.com
  2. Tag — add_ticket_tag on the chosen ticket ID (for example urgent-review).

  3. Reply — create_article with optional attachment (see below).

Example prompt for Cursor or Claude:

Search open Support tickets for customer.email:jane@example.com. On the newest match, add tag needs-callback and draft an internal note that we will call back today.

Recommended env for this workflow (writes allowed, deletes denied):

MCP_ALLOWED_CATEGORIES=tickets,system
MCP_DENIED_TOOLS=delete_ticket,delete_user,delete_organization,merge_tickets
MCP_ALLOWED_GROUPS=Support

MCP_ALLOWED_GROUPS blocks writes to tickets outside the listed groups.

Attachments

Read an attachment

  1. Call get_ticket_articles (or summarize_ticket) and read each article’s attachments list (id, filename, size).
  2. Call get_article_attachment(ticket_id, article_id, attachment_id, as_text=True) for plain text files.

For binary files the tool returns base64 in data.

Send an attachment with a reply

Pass attachments when calling create_article or create_ticket:

{
  "filename": "screenshot.png",
  "data": "<base64>",
  "mime_type": "image/png"
}

The server maps mime_type to Zammad’s mime-type JSON field automatically.

Example prompt:

Reply on ticket 12345 with a public note “Please see the attached log.” Attach the file error.log as text/plain.

ToolPermissionWhen to use
link_ticketsWRITERelate duplicates (normal, parent, child)
merge_ticketsADMINCombine two tickets into one customer-visible ID

Example:

Link ticket 100 as child of ticket 99, then summarize ticket 99.

Deny merge in agent configs unless a human explicitly approves:

MCP_DENIED_TOOLS=delete_ticket,delete_user,delete_organization,merge_tickets

Built-in MCP prompts (0.2.0)

Clients that support MCP prompts can invoke:

PromptParameters (examples)Purpose
analyze_ticketticket_id, localeStructured history + SLA hints
draft_responseticket_id, localeCustomer or internal reply draft
triage_queuegroupPrioritize open tickets
escalation_summarygroupOverdue / pending-close briefing

Legacy prompts from 0.1.x remain available: ticket_summary_prompt, customer_communication_prompt, escalation_analysis_prompt.

Remote HTTP MCP (Docker default)

For LibreChat, remote Cursor setups, or Zammad Commander, run Streamable HTTP:

zammad-mcp-server --transport http --host 0.0.0.0 --port 8000
SettingValue
Path/mcp/ (override with --path)
Env alternativeMCP_TRANSPORT=http, MCP_SERVER_PORT=8000
Docker imageSame command is the container default
HealthTCP on port 8000 — no /health route

Legacy SSE clients:

zammad-mcp-server --transport sse --host 0.0.0.0 --port 8000

Path defaults to /sse/. Use only on trusted networks or behind TLS.

Read-only demo preset

Safe configuration for first demos or read-only exploration:

MCP_DEFAULT_PERMISSION=read_only
MCP_ALLOWED_CATEGORIES=tickets,groups,system
MCP_DENIED_TOOLS=create_ticket,update_ticket,delete_ticket,create_article,merge_tickets
MCP_RATE_LIMIT_PER_MINUTE=60

Verify with: “Call get_allowed_tools and list what I can do.”