Zammad MCP Server
An MCP server exposing a Zammad helpdesk to a model. Built on
zammad-python-client;
it owns tool design, safety and response shaping and no HTTP logic at all.
Fifteen tools shaped like support jobs, not CRUD:
| Tool | Does | Writes |
|---|---|---|
find_customer |
People and organizations by name, email, login | no |
search_tickets |
Zammad query syntax or free text; summaries only | no |
get_ticket |
One ticket with conversation (as text), tags, booked time | no |
reference_data |
Groups, states, priorities, time types with ids | no |
create_ticket |
New ticket for a customer with an internal opening note | yes |
add_note |
Internal note, optional time booking | yes |
reply_to_customer |
Stores a draft note by default; mails only with send=true |
yes |
update_ticket |
State, priority, owner, group, title, pending time, with a note | yes |
log_time |
Book time on a ticket | yes |
search_knowledge |
Knowledge base search as agent (internal + public) | no |
get_answer |
One answer, body as text | no |
write_answer |
New answer, set to internal (agents only) | yes |
update_answer |
Change title/body of one translation, or move the answer; visibility untouched | yes |
create_category |
New knowledge-base category, optionally nested | yes |
kb_structure |
Knowledge bases, locales, categories with ids | no |
Deliberately absent: delete anything, merge tickets, publish an answer publicly,
mail a customer without send=true. Every write is something an agent does
all day and can undo in the UI.
Install
On PyPI as zammad-mcp; the server itself needs no install step:
claude mcp add --scope user zammad -e ZAMMAD_URL=https://zammad.example.com -e ZAMMAD_TOKEN=... -- uvx zammad-mcp
Any MCP client: command uvx, args ["zammad-mcp"], env ZAMMAD_URL and
ZAMMAD_TOKEN. Teams on our marketplace install the zammad plugin instead,
which asks for the token on install.
From a checkout: uv venv && uv pip install -e ".[dev]", then .venv/bin/zammad-mcp
with ZAMMAD_URL / ZAMMAD_TOKEN in .env.
Token: create a dedicated agent user in Zammad (e.g. mcp) with only the
groups the model should see, ticket.agent, knowledge_base.reader and, if it
may write answers, knowledge_base.editor. Generate the token under that user's
profile. Never use an admin token.
Behaviour
- Lists are capped (
ZAMMAD_MCP_DEFAULT_LIMIT,ZAMMAD_MCP_MAX_LIMIT) and say so innotes. - Article and answer bodies are HTML-to-text and cut at
ZAMMAD_MCP_BODY_CHARS, disclosed innotes. - Errors come back as
{"error": "<sentence>"}, never as exceptions. - One client per worker thread; the SDK runs tool handlers concurrently.
Development
pytest -q # fake client + one real stdio handshake, no network
mypy
scripts/verify-live.py --ticket <id> # read-only tools against a real instance (.env)
Releases: bump version in pyproject.toml and __version__ in
src/zammad_mcp/__init__.py together, tag vX.Y.Z; CI publishes to PyPI.
Metadata
Release files for zammad-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zammad_mcp-0.1.1.tar.gz | 19.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zammad_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.2 kB
Release files / zammad_mcp-0.1.1.tar.gz
| Download URL | zammad_mcp-0.1.1.tar.gz |
|---|---|
| Size | 19.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f487d7a1619a2c9dd2250d2802bff64c62dfad568b082fe4ec719bde4830ee2c
|
|
BLAKE2b-256 checksum How to use checksums |
bad8e12d00c79346525121edc7dc47c405215bda3cd2cb10d72f7bc257a6bc54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / zammad_mcp-0.1.1-py3-none-any.whl
| Download URL | zammad_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 17.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3842be6c6b7fef16083ce4540ddd04a1a7f7e02e020efb1707d3e2ce974185cf
|
|
BLAKE2b-256 checksum How to use checksums |
558a52114f126ae53e537e30e5f42562558705ac21e5f241b5ae89788871835e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|