# Diensterkennung

> Wie LMSP-Clients einen lokalen Dienst per manueller Konfiguration, Loopback-Prüfung und optionalem mDNS/DNS-SD finden und wie das Dokument mit der Dienstbeschreibung unter der wohlbekannten Adresse zu lesen ist.

Source: https://madeforagent.com/de/lmsp/1.0/discovery/
Language: de
Specification: LMSP 1.0 (draft)
Updated: 2026-11-08

## 3.1 Erkennungsmethoden {#methods}

Ein Client erkennt einen Dienst, indem er diese Methoden der Reihe nach versucht:

1. **Manuelle Konfiguration.** Der Nutzer gibt die Adresse des Dienstes direkt ein.
2. **Prüfen üblicher lokaler Adressen.** Der Client ruft `/.well-known/lmsp.json` von Kandidatenadressen ab. Die üblichen Kandidaten sind `http://127.0.0.1:17832` und `http://[::1]:17832`.
3. **LAN-Erkennung.** Der Client sucht mit mDNS und DNS-SD nach `_lmsp._tcp.local.`.

Eine Methode ist erfolgreich, wenn sie eine gültige Dienstbeschreibung liefert ([Abschnitt 3.3](https://madeforagent.com/de/lmsp/1.0/discovery.md#service-description)). Eine vom Nutzer manuell eingegebene Adresse hat immer Vorrang vor gefundenen.

## 3.2 LAN-Ankündigung {#mdns}

DNS-SD nutzt PTR-Einträge, um Dienstinstanzen zu finden, SRV-Einträge, um Host und Port zu erhalten, und TXT-Einträge, um eine kleine Menge zusätzlicher Informationen zu transportieren. Zusammen mit mDNS ermöglicht es die konfigurationsfreie Erkennung in einem lokalen Netzwerk ([RFC 6763](https://www.rfc-editor.org/rfc/rfc6763), [RFC 6762](https://www.rfc-editor.org/rfc/rfc6762)).

Ein Beispiel für eine Ankündigung:

```text
Service type:   _lmsp._tcp.local.
Instance name:  Workstation LMSP._lmsp._tcp.local.

TXT record:
  v=1
  id=svc_01J8M4Y8K6M5E6K6Z7Z0Y8W3M2
  path=/
  auth=pairing
```

| TXT-Schlüssel | Bedeutung |
| --- | --- |
| `v` | Version des Ankündigungsformats. `1` für LMSP 1.0. |
| `id` | Die Dienst-ID, gleich `service.id` in der Dienstbeschreibung. |
| `path` | URL-Pfad der Dienstwurzel. Clients rufen `{path}.well-known/lmsp.json` ab. |
| `auth` | Hinweis zur Authentifizierung. `pairing` bedeutet, dass sich ein Client koppeln muss, bevor er den Dienst nutzt. |

Regeln:

- Ein Dienst **DARF NICHT** Zugriffstokens, Modelllisten, Dateipfade oder andere sensible Informationen in den TXT-Eintrag schreiben. Der Eintrag lokalisiert den Dienst nur. Die tatsächlichen Fähigkeiten **MÜSSEN** aus der Dienstbeschreibung gelesen werden.
- Ein Dienst **MUSS** die mDNS-Ankündigung standardmäßig deaktiviert lassen. Sie wird nur aktiviert, wenn der Nutzer die LAN-Erkennung ausdrücklich einschaltet. Ein Dienst, der nur auf dem lokalen Rechner genutzt wird, kündigt sich nicht an.
- Ein Dienst, der sich im LAN ankündigt, muss über Loopback hinaus lauschen, was nur im LAN-Modus erlaubt ist ([Abschnitt 10.5](https://madeforagent.com/de/lmsp/1.0/security.md#lan)).
- Ein Client **MUSS** den TXT-Eintrag als ungeprüften Hinweis behandeln und den Dienst bestätigen, indem er seine Beschreibung liest.

## 3.3 Dienstbeschreibung {#service-description}

```http
GET /.well-known/lmsp.json
```

Ein Dienst **MUSS** dieses Dokument als `application/json` ausliefern, ohne eine Authentifizierung zu verlangen.

```json
{
  "protocol": "lmsp",
  "versions": ["1.0"],
  "service": {
    "id": "svc_01J8M4Y8K6M5E6K6Z7Z0Y8W3M2",
    "name": "Workstation Local Models",
    "version": "1.0.0"
  },
  "interfaces": [
    {
      "kind": "lmsp",
      "version": "1.0",
      "url": "http://127.0.0.1:17832/lmsp/v1",
      "transport": "http+json"
    },
    {
      "kind": "openai",
      "version": "responses+chat",
      "url": "http://127.0.0.1:17832/v1",
      "transport": "http+json"
    }
  ],
  "capabilities": {
    "streaming": true,
    "tasks": true,
    "event_resume": true,
    "conversations": true,
    "model_management": true
  },
  "authentication": {
    "type": "bearer",
    "pairing_url": "http://127.0.0.1:17832/lmsp/v1/pair"
  },
  "openapi": "http://127.0.0.1:17832/lmsp/v1/openapi.json"
}
```

| Feld | Bedeutung |
| --- | --- |
| `protocol` | Immer `"lmsp"`. |
| `versions` | Die vom Dienst unterstützten LMSP-Versionen als `major.minor`-Zeichenfolgen. |
| `service` | `id` ist eine stabile Dienstkennung, `name` ein Anzeigename und `version` die Version der Dienstsoftware. |
| `interfaces` | Die angebotenen Schnittstellen. Jede hat ein `kind` (`lmsp`, `openai` oder `ollama`), eine `version`, eine Basis-`url` und einen `transport`. Bei `openai` nennt `version` die bereitgestellten API-Familien, etwa `responses+chat`. |
| `capabilities` | Boolesche Funktionsschalter, unten aufgeführt. |
| `authentication` | `type` ist `bearer`. `pairing_url` ist die Adresse, unter der Clients einen Kopplungscode gegen ein Token eintauschen ([Abschnitt 10.2](https://madeforagent.com/de/lmsp/1.0/security.md#pairing)). |
| `openapi` | URL des OpenAPI-Dokuments, das die LMSP-Schnittstelle beschreibt. |

Capability-Schalter:

| Schalter | Bedeutung |
| --- | --- |
| `streaming` | Antworten können als Server-Sent Events gestreamt werden. **MUSS** in 1.0 `true` sein. |
| `tasks` | Asynchrone Aufgaben sind verfügbar. **MUSS** in 1.0 `true` sein. |
| `event_resume` | Ereignisströme von Aufgaben können abonniert und fortgesetzt werden (`GET /lmsp/v1/tasks/{task_id}/events`). |
| `conversations` | Der Dienst speichert Antworten, sodass `store` und `previous_response_id` funktionieren und `GET /lmsp/v1/responses/{response_id}` verfügbar ist. |
| `model_management` | Modelle können explizit geladen und entladen werden. |

## 3.4 Verhalten des Clients {#client-behavior}

Ein Client:

- **SOLLTE** die höchste Version aus `versions` wählen, die er ebenfalls unterstützt.
- **SOLLTE** aus `interfaces` die LMSP- oder die OpenAI-Schnittstelle wählen, je nachdem, was er sprechen kann.
- **MUSS** nur die Fähigkeiten verwenden, die die Beschreibung deklariert. Ein fehlender Schalter bedeutet `false`.
- **MUSS** Erweiterungsfelder ignorieren, die er nicht kennt.
- **SOLLTE** die Dienstbeschreibung regelmäßig und bei einer fehlgeschlagenen Anfrage erneut lesen, statt sie ewig zwischenzuspeichern.
- **SOLLTE** sich einen gewählten Dienst anhand von `service.id` merken und nicht anhand seiner Adresse, weil sich Adressen ändern können.
