diff --git a/docs/end-users/mcp-quickstart.md b/docs/end-users/mcp-quickstart.md index 16c55129d..a846427b2 100644 --- a/docs/end-users/mcp-quickstart.md +++ b/docs/end-users/mcp-quickstart.md @@ -186,7 +186,7 @@ For builds that accept a pre-registered client, bridge through `mcp-remote`: "command": "npx", "args": [ "-y", "mcp-remote", "/mcp-auth/api", - "--static-oauth-client-info", "{\"client_id\":\"sb-tutorials-prod!t676072\"}", + "--static-oauth-client-info", "{\"client_id\":\"0b1e8b56-5f5d-4ebf-a9e9-28aae2964236\"}", "--host", "localhost" ] } @@ -194,20 +194,23 @@ For builds that accept a pre-registered client, bridge through `mcp-remote`: } ``` -> **The `client_id` is environment-specific — match it to your ``:** +> **The `client_id` is the same on all environments — the IAS `tutorials-identity` client:** > > | Environment | `` | `client_id` | > | --- | --- | --- | -> | **Production** | `https://developers.sap.com` | `sb-tutorials-prod!t676072` | +> | **Production** | `https://developers.sap.com` | `0b1e8b56-5f5d-4ebf-a9e9-28aae2964236` | > | **Dev** | your dev route | `0b1e8b56-5f5d-4ebf-a9e9-28aae2964236` | > -> **Dev** now authenticates against **IAS** (a public OIDC client — authorization_code -> + PKCE S256, no secret), so the dev `client_id` is the IAS `tutorials-identity` -> client UUID, not an XSUAA `sb-…` id. **Production still uses XSUAA** (`sb-tutorials-prod!…`) -> until it is migrated. The `client_id` is environment-specific — using the wrong one -> against a `` fails at the authorize endpoint. If the dev `tutorials-identity` -> instance is recreated, this UUID changes — read it from -> `cf service-key tutorials-identity ` and update this row. +> Both environments now authenticate against **IAS** (a public OIDC client — +> authorization_code + PKCE S256, no secret). DEV and PROD share **one** IAS tenant +> (`atxgsg7zi`) and **one** `tutorials-identity` app, with both approuter hosts +> registered as redirect URIs — so there is a **single** client UUID for both. The old +> XSUAA ids (`sb-tutorials-prod!…`, `sb-tutorials!…`) are **retired**: since +> `MCP_ISSUER_KIND: ias` landed in both mtaexts (#2593), discovery advertises IAS, and +> IAS rejects an XSUAA `sb-…` id at the authorize endpoint ("client_id … must match the +> configuration") before PKCE is even checked. If the `tutorials-identity` instance is +> recreated, this UUID changes — read it from the IAS admin console (tenant `atxgsg7zi`, +> app `tutorials-identity` → OpenID Connect Configuration) and update both rows. On first connection `mcp-remote` opens a browser tab for consent (PKCE, no client secret required). The endpoints are discovered automatically from `/.well-known/oauth-authorization-server`; you supply only the `client_id`. After approval, the token is cached and refreshed silently. @@ -252,7 +255,7 @@ npm install -g mcp-remote "command": "npx", "args": [ "-y", "mcp-remote", "/mcp-auth/api", - "--static-oauth-client-info", "{\"client_id\":\"sb-tutorials-prod!t676072\"}", + "--static-oauth-client-info", "{\"client_id\":\"0b1e8b56-5f5d-4ebf-a9e9-28aae2964236\"}", "--host", "localhost" ] } @@ -260,12 +263,13 @@ npm install -g mcp-remote } ``` -`sb-tutorials-prod!t676072` is the **XSUAA-generated public client** for the production -`tutorials-prod` application (XSUAA auto-creates exactly one `sb-!` -client per instance — there is no separately-named MCP client). **This id is -environment-specific** — dev's client is `sb-tutorials!t676072` (see the table above). To -confirm the current id for your environment, read the bound credentials: -`cf env tutorials-prod-srv` (prod) or `cf env tutorials-srv` (dev) → `VCAP_SERVICES.xsuaa[0].credentials.clientid`. +`0b1e8b56-5f5d-4ebf-a9e9-28aae2964236` is the **IAS public OIDC client** (`tutorials-identity` +app in the shared IAS tenant `atxgsg7zi`) — a public PKCE client with no secret. The SAME id +serves both DEV and PROD: they share one subaccount, one IAS tenant, and one `tutorials-identity` +app, with each approuter host registered as a redirect URI. The retired XSUAA ids +(`sb-tutorials-prod!…`, `sb-tutorials!…`) no longer work — IAS rejects them at the authorize +endpoint. To confirm the current id, read it from the IAS admin console (tenant `atxgsg7zi`, app +`tutorials-identity` → OpenID Connect Configuration name). The flow uses PKCE with no client secret. On first run, `mcp-remote` opens your browser for the SAP universal-ID consent flow; after approval the token is cached in `~/.mcp-auth/` and refreshed silently. The server advertises its endpoints at `/.well-known/oauth-authorization-server`,