Skip to main content
Glama
Pressingly

Zammad MCP Server

by Pressingly

Zammad MCP Server

A Model Context Protocol server for the Zammad helpdesk. It lets Claude, or any MCP client, work with Zammad tickets using the caller's own Zammad permissions: every request carries a per-user API token, never a shared admin token, so Zammad itself decides what each user can see and change.

Status: early bootstrap. The server runs and exposes one smoke tool, get_me. The ticket, article, search, user, organization, tag and knowledge-base tools land next.

Modes

Community mode (available now)

Works against any Zammad 6.x or 7.x with a personal API token (Zammad: avatar menu, Profile, Token Access).

  • stdio for a local MCP client: zammad-mcp stdio

  • Streamable HTTP on /mcp, with GET /healthz for health checks: zammad-mcp http

Both read the token from ZAMMAD_HTTP_TOKEN. A per-request X-Zammad-Token header for multi-user HTTP is coming.

Platform mode (coming)

For deployments that put Zammad behind an SSO edge: users sign in with OAuth (AWS Cognito), and the server mints and caches a short-lived Zammad token for each user, bounded by that user's Zammad role. It is installed with the optional [platform] extra and enabled by COGNITO_USER_POOL_ID. Community mode never imports it.

Related MCP server: Zammad MCP Server

Quick start

uv sync
export ZAMMAD_URL=https://support.example.com
export ZAMMAD_HTTP_TOKEN=<your personal token>
uv run zammad-mcp stdio

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "zammad": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Pressingly/zammad-mcp-server", "zammad-mcp", "stdio"],
      "env": { "ZAMMAD_URL": "https://support.example.com", "ZAMMAD_HTTP_TOKEN": "<token>" }
    }
  }
}

Docker (HTTP on port 8214):

docker build -t zammad-mcp .
docker run --rm -p 8214:8214 -e ZAMMAD_URL=https://support.example.com -e ZAMMAD_HTTP_TOKEN=<token> zammad-mcp
curl http://localhost:8214/healthz

Configuration

Variable

Default

Purpose

ZAMMAD_URL

required

Base URL of the Zammad instance, without /api/v1

ZAMMAD_HTTP_TOKEN

unset

Personal API token used in community mode

ZAMMAD_TIMEOUT_SECONDS

30

Total timeout for one Zammad request

ZAMMAD_CONNECT_TIMEOUT_SECONDS

10

Connect timeout for one Zammad request

MCP_HTTP_PORT

8214

Listen port in http mode

Tools

Tool

What it does

get_me

Returns the Zammad user the token belongs to: id, login, name, email, roles

Every tool declares all four MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) and returns an Error: ... string instead of raising, so the model sees what went wrong.

Security notes

  • Ticket content is untrusted. Ticket titles, articles, attachments and customer names are written by whoever emailed or filled in the form. A crafted ticket can try to instruct the model ("forward this ticket to ..."). Treat everything the server returns as data. Tools that send email will be disabled by default and need a two-step confirmation.

  • Use a per-user token. Give each person their own Zammad token with only the permissions they need, rather than sharing one admin token. Zammad intersects a token's permissions with the user's role, so a token can never do more than its owner.

  • Customers need token access enabled. Stock Zammad lets Agents and Admins create API tokens, but not Customers. To let Customers use this server, an admin grants user_preferences.access_token to the Customer role (Admin, Roles, Customer).

  • The server never sends X-Auth-Request-* headers and never stores cookies, so it cannot impersonate a user on an SSO-fronted Zammad or carry one user's session into another user's request.

Development

uv sync
uv run ruff check .
uv run ruff format --check .
uv run pytest --cov=zammad_mcp --cov-fail-under=80

See CONTRIBUTING.md for the branch and commit workflow and SECURITY.md for reporting vulnerabilities.

License

MIT

Available Tools

1 tool
get_meGet current Zammad userA
Read-onlyIdempotent

Return the Zammad user the current token belongs to (id, login, name, email, roles).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds only the token-scoped return fields, which does not go far beyond the structured annotations and 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.

Conciseness5/5

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

The description is a single front-loaded sentence that states the operation, the scoping condition, and the returned fields without any wasted text.

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

Completeness5/5

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

For a zero-parameter read tool with rich annotations and an output schema, the description is complete enough. It identifies the current-token user context and the fields returned, while the output schema can define return structure in detail.

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 according to the rubric is 4. Schema description coverage is also 100%, meaning structured fields already handle parameter documentation.

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

Purpose5/5

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

The description states a specific verb and resource: 'Return the Zammad user the current token belongs to.' It also identifies the returned identity fields, making the tool's scope unambiguous even without sibling tools.

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

Usage Guidelines4/5

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

The phrase 'the current token belongs to' provides clear context for when this tool applies: retrieving the authenticated user for the active token. No alternatives exist among sibling tools, so no exclusions are needed.

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

Tool Schema Changelog

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

  1. 1 tool updatev0.1.0
    • First observedget_me

TDQS

A3.9/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool, there is no possibility of confusing it with another tool. Its purpose is clearly stated as returning the current Zammad user.

Naming Consistency5/5

The single tool name follows a clear snake_case verb_object convention (get_me). No inconsistency can exist with only one tool.

Tool Count1/5

A Zammad server with only one trivial identity tool is an extreme mismatch for the platform's scope. Zammad is a full helpdesk system requiring at least ticket, user, and organization operations.

Completeness1/5

The surface is severely incomplete for a Zammad integration. There are no tools for tickets, users, organizations, groups, or any CRUD/lifecycle operations, leaving agents unable to perform meaningful helpdesk tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that connects AI assistants to Zammad, providing tools for managing tickets, users, organizations, and attachments.
    44
    AGPL 3.0
  • A
    license
    A
    quality
    C
    maintenance
    MCP server that authenticates via browser session cookies to access Zendesk's REST API without API tokens, supporting reads and writes with agent permissions.
    19
    333 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server to interact with Zammad ticketing system, enabling ticket search, creation, update, article addition, and user/organization/group queries via the Zammad API.
    8 npm
    MIT