# OAuth voor MCP-clients

> Hoe MCP-clients de TradeCatalog MCP-server ontdekken, registreren en tokens verkrijgen met OAuth 2.1.

Deze pagina is bedoeld voor mensen die een MCP-client bouwen of een verbinding debuggen. Als u alleen Claude of ChatGPT wilt verbinden, zie [Verbind een AI-app](/docs/mcp).

TradeCatalog volgt de [MCP-autorisatiespecificatie](https://modelcontextprotocol.io/specification/latest/basic/authorization): OAuth 2.1 met PKCE, beveiligde resource metadata (RFC 9728) en autorisatieserver metadata (RFC 8414).

## Eindpunten

| Wat                            | URL                                                                 |
| ------------------------------ | ------------------------------------------------------------------- |
| MCP-server (beveiligde bron)   | `https://tradecatalog.app/mcp`                                      |
| Beveiligde bron metadata       | `https://tradecatalog.app/.well-known/oauth-protected-resource/mcp` |
| Autorisatieserver metadata     | `https://tradecatalog.app/.well-known/oauth-authorization-server`   |
| Autorisatie-eindpunt           | `https://tradecatalog.app/oauth/authorize`                          |
| Token-eindpunt                 | `https://tradecatalog.app/oauth/token`                              |
| Dynamische clientregistratie   | `https://tradecatalog.app/oauth/register`                           |
| Verbonden apps (voor personen) | `https://tradecatalog.app/oauth/connections`                        |

De beveiligde bronmetadata bevindt zich op het pad-specifieke adres voor `/mcp`, zoals beschreven in RFC 9728 voor een bron met een pad. Er is bewust niets op `/.well-known/oauth-protected-resource` zelf.

De optionele `/mcp/account`-verbinding voegt een eigenaar-alleen veilige factureringsoverdracht toe voor agenthosts die softwareabonnementsfacturering toestaan. Het is een afstammeling van dezelfde `/mcp`-beveiligde bron: gebruik de bovenstaande metadata en `resource=https://tradecatalog.app/mcp` bij het autoriseren of het aanvragen van tokens. Inschrijving, OAuth-toestemming en werkruimte-toegang gebruiken hetzelfde account. ChatGPT-plugins verbinden met `/mcp`; zie [inschrijving en facturering](/docs/mcp#sign-up-and-pay-with-an-agent).

## Bereik

Vraag `tradecatalog:read` aan voor zoekopdrachten. Vraag `tradecatalog:read tradecatalog:write` aan om ook wijzigingen voor te bereiden. De toestemmingspagina beschrijft de aangevraagde toegang. Bestaande alleen-lezen toestemmingen krijgen nooit automatisch schrijftoegang. Rollen en factureringbeperkingen worden opnieuw gecontroleerd bij het voorstellen en goedkeuren van acties. Consequente schrijfbewerkingen vereisen een aparte eenmalige bevestiging in de chatkaart, of de ingelogde beoordelingspagina voor clients zonder kaarten; zie [Tools](/docs/mcp/tools).

## Ontdekkingsstroom

1. De client roept `https://tradecatalog.app/mcp` aan zonder een token.
2. De server antwoordt met `401 Unauthorized` en een `WWW-Authenticate: Bearer`-header die wijst naar de beveiligde bronmetadata.
3. De client leest de beveiligde bronmetadata om de autorisatieserver en `https://tradecatalog.app` te vinden.
4. De client leest de autorisatieservermetadata voor de bovenstaande eindpunten.

```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 registreren

Gebruik een van de volgende opties:

- **Client-ID metadata documenten** (aanbevolen): gebruik een `https`-URL die u beheert als uw `client_id`, die uw clientmetadata levert. Personen die de verbinding goedkeuren zien het hostnaam van deze URL als de uitgever.
- **Dynamische clientregistratie** (RFC 7591) op `/oauth/register`.

Iedereen kan een client registreren onder elke naam, dus de goedkeuringspagina toont wie de goedkeuring stuurt (de omleidingshost) en, voor URL client-ids, de uitgever. De naam alleen wordt als ongeverifieerd gemarkeerd.

## Autorisatie

Gebruik de autorisatiecodeflow met **PKCE (`S256`)**:

1. Stuur de browser van de persoon naar `/oauth/authorize` met `response_type=code`, `client_id`, `redirect_uri`, `code_challenge`, `code_challenge_method=S256`, `state` en `scope=tradecatalog:read`.
2. Als ze niet ingelogd zijn, vraagt TradeCatalog hen om in te loggen met een gemaild code (of Google of Microsoft, waar van toepassing), en brengt ze terug.
3. Ze zien welk app dat vraagt, het account waar ze ingelogd zijn en wat het kan doen, en kiezen dan **Toestaan** of **Weigeren**.
4. **Toestaan** omleidt naar uw `redirect_uri` met `code` en `state`. **Weigeren** omleidt met `error=access_denied`.
5. Wissel de code om op `/oauth/token` met uw `code_verifier`. U krijgt een toegangstoken en een vernieuwings-token.

Stuur het toegangstoken op elke MCP-aanvraag:

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

Toegangstokens zijn tijdelijk. Gebruik het vernieuwings-token op `/oauth/token` om er een nieuw te verkrijgen.

## Wie kan goedkeuren

- Elke ingelogde TradeCatalog-gebruiker: leverancierspersoneel of kopers.
- Niet demo-bezoekers (gast-sessies). Ze worden naar het inloggen gestuurd.
- Er is geen manier om een account aan te maken via deze stroom, en er is geen machine-only (client credentials) toegang. Voor server-tot-server toegang, gebruik de [REST API](/docs/api) met een API-sleutel.

Het verlenen draagt alleen de identiteit van de persoon. Elke toolaanroep controleert opnieuw wat ze kunnen zien, dus als ze toegang verliezen tot een werkruimte, verliest de AI-app dat ook.

## Transport

De server is **stateless** Streamable HTTP. Het geeft geen sessie-ids uit; elke aanvraag staat los, en het antwoordt met JSON in plaats van een gebeurtenisstroom.

## Invalideren

Personen zien en verbreken goedgekeurde apps op `/oauth/connections`. Het verbreken invalideert de toestemming en de tokens direct.

## Ook gepubliceerd

- [`/auth.md`](/auth.md): een korte samenvatting van deze pagina voor agents.
- [`/.well-known/mcp/server-card.json`](/.well-known/mcp/server-card.json): de MCP-serverkaart met de toollijst.
