# Tickets

## Tickets auflisten: `list_tickets`

Liefert die Tickets eines Projekts, die neuesten zuerst, mit ID und Nummer.

| Argument | Bedeutung |
|---|---|
| `status` | Status-Wert des Projekts |
| `assignee` | Benutzer-ID oder `me` für dich |
| `tag` | Name eines Tags |
| `q` | Volltextsuche in Titel und Text |
| `page`, `per_page` | Seite, höchstens 100 je Seite |

<div class="docs-callout docs-callout--warning">
  <div class="docs-callout__title">Status gehört zum Projekt</div>
  <p>Jedes Projekt legt seine Status selbst fest. Ein geratener Wert wie <code>open</code> liefert in einem Projekt, das <code>offen</code> sagt, einfach null Treffer. Die gültigen Werte stehen in <code>meta.available_statuses</code> eines Aufrufs ohne Filter. Was ein Status bedeutet, sagt <code>status_functions</code>, etwa <code>is_open</code> oder <code>is_completed</code>.</p>
</div>

## Ein Ticket lesen: `get_ticket`

Der Agent nennt entweder `ticket_id` oder `number`, also die Nummer aus der App wie `187` oder
`#187`. Eine Nummer gilt nur innerhalb eines Projekts. Stehen beide da, zählt die ID.

Die Antwort enthält die Kopfdaten, die Beschreibung, eigene Felder, Kommentare und Anhänge.

| Argument | Bedeutung |
|---|---|
| `posts_page`, `posts_per_page` | Seite der Kommentare, höchstens 50 je Seite |
| `posts_order` | `oldest` (Standard) oder `newest` |
| `attachments_page` | Seite der Anhänge, je 10 |
| `full_text` | die ganze Beschreibung, bis 100.000 Zeichen |
| `post_id` | nur dieser eine Kommentar, bis 100.000 Zeichen |

Beschreibung und Kommentare kommen auf höchstens 8.000 Zeichen gekürzt. `full_text` holt die
Beschreibung, `post_id` einen Kommentar, jeweils bis 100.000 Zeichen. Bei einem Anhang des Tickets kommen bis zu 4.000 Zeichen des
ausgelesenen Texts mit, mehr gibt es dafür nicht. `text_status` sagt, ob er vorliegt:

| `text_status` | Bedeutung |
|---|---|
| `available` | Text ist lesbar |
| `empty` | Datei wurde gelesen und enthält keinen Text, etwa ein Scan |
| `unavailable` | noch nicht ausgelesen oder fehlgeschlagen, kann später klappen |
| `unsupported` | aus diesem Dateityp liest Lalabase keinen Text |

Dateien an einem Kommentar stehen dort mit Name, Typ und Größe, ihr Text kommt nicht mit.

## Ticket anlegen: `create_ticket`

| Argument | Bedeutung |
|---|---|
| `title` | Pflicht, eine Zeile, höchstens 255 Zeichen |
| `description` | Text des Tickets |
| `ticket_type` | Typ, Standard ist `support` |
| `summary` | Kurzfassung in einer Zeile |
| `status` | Startstatus, ein Schlüssel aus `meta.available_statuses` |

## Kommentieren: `post_comment`

| Argument | Bedeutung |
|---|---|
| `ticket_id` | Pflicht, die ID des Tickets |
| `body` | Pflicht, der Text |
| `format` | `html` (Standard) oder `plain` für reinen Text |
| `is_private` | `true`: nur du und die Konto-Administratoren seht den Kommentar |

Ein Kommentar über MCP ist ein normaler Kommentar: Er erscheint in der Aktivität und löst
dieselben Benachrichtigungen aus wie einer aus der App. Markdown wird nicht umgewandelt.

## Ändern: `update_ticket`

Ein Aufruf ändert genau eine Sache, sonst lehnt Lalabase ihn ab:

| Argument | Ändert |
|---|---|
| `ticket_id` | nichts, ist aber Pflicht: die ID, eine Nummer geht hier nicht |
| `title` | den Titel |
| `status` | den Status, als Schlüssel aus `meta.available_statuses`, nicht als Anzeigename |
| `add_assignee_ids`, `remove_assignee_ids` | die Zuweisung, alle anderen bleiben zugewiesen; `me` steht für dich, höchstens 50 IDs |

Sollen Status und Zuweisung sich ändern, macht der Agent zwei Aufrufe. Er ändert dabei dieselben
Dinge auf demselben Weg wie das Board.
