Zum Inhalt springen

Entwickler

REST-API, Ereignisse und MCP

Apps verbinden eure Tools und KI-Agenten mit emuchat. Admins installieren sie unter Verwaltung → Apps, wählen die Channels und bekommen einen Token. Eine App sieht nur diese Channels und darf nur, was ihre Scopes erlauben.

Anmeldung

Jede Anfrage trägt den Token als Bearer-Header:

curl https://app.emuchat.de/api/v1/me -H "Authorization: Bearer emu_…"

Antworten sind JSON. Fehler kommen als {"error": "…", "message": "…"} mit 400, 401, 403, 404, 409 oder 429 (höchstens 120 Anfragen pro Minute und App).

Endpunkte

Basis: https://app.emuchat.de/api/v1

GET /me
Die App hinter dem Token: Name, Scopes, Workspace.
GET /channels
Channels, zu denen die App hinzugefügt wurde (channels:read).
GET /channels/{id}/messages?limit=50&before={id}
Neueste Nachrichten, älteste zuerst; before blättert zurück (messages:read). Statt der Id geht auch der Name.
POST /channels/{id}/messages
Nachricht als App schreiben: {"text": "…", "thread_id": 123} (messages:write).
GET /users
Mitglieder mit Id und Name, ohne E-Mail-Adressen (users:read).

Nachrichten enthalten body (Erwähnungen als <@userId>) und text (Erwähnungen als @Name). Erlaubt ist eine Markdown-Teilmenge: *fett*, _kursiv_, `Code`, Listen, Zitate und Links.

curl -X POST https://app.emuchat.de/api/v1/channels/allgemein/messages \
  -H "Authorization: Bearer emu_…" -H "Content-Type: application/json" \
  -d '{"text": "Build *grün* ✅"}'

Ereignisse

Mit einer Ereignis-Adresse (und dem Scope messages:read) schickt emuchat jede neue Nachricht in den Channels der App per POST – nie die eigenen Nachrichten der App:

{
  "type": "message.created",
  "workspace_id": "…",
  "channel": { "id": "…", "name": "allgemein" },
  "message": { "id": 42, "thread_id": null,
               "author": { "id": "…", "name": "Kim", "bot": false },
               "body": "…", "text": "…", "created_at": "…" }
}

Prüft die Herkunft mit dem Signatur-Geheimnis: X-Emuchat-Signature: sha256=HMAC_SHA256(geheimnis, timestamp + "." + body) mit X-Emuchat-Timestamp in Sekunden. Ereignisse gehen nur an öffentliche https-Adressen, mit 5 Sekunden Zeitlimit und ohne Wiederholung.

MCP-Server

Claude und andere Agenten arbeiten über das Model Context Protocol (Streamable HTTP) direkt in emuchat – mit demselben Token und denselben Rechten. Werkzeuge: list_channels, read_messages, search_messages, post_message, list_people.

claude mcp add --transport http emuchat https://app.emuchat.de/api/mcp \
  --header "Authorization: Bearer emu_…"

Tickets (mit den Scopes tickets:read und tickets:write): inhouseticket_list_projects, inhouseticket_search_tickets, inhouseticket_get_ticket, inhouseticket_create_ticket, inhouseticket_update_ticket, inhouseticket_add_comment, inhouseticket_toggle_subtask, inhouseticket_get_workload, inhouseticket_list_members – dieselben Namen wie bei inhouseticket, bestehende Anweisungen funktionieren also weiter. Die App erreicht die Projekte, die mit einem ihrer Channels verknüpft sind, und handelt als App: Kommentare und Änderungen tragen ihren Namen.

Ohne eigene App

Nur Meldungen in einen Channel schicken? Dafür reicht ein Workflow mit eingehendem Webhook – ohne Token, mit geheimer Adresse.