# OAuth für MCP-Kunden

> Wie MCP-Kunden die TradeCatalog-MCP-Server mit OAuth 2.1 entdecken, registrieren und Token erhalten.

Diese Seite ist für Personen gedacht, die einen MCP-Client erstellen oder eine Verbindung debuggen. Wenn Sie nur Claude oder ChatGPT verbinden möchten, lesen Sie [Eine AI-App verbinden](/docs/mcp).

TradeCatalog folgt dem [MCP-Autorisierungsspezifikation](https://modelcontextprotocol.io/specification/latest/basic/authorization): OAuth 2.1 mit PKCE, geschützte Ressourcen-Metadaten (RFC 9728) und Autorisierungsserver-Metadaten (RFC 8414).

## Endpunkte

| Was                                 | URL                                                                 |
| ----------------------------------- | ------------------------------------------------------------------- |
| MCP-Server (geschützter Ressource)  | `https://tradecatalog.app/mcp`                                      |
| Metadaten der geschützten Ressource | `https://tradecatalog.app/.well-known/oauth-protected-resource/mcp` |
| Metadaten des Autorisierungsservers | `https://tradecatalog.app/.well-known/oauth-authorization-server`   |
| Autorisierungsendpunkt              | `https://tradecatalog.app/oauth/authorize`                          |
| Token-Endpunkt                      | `https://tradecatalog.app/oauth/token`                              |
| Dynamische Client-Registrierung     | `https://tradecatalog.app/oauth/register`                           |
| Verbundene Apps (für Personen)      | `https://tradecatalog.app/oauth/connections`                        |

Die Metadaten der geschützten Ressource befinden sich unter der pfadbezogenen Adresse für `/mcp`, wie in RFC 9728 für eine Ressource mit einem Pfad beschrieben. Es gibt bewusst nichts bei `/.well-known/oauth-protected-resource` allein.

Die optionale `/mcp/account`-Verbindung fügt eine eigentümerfreundliche sichere Abrechnungshandover für Agenten-Hosts hinzu, die Software-Abonnementsabrechnung erlauben. Es handelt sich um eine Nachfahrin der gleichen `/mcp`-geschützten Ressource: verwenden Sie die Metadaten oben und `resource=https://tradecatalog.app/mcp` bei der Autorisierung oder bei der Anforderung von Tokens. Registrierung, OAuth-Einwilligung und Arbeitsbereichszugriff verwenden dasselbe Konto. ChatGPT-Plugins verbinden sich mit `/mcp`; siehe [Registrierung und Abrechnung](/docs/mcp#sign-up-and-pay-with-an-agent).

## Bereich

Fordern Sie `tradecatalog:read` für Abfragen an. Fordern Sie `tradecatalog:read tradecatalog:write` an, um auch Änderungen vorzubereiten. Die Einwilligungsseite beschreibt den angeforderten Zugriff. Bestehende schreibgeschützte Berechtigungen erhalten niemals automatisch Schreibzugriff. Rollen und Abrechnungseinschränkungen werden bei der Vorschlag- und Genehmigungsaktion erneut überprüft. Konsequente Schreibvorgänge erfordern eine separate Einmalbestätigung im Chatkarten, oder auf der angemeldeten Überprüfungsseite für Clients ohne Karten; siehe [Tools](/docs/mcp/tools).

## Entdeckungsfluss

1. Der Client ruft `https://tradecatalog.app/mcp` ohne Token auf.
2. Der Server antwortet mit `401 Unauthorized` und einem `WWW-Authenticate: Bearer`-Header, der auf die Metadaten der geschützten Ressource verweist.
3. Der Client liest die Metadaten der geschützten Ressource, um den Autorisierungsserver und `https://tradecatalog.app` zu finden.
4. Der Client liest die Metadaten des Autorisierungsservers für die oben genannten Endpunkte.

```bash
curl https://tradecatalog.app/.well-known/oauth-protected-resource/mcp
```

```json
{
  "resource": "https://tradecatalog.app/mcp",
  "authorization_servers": ["https://tradecatalog.app"],
  "scopes_supported": ["tradecatalog:read", "tradecatalog:write"],
  "bearer_methods_supported": ["header"],
  "resource_name": "TradeCatalog MCP server"
}
```

## Client-Registrierung

Verwenden Sie entweder:

- **Client-ID-Metadokumente** (vorzuziehen): verwenden Sie eine `https`-URL, die Sie kontrollieren, als Ihre `client_id`, die die Metadaten Ihres Clients bereitstellt. Die Personen, die die Verbindung genehmigen, sehen die Host-Adresse dieser URL als Veröffentlicher.
- **Dynamische Client-Registrierung** (RFC 7591) unter `/oauth/register`.

Jeder kann einen Client unter jedem Namen registrieren, daher zeigt die Genehmigungsseite, wohin die Genehmigung gesendet wird (der Umleitungs-Host) und, bei URL-Client-IDs, den Veröffentlicher. Der Name allein wird als nicht verifiziert markiert.

## Autorisierung

Verwenden Sie den Autorisierungscode-Fluss mit **PKCE (`S256`)**:

1. Senden Sie den Browser der Person an `/oauth/authorize` mit `response_type=code`, `client_id`, `redirect_uri`, `code_challenge`, `code_challenge_method=S256`, `state` und `scope=tradecatalog:read`.
2. Wenn sie nicht angemeldet sind, bittet TradeCatalog sie, sich mit einem E-Mail-Code (oder Google oder Microsoft, falls aktiviert) anzumelden, und bringt sie dann zurück.
3. Sie sehen, welche App fragt, das Konto, unter dem sie angemeldet sind, und was sie tun kann, und wählen dann **Erlauben** oder **Ablehnen**.
4. **Erlauben** leitet zu Ihrem `redirect_uri` mit `code` und `state` weiter. **Ablehnen** leitet mit `error=access_denied` weiter.
5. Tauschen Sie den Code an `/oauth/token` mit Ihrem `code_verifier`. Sie erhalten ein Zugriffstoken und ein Refresh-Token.

Senden Sie das Zugriffstoken bei jedem MCP-Antrag:

```http
POST /mcp HTTP/1.1
Host: tradecatalog.app
Authorization: Bearer <access token>
Content-Type: application/json
Accept: application/json, text/event-stream
```

Zugriffstoken sind kurzlebig. Verwenden Sie das Refresh-Token an `/oauth/token`, um ein neues zu erhalten.

## Wer kann genehmigen

- Jeder angemeldete TradeCatalog-Benutzer: Lieferantenteam oder Käufer.
- Nicht Demo-Besucher (Gast-Sitzungen). Sie werden angewiesen, sich ordnungsgemäß anzumelden.
- Es gibt keinen Weg, ein Konto über diesen Fluss zu erstellen, und es gibt keinen maschinennur (Client-Credentials)-Zugriff. Für Server-zu-Server-Zugriff verwenden Sie die [REST API](/docs/api) mit einem API-Schlüssel.

Die Berechtigung trägt nur die Identität der Person. Jeder Werkzeugaufruf überprüft erneut, was sie sehen kann, sodass, wenn sie den Zugriff auf einen Arbeitsbereich verliert, auch die KI-App ihn verliert.

## Transport

Der Server ist **zustandslos** Streamable HTTP. Er gibt keine Sitzungs-IDs aus; jeder Antrag steht allein, und er antwortet mit JSON anstelle eines Ereignisstroms.

## Widerrufen

Personen sehen und trennen genehmigte Apps unter `/oauth/connections`. Trennen widerruft die Berechtigung und ihre Tokens sofort.

## Auch veröffentlicht

- [`/auth.md`](/auth.md): eine kurze Zusammenfassung dieser Seite für Agenten.
- [`/.well-known/mcp/server-card.json`](/.well-known/mcp/server-card.json): der MCP-Server-Karte mit der Werkzeugliste.
