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.
Model Context Protocol (MCP) ist ein offenes Protokoll, das KI-Assistenten wie Claude ermöglicht, mit externen Tools und Services zu interagieren. Dieser MCP Server stellt 11 Tools für komplettes osTicket-Ticket-Management inklusive Subticket-Beziehungen bereit.
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 | Erforderlich für Subticket-Verwaltungs-Tools |
⚠️ Dieser MCP Server benötigt das API Endpoints Plugin auf deiner osTicket-Instanz.
cd /path/to/osticket/include/plugins
git clone https://github.com/markus-michalski/osticket-plugins.git
ln -s osticket-plugins/api-endpoints api-endpoints
# Im osTicket Admin Panel aktivieren
# Admin Panel → Manage → Plugins → API Endpoints → "Enable"
⚠️ Für Subticket-Verwaltungs-Features muss das Subticket Manager Plugin installiert sein.
cd /path/to/osticket/include/plugins
ln -s osticket-plugins/subticket-manager subticket-manager
# Im osTicket Admin Panel aktivieren
# Admin Panel → Manage → Plugins → Subticket Manager → "Enable"
Ohne dieses Plugin geben folgende Tools HTTP 501-Fehler zurück:
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
cd ~/.claude/mcp-servers/osticket
npm install
# TypeScript kompilieren
npm run build
0.0.0.0 verwendencan_read_ticketscan_search_ticketscan_update_ticketscan_delete_ticketscan_read_statscan_manage_subtickets (falls Subticket Manager Plugin installiert)Erstelle .env-Datei:
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=false # true für Produktiv mit gültigem SSL
# 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 # debug, info, warn, error
Bearbeite ~/.claude/config.json (oder Claude Desktop-Config):
{
"mcpServers": {
"osticket": {
"command": "node",
"args": ["/Users/deinname/.claude/mcp-servers/osticket/dist/index.js"]
}
}
}
Hinweis: Die .env-Datei wird automatisch vom Server geladen.
Starte Claude Desktop oder Claude CLI neu. Überprüfe 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 | false |
SSL-Zertifikate validieren (auf true für Produktion setzen) |
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 |
In Claude Desktop/CLI kannst du nun verwenden:
"Zeig mir alle offenen Tickets"
"Suche nach Tickets über Dashboard Widget"
"Hol Ticket #123456"
"Erstelle ein Ticket über den Bug, den ich gerade gefunden habe"
"Update Ticket #123456 auf Closed"
"Zeig mir alle Untertickets von #123456"
"Verknüpfe Ticket #234567 als Unterticket von #123456"
Der MCP Server handhabt automatisch API-Calls und gibt formatierte Ergebnisse zurück.
Bug suchen und fixen:
Du: "Suche in osTicket nach Tickets über Dashboard Widget"
Claude: *Sucht via 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 get_ticket ab*
Zeigt vollständiges Ticket mit allen Messages
Du: "Ich hab das Problem gefunden. Update auf In Progress und weise mir zu"
Claude: *Aktualisiert via update_ticket*
✅ Ticket #123456 aktualisiert
| Tool | Beschreibung | Erforderliche Berechtigung | Plugin erforderlich |
|---|---|---|---|
get_ticket |
Einzelnes Ticket mit allen Messages abrufen | can_read_tickets |
API Endpoints |
list_tickets |
Tickets mit Filtern auflisten | can_read_tickets |
API Endpoints |
search_tickets |
Volltextsuche | can_search_tickets |
API Endpoints |
get_ticket_stats |
Ticket-Statistiken abrufen | can_read_stats |
API Endpoints |
create_ticket |
Neues Ticket erstellen | can_create_tickets (native) |
- |
update_ticket |
Ticket-Eigenschaften aktualisieren | can_update_tickets |
API Endpoints |
delete_ticket |
Ticket permanent löschen | can_delete_tickets |
API Endpoints |
get_parent_ticket |
Eltern-Ticket eines Untertickets abrufen | can_manage_subtickets |
API Endpoints, Subticket Manager |
get_child_tickets |
Liste der Untertickets abrufen | can_manage_subtickets |
API Endpoints, Subticket Manager |
create_subticket_link |
Eltern-Kind-Beziehung erstellen | can_manage_subtickets |
API Endpoints, Subticket Manager |
unlink_subticket |
Eltern-Kind-Beziehung entfernen | can_manage_subtickets |
API Endpoints, Subticket Manager |
Zweck: Vollständiges Ticket mit allen Messages abrufen
Parameter:
number (optional) - Ticket-Nummer (z.B. "123456")id (optional) - Ticket-IDBeispiel:
{
"number": "123456"
}
Zweck: Tickets mit optionalen Filtern und Pagination auflisten
Parameter:
status (optional) - Nach Status filtern (z.B. "open", "closed")departmentId (optional) - Nach Department-ID filternlimit (optional) - Maximale Ergebnisse (Standard: 20)offset (optional) - Pagination-Offset (Standard: 0)Beispiel:
{
"status": "open",
"limit": 50
}
Zweck: Volltextsuche über Ticket-Subjects und -Nummern
Parameter:
query (erforderlich) - Suchbegrifflimit (optional) - Maximale Ergebnisse (Standard: 20)Beispiel:
{
"query": "Dashboard Widget",
"limit": 10
}
Zweck: Aggregierte Ticket-Statistiken abrufen
Parameter: Keine (leeres Objekt {})
Beispiel:
{}
Zweck: Neues osTicket-Ticket erstellen
Parameter:
name (optional) - User-Name (nutzt OSTICKET_DEFAULT_NAME falls nicht angegeben)email (optional) - User-E-Mail (nutzt OSTICKET_DEFAULT_EMAIL falls nicht angegeben)subject (erforderlich) - Ticket-Subjectmessage (erforderlich) - Ticket-Message/Beschreibungformat (optional) - Message-Format: "markdown" (Standard), "html" oder "text"topicId (optional) - Help Topic-ID (nutzt OSTICKET_DEFAULT_TOPIC_ID falls nicht angegeben)Markdown-Support:
Benötigt markdown-support Plugin. Ohne Plugin wird Content als HTML behandelt.
Beispiel:
{
"subject": "Bug Report",
"message": "## Kritischer Bug\\n\\n**Issue:** Fehler in Zahlungsberechnung\\n\\n```php\\n$total = calculateTotal();\\n```"
}
Zweck: Ticket-Eigenschaften aktualisieren
Parameter:
number (erforderlich) - Ticket-NummerdepartmentId (optional) - Department-ID oder -NamestatusId (optional) - Status-ID oder -NametopicId (optional) - Help Topic-ID oder -NamestaffId (optional) - Staff-ID oder -UsernameslaId (optional) - SLA-Plan-ID oder -NameparentTicketNumber (optional) - Parent-Ticket-Nummernote (optional) - Interne Notiz hinzufügennoteTitle (optional) - Titel für Notiz (Standard: "API Update")noteFormat (optional) - Format: "text", "html", "markdown" (Standard: "markdown")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:
Beispiel:
{
"number": "123456",
"statusId": "Geschlossen",
"departmentId": "IT Support",
"note": "## Lösung\\n\\nIssue behoben und deployed."
}
Numerische IDs funktionieren weiterhin:
{
"number": "123456",
"statusId": 3,
"departmentId": 5
}
Zweck: Ticket permanent löschen
⚠️ Warnung: Diese Operation ist unwiderruflich!
Parameter:
number (erforderlich) - Ticket-NummerBeispiel:
{
"number": "123456"
}
⚠️ Benötigt: Subticket Manager Plugin
Zweck: Eltern-Ticket eines Untertickets abrufen
Parameter:
number (erforderlich) - Unterticket-NummerBeispiel:
{
"number": "234567"
}
Antwort:
{
"success": true,
"parent": {
"ticket_id": 78,
"number": "123456",
"subject": "Hauptproblem",
"status": "Offen"
}
}
⚠️ Benötigt: Subticket Manager Plugin
Zweck: Liste der Untertickets eines Eltern-Tickets abrufen
Parameter:
number (erforderlich) - Eltern-Ticket-NummerBeispiel:
{
"number": "123456"
}
Antwort:
{
"success": true,
"children": [
{
"ticket_id": 79,
"number": "234567",
"subject": "Unteraufgabe 1",
"status": "Offen"
},
{
"ticket_id": 80,
"number": "345678",
"subject": "Unteraufgabe 2",
"status": "Geschlossen"
}
],
"total": 2
}
⚠️ Benötigt: Subticket Manager Plugin
Zweck: Eltern-Kind-Beziehung zwischen zwei Tickets erstellen
Parameter:
parentNumber (erforderlich) - Eltern-Ticket-NummerchildNumber (erforderlich) - Kind-Ticket-Nummer oder -IDBeispiel:
{
"parentNumber": "123456",
"childNumber": "234567"
}
Antwort:
{
"success": true,
"parent": {
"ticket_id": 78,
"number": "123456",
"subject": "Hauptproblem",
"status": "Offen"
},
"child": {
"ticket_id": 79,
"number": "234567",
"subject": "Unteraufgabe 1",
"status": "Offen"
},
"message": "Subticket-Verknüpfung erstellt: 234567 ist nun Unterticket von 123456"
}
⚠️ Benötigt: Subticket Manager Plugin
Zweck: Eltern-Kind-Beziehung entfernen (Ticket wieder unabhängig machen)
Parameter:
number (erforderlich) - Unterticket-Nummer zum EntfernenBeispiel:
{
"number": "234567"
}
Antwort:
{
"success": true,
"child": {
"ticket_id": 79,
"number": "234567",
"subject": "Unteraufgabe 1",
"status": "Offen"
},
"message": "Unterticket 234567 wurde von seinem Eltern-Ticket getrennt"
}
Symptome:
Prüfen:
node -v (muss 18+ sein)~/.claude/config.json Syntax (valides JSON).env~/Library/Logs/Claude/mcp*.log%APPDATA%\\Claude\\logs\\mcp*.logLösung:
# Server neu bauen
cd ~/.claude/mcp-servers/osticket
npm run build
# Manuell testen
node dist/index.js
Symptome: Ungültiger API-Key
Prüfen:
.env überprüfenLösung: API-Key neu generieren und .env aktualisieren
Symptome: Fehlende Berechtigungen
Prüfen:
can_read_ticketscan_search_ticketscan_update_ticketscan_delete_ticketscan_read_statscan_manage_subtickets (falls Subticket-Tools verwendet werden)Symptome: Ticket existiert nicht
Lösung:
Symptome: Subticket-Tools geben 501-Fehler zurück
Lösung:
can_manage_subtickets aktivieren)Symptome: .env-Datei nicht gefunden
Lösung:
.env unter ~/.claude/mcp-servers/osticket/.env existiert.env.example kopierenServer-Logs anzeigen:
# Live Tail
tail -f ~/.claude/mcp-servers/osticket/logs/server.log
# Debug-Logging in .env aktivieren
LOG_LEVEL=debug
┌─────────────────────────────────────┐
│ Claude Code │
│ └─ MCP Protocol │
├─────────────────────────────────────┤
│ MCP Server (Node.js/TypeScript) │
│ ├─ Application Layer │
│ │ └─ Tool Handlers │
│ └─ Infrastructure Layer │
│ ├─ HTTP Client │
│ │ └─ Intelligente ID-Auflösung │
│ └─ Logger │
├─────────────────────────────────────┤
│ osTicket REST API │
│ └─ API Endpoints Plugin │
│ ├─ tickets-statuses.php │
│ ├─ tickets-subtickets-*.php │
│ └─ Weitere Endpoints │
└─────────────────────────────────────┘
claude-mcp-osTicket/
├── dist/ # Kompiliertes JavaScript
├── src/
│ ├── index.ts # MCP Server Entry Point
│ ├── config/
│ │ └── Configuration.ts # Umgebungskonfiguration
│ ├── application/
│ │ └── handlers/
│ │ └── ToolHandlers.ts # Tool-Implementierungen
│ └── infrastructure/
│ ├── http/
│ │ ├── OsTicketApiClient.ts # REST API Client mit ID-Auflösung
│ │ └── types/
│ │ └── SubticketTypes.ts # TypeScript-Typen für Subtickets
│ └── logging/
│ └── Logger.ts # File-basierter Logger
├── package.json
├── tsconfig.json
├── .env # Konfiguration (nicht in Git)
└── .env.example # Template
| Tool | API-Endpunkt | Methode |
|---|---|---|
| get_ticket | /api/tickets-get.php/:number.json |
GET |
| list_tickets | /api/tickets-search.php |
GET |
| search_tickets | /api/tickets-search.php?query=... |
GET |
| get_ticket_stats | /api/tickets-stats.php |
GET |
| create_ticket | /api/tickets.json |
POST |
| update_ticket | /api/tickets-update.php/:number.json |
PATCH |
| delete_ticket | /api/tickets-delete.php/:number.json |
DELETE |
| get_parent_ticket | /api/tickets-subtickets-parent.php/:number.json |
GET |
| get_child_tickets | /api/tickets-subtickets-list.php/:number.json |
GET |
| create_subticket_link | /api/tickets-subtickets-create.php/:parent.json |
POST |
| unlink_subticket | /api/tickets-subtickets-unlink.php/:child.json |
DELETE |
| ID-Auflösung | /api/tickets-statuses.php |
GET |
API-Key-Verschlüsselung:
Input-Validierung:
Berechtigungssystem:
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 (wie "Offen", "Geschlossen", "Testing") automatisch in IDs auf, indem er den /api/tickets-statuses.php Endpoint abfragt. Das funktioniert mit deinen individuellen Status-Namen.
F: Was passiert, wenn ich einen ungültigen Status-Namen verwende?
A: Du bekommst eine hilfreiche Fehlermeldung, die alle verfügbaren Status-Namen deiner osTicket-Instanz auflistet.
F: Funktioniert die Namen-Auflösung auch für Departments, Topics und SLA-Pläne?
A: Ja! Die gleiche intelligente Auflösung funktioniert für:
/api/tickets-statuses.php)F: Werden die aufgelösten IDs gecacht?
A: Ja! Status-Namen werden einmal pro MCP Server-Session geladen und im Speicher gecacht für schnelle nachfolgende Lookups.
F: Was sind Subtickets?
A: Subtickets ermöglichen es, Eltern-Kind-Beziehungen zwischen Tickets zu erstellen. Dies ist 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 (get_parent_ticket, get_child_tickets, create_subticket_link, unlink_subticket). Alle anderen Tools funktionieren ohne das Plugin.
F: Was passiert, wenn ich Subticket-Tools ohne das Plugin verwende?
A: Du erhältst einen HTTP 501-Fehler mit der Meldung "Subticket plugin not available".
F: Kann ein Ticket mehrere Eltern haben?
A: Nein. Jedes Ticket kann nur ein Eltern-Ticket haben. Wenn du versuchst, ein Ticket zu verknüpfen, das bereits ein Eltern-Ticket hat, erhältst du einen HTTP 422-Fehler.
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. Die 0.0.0.0-Option benötigt das api-key-wildcard Plugin und sollte nur hinter Firewalls genutzt werden.
F: Wo werden API-Keys gespeichert?
A: In der .env-Datei, die von Git via .gitignore ausgeschlossen ist. Niemals API-Keys in Versionskontrolle committen.
F: Warum bekomme ich 403 Forbidden-Fehler?
A: Überprüfe Berechtigungen in Admin Panel → Plugins → API Endpoints → Configure. Stelle sicher, dass alle erforderlichen Berechtigungen für deinen API-Key aktiviert sind.
F: Kann ich Read-Only-API-Keys erstellen?
A: Ja! In der API Endpoints Plugin-Konfiguration aktiviere nur can_read_tickets, can_search_tickets und can_read_stats.
Dieser MCP Server wird unter der MIT License veröffentlicht.
Details siehe LICENSE.
Für Fragen oder Probleme erstelle bitte ein Issue auf GitHub:
Issue Tracker: https://github.com/markus-michalski/claude-mcp-osTicket/issues
Beim Melden von Problemen bitte angeben:
node -v)npm -v)Entwickelt von Markus Michalski
Beiträge willkommen!
0.0.0.0 IP)Siehe CHANGELOG.md für Versionshistorie.