Der osTicket MCP Server ermöglicht Claude den direkten Zugriff auf deine osTicket-Instanz über die REST API. Verwalte Support-Tickets ohne deine Entwicklungsumgebung zu verlassen.
Dieser MCP Server ermöglicht Claude die direkte Interaktion mit osTicket - ohne manuelles Copy-Paste oder Browser-Wechsel. 11 Tools für komplettes Ticket-Management inklusive Subticket-Beziehungen.
Model Context Protocol (MCP) ist ein offenes Protokoll, das KI-Assistenten wie Claude ermöglicht, mit externen Tools und Services zu interagieren.
Was macht diesen MCP Server unverzichtbar:
| Anforderung | Version | Hinweise |
|---|---|---|
| Node.js | 18+ | Empfohlen: Node.js 20 LTS für beste Kompatibilität |
| npm | 9+ | Oder pnpm 8+ / yarn 3+ |
| Claude Desktop | Latest | Oder Claude CLI / andere MCP-kompatible Clients |
| osTicket | 1.18.x | Mit aktivierter REST API |
| API Endpoints Plugin | Latest | Erforderlich für erweiterte API-Operationen |
| Subticket Manager Plugin | Latest | Nur für Subticket-Verwaltungs-Tools erforderlich |
Dieser MCP Server benötigt das API Endpoints Plugin auf deiner osTicket-Instanz. Ohne dieses Plugin funktionieren die meisten Tools nicht.
cd /path/to/osticket/include/plugins
git clone https://github.com/markus-michalski/osticket-plugins.git
ln -s osticket-plugins/api-endpoints api-endpoints
Anschließend im osTicket Admin Panel aktivieren:
Admin Panel > Manage > Plugins > API Endpoints > "Enable"
Für Subticket-Verwaltungs-Features muss das Subticket Manager Plugin installiert sein. Ohne dieses Plugin geben die 4 Subticket-Tools HTTP 501-Fehler zurück.
cd /path/to/osticket/include/plugins
ln -s osticket-plugins/subticket-manager subticket-manager
Anschließend im osTicket Admin Panel aktivieren:
Admin Panel > Manage > Plugins > Subticket Manager > "Enable"
Betroffene Tools ohne Plugin:
get_parent_ticketget_child_ticketscreate_subticket_linkunlink_subticket# MCP Server-Verzeichnis erstellen
mkdir -p ~/.claude/mcp-servers/osticket
# Repository klonen
git clone https://github.com/markus-michalski/claude-mcp-osTicket.git ~/.claude/mcp-servers/osticket
# Dependencies installieren und bauen
cd ~/.claude/mcp-servers/osticket
npm install
npm run build
~/.claude/mcp-servers/osticket/cd ~/.claude/mcp-servers/osticket && npm install && npm run build0.0.0.0 verwendencan_read_ticketscan_search_ticketscan_update_ticketscan_delete_ticketscan_read_statscan_manage_subtickets (falls Subticket Manager Plugin installiert)cd ~/.claude/mcp-servers/osticket
cp .env.example .env
Bearbeite .env:
# Erforderlich
OSTICKET_API_URL=https://tickets.example.com
OSTICKET_API_KEY=DEIN_API_KEY_HIER
OSTICKET_API_REJECT_UNAUTHORIZED=true
# Optional: Defaults für Ticket-Erstellung
OSTICKET_DEFAULT_NAME=Claude AI
OSTICKET_DEFAULT_EMAIL=claude@example.com
OSTICKET_DEFAULT_TOPIC_ID=1
# Logging
LOG_LEVEL=info
claude mcp add -s user osticket node ~/.claude/mcp-servers/osticket/dist/index.js
Erklärung des Befehls:
-s user - Registriert den Server global für deinen User (in allen Projekten verfügbar)osticket - Name des MCP Servers (frei wählbar)node - Der Befehl zum Starten des ServersOhne
-s userwird der Server nur für das aktuelle Verzeichnis registriert. Für globale Verfügbarkeit immer-s userverwenden.
Registrierung überprüfen:
claude mcp list
Bearbeite ~/.claude.json und füge zur mcpServers-Sektion hinzu:
{
"mcpServers": {
"osticket": {
"type": "stdio",
"command": "node",
"args": ["/home/deinname/.claude/mcp-servers/osticket/dist/index.js"],
"env": {}
}
}
}
Ersetze
/home/deinname/mit deinem tatsächlichen Home-Verzeichnis-Pfad.
Starte Claude Desktop oder Claude CLI neu. Überprüfen mit /mcp - du solltest "osticket" mit Status "connected" sehen.
| Variable | Erforderlich | Standard | Beschreibung |
|---|---|---|---|
OSTICKET_API_URL |
Ja | - | Basis-URL deiner osTicket-Instanz |
OSTICKET_API_KEY |
Ja | - | API-Key für Authentifizierung |
OSTICKET_API_REJECT_UNAUTHORIZED |
Nein | true |
SSL-Zertifikate validieren (false nur für Entwicklung) |
OSTICKET_DEFAULT_NAME |
Nein | - | Standard-User-Name für Ticket-Erstellung |
OSTICKET_DEFAULT_EMAIL |
Nein | - | Standard-User-E-Mail für Ticket-Erstellung |
OSTICKET_DEFAULT_TOPIC_ID |
Nein | - | Standard Help Topic-ID für Ticket-Erstellung |
LOG_LEVEL |
Nein | info |
Logging-Level: debug, info, warn, error |
ALLOW_HTTP |
Nein | false |
HTTP statt HTTPS erlauben (nur für lokale Entwicklung) |
ALLOW_HTTP=true sollte niemals in Produktion verwendet werden. Der Server erzwingt standardmäßig HTTPS-Verbindungen.
| Tool | Beschreibung | Erforderliche Berechtigung | Plugin erforderlich |
|---|---|---|---|
osticket_get_ticket |
Einzelnes Ticket mit allen Messages abrufen | can_read_tickets |
API Endpoints |
osticket_list_tickets |
Tickets mit Filtern auflisten | can_read_tickets |
API Endpoints |
osticket_search_tickets |
Volltextsuche | can_search_tickets |
API Endpoints |
osticket_get_stats |
Ticket-Statistiken abrufen | can_read_stats |
API Endpoints |
osticket_create_ticket |
Neues Ticket erstellen | can_create_tickets (nativ) |
- |
osticket_update_ticket |
Ticket-Eigenschaften aktualisieren | can_update_tickets |
API Endpoints |
osticket_delete_ticket |
Ticket permanent löschen | can_delete_tickets |
API Endpoints |
osticket_get_parent_ticket |
Eltern-Ticket eines Untertickets | can_manage_subtickets |
API Endpoints + Subticket Manager |
osticket_get_child_tickets |
Liste der Untertickets | can_manage_subtickets |
API Endpoints + Subticket Manager |
osticket_create_subticket_link |
Eltern-Kind-Beziehung erstellen | can_manage_subtickets |
API Endpoints + Subticket Manager |
osticket_unlink_subticket |
Eltern-Kind-Beziehung entfernen | can_manage_subtickets |
API Endpoints + Subticket Manager |
Zweck: Vollständiges Ticket mit allen Messages abrufen
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
number |
string | Eins von beiden | Ticket-Nummer (z.B. "123456") |
id |
number | Eins von beiden | Interne Ticket-ID |
{ "number": "123456" }
Zweck: Tickets mit optionalen Filtern und Pagination auflisten
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
status |
string | Nein | - | open, closed, resolved, archived |
departmentId |
number | Nein | - | Department-ID |
limit |
number | Nein | 20 | Max. Ergebnisse (1-100) |
offset |
number | Nein | 0 | Pagination-Offset |
{ "status": "open", "limit": 50 }
Zweck: Volltextsuche über Ticket-Subjects und -Nummern
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
query |
string | Ja | - | Suchbegriff (2-200 Zeichen) |
limit |
number | Nein | 20 | Max. Ergebnisse (1-100) |
{ "query": "Dashboard Widget", "limit": 10 }
Zweck: Aggregierte Ticket-Statistiken abrufen
Keine Parameter erforderlich.
{}
Zweck: Neues osTicket-Ticket erstellen
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
subject |
string | Ja | - | Ticket-Betreff |
message |
string | Ja | - | Ticket-Nachricht (Markdown unterstützt) |
projectContext |
string | Nein | - | Projektname - wird als "Projekt: [Wert]" vorangestellt |
name |
string | Nein | Env-Default | User-Name |
email |
string | Nein | Env-Default | User-E-Mail |
format |
string | Nein | markdown |
Format: markdown, html, text |
topicId |
number | Nein | Env-Default | Help Topic-ID |
attachments |
array | Nein | - | Dateianhänge als Array von Pfaden (max 5, je max 10 MB) |
Markdown-Support benötigt das markdown-support Plugin auf der osTicket-Instanz. Ohne Plugin wird Content als HTML behandelt.
{
"subject": "Bug Report: Zahlungsberechnung",
"message": "## Kritischer Bug\n\n**Issue:** Fehler in Zahlungsberechnung\n\n```php\n$total = calculateTotal();\n```",
"projectContext": "invoice-management"
}
{
"subject": "Security Audit Report",
"message": "Audit-Ergebnisse im Anhang",
"projectContext": "shopware6-plugin",
"attachments": [{"path": "/tmp/SECURITY-AUDIT.md"}, {"path": "/tmp/screenshot.png"}]
}
Zweck: Ticket-Eigenschaften aktualisieren
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
number |
string | Ja | - | Ticket-Nummer |
departmentId |
string/number | Nein | - | Department-ID oder -Name |
statusId |
string/number | Nein | - | Status-ID oder -Name |
topicId |
string/number | Nein | - | Help Topic-ID oder -Name |
staffId |
string/number | Nein | - | Staff-ID oder -Username |
slaId |
string/number | Nein | - | SLA-Plan-ID oder -Name |
dueDate |
string/null | Nein | - | Fälligkeitsdatum ISO 8601 (z.B. "2026-01-31") oder null zum Löschen |
parentTicketNumber |
string | Nein | - | Parent-Ticket-Nummer |
note |
string | Nein | - | Interne Notiz (nur für Staff sichtbar) |
noteTitle |
string | Nein | "API Update" | Titel für Notiz |
noteFormat |
string | Nein | markdown |
Format: markdown, html, text |
attachments |
array | Nein | - | Dateien an Notiz anhängen (max 5, je max 10 MB). Erfordert note. |
Mindestens ein optionaler Parameter muss angegeben werden. Der Server validiert dies zur Laufzeit.
Intelligente ID-Auflösung:
Du musst dir keine IDs merken! Der MCP Server löst Namen automatisch in IDs auf, indem er deine osTicket-Instanz abfragt.
Unterstützt für:
So funktioniert's:
{
"number": "123456",
"statusId": "Geschlossen",
"departmentId": "IT Support",
"dueDate": "2026-03-15",
"note": "## Lösung\n\nIssue behoben und deployed."
}
{
"number": "123456",
"note": "## Audit-Ergebnisse\n\nSiehe angehängten Report.",
"attachments": [{"path": "/tmp/audit-report.pdf"}]
}
Numerische IDs funktionieren weiterhin:
{ "number": "123456", "statusId": 3, "departmentId": 5 }
Zweck: Ticket permanent löschen
Diese Operation ist unwiderruflich! Das Ticket und alle zugehörigen Messages werden permanent aus der Datenbank entfernt.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
number |
string | Ja | Ticket-Nummer |
{ "number": "123456" }
Benötigt das Subticket Manager Plugin. Ohne Plugin wird HTTP 501 zurückgegeben.
Zweck: Eltern-Ticket eines Untertickets abrufen
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
number |
string | Ja | Unterticket-Nummer |
{ "number": "234567" }
Benötigt das Subticket Manager Plugin. Ohne Plugin wird HTTP 501 zurückgegeben.
Zweck: Liste der Untertickets eines Eltern-Tickets abrufen
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
number |
string | Ja | Eltern-Ticket-Nummer |
{ "number": "123456" }
Benötigt das Subticket Manager Plugin. Ein Ticket kann nur ein Eltern-Ticket haben.
Zweck: Eltern-Kind-Beziehung zwischen zwei Tickets erstellen
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
parentNumber |
string | Ja | Eltern-Ticket-Nummer |
childNumber |
string | Ja | Kind-Ticket-Nummer |
{ "parentNumber": "123456", "childNumber": "234567" }
Benötigt das Subticket Manager Plugin.
Zweck: Eltern-Kind-Beziehung entfernen (Ticket wieder unabhängig machen)
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
number |
string | Ja | Unterticket-Nummer zum Entfernen |
{ "number": "234567" }
In Claude Desktop/CLI kannst du natürliche Sprache verwenden:
"Zeig mir alle offenen Tickets"
"Suche nach Tickets über Dashboard Widget"
"Hol Ticket #123456"
"Erstelle ein Ticket über den Bug im Projekt invoice-management"
"Erstelle ein Ticket mit dem angehängten Screenshot"
"Füge eine Notiz mit dem Audit-Report an Ticket #123456 an"
"Update Ticket #123456 auf Closed"
"Setze Due Date von Ticket #123456 auf nächsten Freitag"
"Zeig mir alle Untertickets von #123456"
"Verknüpfe Ticket #234567 als Unterticket von #123456"
Bug suchen und fixen:
Du: "Suche in osTicket nach Tickets über Dashboard Widget"
Claude: *Sucht via osticket_search_tickets*
3 Tickets gefunden:
- #123456 "Dashboard Widget lädt nicht" (Open)
- #234567 "Widget zeigt falsche Daten" (Open)
- #345678 "Widget Performance-Problem" (Closed)
Du: "Zeig mir Ticket #123456 im Detail"
Claude: *Ruft via osticket_get_ticket ab*
Zeigt vollständiges Ticket mit allen Messages
Du: "Ich hab das Problem gefunden. Update auf In Progress und setze Due Date auf 2026-03-01"
Claude: *Aktualisiert via osticket_update_ticket*
Ticket #123456 aktualisiert
Symptome: Claude Desktop zeigt keine MCP-Tools, "Server failed to start"-Fehler
Prüfen:
node -v (muss 18+ sein)~/.claude.json Syntax (valides JSON).env~/Library/Logs/Claude/mcp*.log%APPDATA%\Claude\logs\mcp*.log~/.claude/logs/Lösung:
cd ~/.claude/mcp-servers/osticket
npm run build
node dist/index.js
Symptome: Server funktioniert in einem Projekt, aber nicht in anderen
Ursache: Server wurde ohne -s user Flag registriert (nur lokale Registrierung)
Lösung:
claude mcp add -s user osticket node ~/.claude/mcp-servers/osticket/dist/index.js
claude mcp list
Symptome: Ungültige API-Key-Authentifizierung
Lösung:
.env überprüfen.env aktualisierenSymptome: Fehlende Berechtigungen für die angeforderte Operation
Lösung:
Symptome: Ticket existiert nicht oder falsches Department
Lösung:
Symptome: Subticket-Tools geben 501-Fehler zurück
Lösung:
can_manage_subtickets Berechtigung aktivierenLösung:
.env unter ~/.claude/mcp-servers/osticket/.env prüfen.env.example kopierenSymptome: "TLS/SSL connection error" oder Zertifikatfehler
Lösung:
OSTICKET_API_REJECT_UNAUTHORIZED=false in .env# Live Tail der Server-Logs
tail -f ~/.claude/mcp-servers/osticket/logs/server.log
# Debug-Logging aktivieren (in .env)
LOG_LEVEL=debug
Log-Dateien werden bei 10 MB automatisch rotiert. Maximal 5 alte Log-Dateien werden aufbewahrt.
claude-mcp-osTicket/
├── dist/ # Kompiliertes JavaScript
├── src/
│ ├── index.ts # MCP Server Entry Point + Tool-Registrierung
│ ├── constants.ts # Globale Konstanten
│ ├── config/
│ │ └── Configuration.ts # Umgebungskonfiguration + Validierung
│ ├── schemas/
│ │ └── index.ts # Zod Runtime-Validierungsschemas
│ ├── utils/
│ │ └── attachments.ts # Dateianhänge: Lesen, Base64, MIME-Erkennung
│ └── infrastructure/
│ ├── errors/
│ │ └── OsTicketApiError.ts # Custom Error-Klasse mit HTTP Status
│ ├── http/
│ │ ├── OsTicketApiClient.ts # REST API Client mit ID-Auflösung
│ │ └── types/
│ │ ├── ApiResponseTypes.ts # Ticket-Response TypeScript-Typen
│ │ └── SubticketTypes.ts # Subticket API-Typen
│ └── logging/
│ └── Logger.ts # Strukturierter Logger mit Rotation
├── package.json
├── tsconfig.json # Strict Mode TypeScript
├── eslint.config.js # ESLint v10
├── .env # Konfiguration (nicht in Git)
└── .env.example # Konfigurations-Template
| Tool | API-Endpunkt | Methode |
|---|---|---|
| osticket_get_ticket | /api/tickets-get.php/:number.json |
GET |
| osticket_list_tickets | /api/tickets-search.php |
GET |
| osticket_search_tickets | /api/tickets-search.php?query=... |
GET |
| osticket_get_stats | /api/tickets-stats.php |
GET |
| osticket_create_ticket | /api/wildcard/tickets.json |
POST |
| osticket_update_ticket | /api/tickets-update.php/:number.json |
PATCH |
| osticket_delete_ticket | /api/tickets-delete.php/:number.json |
DELETE |
| osticket_get_parent_ticket | /api/tickets-subtickets-parent.php/:number.json |
GET |
| osticket_get_child_tickets | /api/tickets-subtickets-list.php/:number.json |
GET |
| osticket_create_subticket_link | /api/tickets-subtickets-create.php/:parent.json |
POST |
| osticket_unlink_subticket | /api/tickets-subtickets-unlink.php/:child.json |
DELETE |
| ID-Auflösung | /api/tickets-statuses.php |
GET |
| Feature | Beschreibung |
|---|---|
| HTTPS Enforcement | Standardmäßig nur HTTPS-Verbindungen erlaubt |
| Zod Runtime-Validierung | Alle Eingabeparameter werden zur Laufzeit validiert |
| CRLF Injection Schutz | API-Keys werden auf CRLF-Zeichen geprüft |
| Response Size Limit | Maximale Response-Größe: 10 MB |
| Character Limit | Tool-Ausgaben auf 25.000 Zeichen begrenzt |
| Retry Logic | Exponential Backoff für transiente Fehler (502/503/504), max. 2 Retries |
| Timeout Handling | 10 Sekunden Timeout pro API-Request |
| URL Encoding | Defense-in-Depth gegen URL Injection |
| Error Sanitization | Keine rohen Error-Messages die IPs/Hostnames/Ports zeigen |
| Status Caching | 5 Minuten TTL für Status/Department/Topic Lookups |
| Graceful Shutdown | SIGINT/SIGTERM Handler für sauberes Herunterfahren |
| Health Check | Non-blocking Startup Health Check |
| Eigenschaft | Wert |
|---|---|
| Transport | stdio |
| MCP-Version | 1.0 |
| MCP SDK | @modelcontextprotocol/sdk ^1.20.1 |
| Runtime | Node.js 18+ (ESM) |
| Validierung | Zod ^3.25 |
| TypeScript | Strict Mode, ES2022 Target |
F: Was ist MCP?
A: MCP (Model Context Protocol) ist ein Standard-Protokoll zur Verbindung von KI-Assistenten mit externen Tools. Dieser Server implementiert MCP, damit Claude mit osTicket interagieren kann.
F: Muss ich Claude nach Konfigurationsänderungen neustarten?
A: Ja. Claude Desktop und Claude CLI müssen neu gestartet werden, um MCP-Konfigurationen neu zu laden.
F: Kann ich das mit anderen KI-Assistenten nutzen?
A: Ja! Jeder MCP-kompatible Client kann diesen Server nutzen. Primär getestet mit Claude Desktop und Claude CLI.
F: Ist es kompatibel mit Node.js 16?
A: Nein. Benötigt Node.js 18+ für ESM-Support und moderne JavaScript-Features.
F: Funktioniert es unter Windows?
A: Ja! Getestet auf macOS, Linux und Windows.
F: Funktioniert es mit osTicket 1.17?
A: Nicht getestet. Konzipiert für osTicket 1.18.x. Funktioniert möglicherweise mit 1.17, aber Kompatibilität nicht garantiert.
F: Kann ich Status-Namen statt IDs verwenden?
A: Ja! Der MCP Server löst Status-Namen automatisch in IDs auf. Das funktioniert mit allen deinen individuellen Status-Namen.
F: Was passiert bei einem ungültigen Status-Namen?
A: Du bekommst eine hilfreiche Fehlermeldung mit allen verfügbaren Status-Namen deiner osTicket-Instanz.
F: Werden die aufgelösten IDs gecacht?
A: Ja! Werte werden für 5 Minuten im Speicher gecacht.
F: Was sind Subtickets?
A: Subtickets ermöglichen Eltern-Kind-Beziehungen zwischen Tickets - nützlich für die Organisation komplexer Issues in Haupt-Tickets mit Unteraufgaben.
F: Brauche ich das Subticket Manager Plugin für alle Tools?
A: Nein. Nur für die 4 subticket-spezifischen Tools. Alle anderen 7 Tools funktionieren ohne das Plugin.
F: Kann ein Ticket mehrere Eltern haben?
A: Nein. Jedes Ticket kann nur ein Eltern-Ticket haben (HTTP 422-Fehler bei Versuch).
F: Ist es sicher, 0.0.0.0 als API-Key-IP zu verwenden?
A: Nur in Entwicklung! Für Produktion immer spezifische IP-Adressen verwenden. Benötigt das api-key-wildcard Plugin.
F: Wo werden API-Keys gespeichert?
A: In der .env-Datei, die von Git via .gitignore ausgeschlossen ist.
Dieser MCP Server wird unter der MIT License veröffentlicht.
Details siehe LICENSE.
Issue Tracker: https://github.com/markus-michalski/claude-mcp-osTicket/issues
Beim Melden von Problemen bitte angeben: Node.js-Version, osTicket-Version, MCP Server-Version, Betriebssystem, Fehlermeldungen aus Logs, Schritte zur Reproduktion.
Changelog: CHANGELOG.md
Entwickelt von Markus Michalski