Playground
Run the full agent flow in your browser and inspect every real request.
Checked against the Evaluation environment, Console 0.10.1 / 0.14.1, on October 19, 2026. Release status
The AIGW Playground walks through the whole agent flow one request at a time and shows every exchange in full: URL, headers, payload, status code and response. Use it to see the flow on the wire before you write code, or to check a Resource and Proxy client you just configured.
Open it at https://playground.aigw.eval.loginid.ai/.

What the Playground does
The Playground plays the agent first, then the MCP/UCP service. Press Run step to send the current request, then Next to move on. AIGW errors are shown exactly as returned, and the page never fabricates a token.
What is real and what is mocked
| Component | In the Playground |
|---|---|
| Agent | The Playground page itself |
| Resource MCP (the MCP/UCP service) | Mock, simulated in the browser |
| Resource API (the merchant backend) | Mock, simulated in the browser |
| AIGW discovery, DCR, authorization, token, Proxy token and credential redemption | Real calls to AIGW |
Configure the environment
You need a Token exchange Resource in AIGW. Open the Environment panel in the top-right corner and set these fields:
| Field | Value | Needed for |
|---|---|---|
| AIGW authorization server | The Authorization server from the Resource's Reference screen, for example https://api.aigw.eval.loginid.ai/<RESOURCE_ID>. Also editable on the first step. | All AIGW steps |
| Agent HTTPS callback | Leave blank. It defaults to the Playground's own /oauth/callback path. | DCR and Authorize |
| Resource indicator | The Resource's Resource indicator (audience) | Redeem |
| Resource Auth client ID and secret | A Proxy client from the same Project as the Resource | Proxy auth |
| Resource MCP URL | Leave the mock default | Probe |
Tick Remember to keep the authorization server for next time. Configuration locks once a run starts; press Reset to change it.
Naming
The Playground calls the MCP server's credential a Resource Auth client. In the Console it is a Proxy client.
What each step shows
Probe: the 401 challenge
The agent calls the mock MCP server with no token. It answers 401 with a WWW-Authenticate header whose resource_metadata points to its Protected Resource Metadata.
Discover: Protected Resource Metadata
The agent fetches /.well-known/oauth-protected-resource (RFC 9728). The authorization_servers entry is the per-Resource AIGW authorization server you configured.
Config: OAuth and OIDC discovery
The agent fetches the real /.well-known/openid-configuration from AIGW. It learns the per-Resource authorization endpoint, the core token endpoint, the registration endpoint and the supported scopes, which include the Resource's own scopes.
Register: Dynamic Client Registration
The agent registers at POST /api/register. AIGW returns 201 with a new client_id and client_secret, the domain it derived from the redirect URI, and a verification_method of none, because the Playground doesn't sign requests with Web Bot Auth.
The request deliberately sends no scope. AIGW rejects a registration outright if any requested scope isn't registrable for a dynamic client, so scopes are chosen in the next step.
Authorize: real sign-in with PKCE
Pick which discovered scopes to request, then press Continue to AIGW login. The Playground builds an Authorization Code with PKCE (S256) request to the per-Resource authorization endpoint and sends your browser there.
You sign in on the real AIGW page with the identity providers the Resource allows and approve the consent screen. Back in the Playground, the step shows the 302 redirect with the returned code and state. If authorization is refused right after registration, the agent may be Pending or Rejected under the Project's agent policy.
Token: the real AIGW response
The agent exchanges the code, its client_secret and the PKCE code_verifier at the core token endpoint. The response is the unmodified AIGW result: access_token, id_token, refresh_token and the granted scope. The Playground decodes both JWTs. In the access token, look at these claims:
| Claim | Example | Meaning |
|---|---|---|
iss | https://core.api.aigw.eval.loginid.ai/ | Issued by the core AIGW authorization server |
aud | The Resource indicator | The Resource this token is for |
sub | sub_… | Opaque, per-Project user subject |
ext.acr | …:al2 | How strongly the user was verified |
ext.amr | ["mfa", "kba"] | How the user authenticated |
ext.agent / ext.act | Client ID, domain, name, verifications | Which agent is acting for the user |
ext.project_id | Project ID | The Project the token belongs to |
Personal data
The ID token carries the identity claims the user consented to, such as name, email and address. Treat it as personal data.
Proxy auth: client credentials
Now the Playground plays the MCP server. It authenticates to AIGW with the Proxy client ID and secret (grant_type=client_credentials) and receives a Proxy token.
Redeem: the merchant token
The MCP server calls the credential redemption endpoint with the user's AIGW token and the Proxy token.
POST https://api.aigw.eval.loginid.ai/api/credentials/tokenAuthorization: Bearer <user's AIGW access token>X-Proxy-Token: <Proxy token>Content-Type: application/json{"resource": "<resource indicator>"}AIGW returns the merchant access token it obtained from the merchant's authorization server during sign-in, in access_token, with expires_at and scopes when present. Decode it and you'll see a token issued by the merchant's authorization server (Keycloak in the default Playground Resource), not by AIGW. The full response is in the redemption reference.
Resource call
The MCP server calls the mock Resource API with the merchant token. The flow is complete.
Run it locally
The Playground is a Vite and React app with a small Node API server. Run it with Node.js 22.13 or later. The public repository link is coming soon. Until then, use the hosted Playground.
# Node.js 22.13 or laternpm installnpm run dev# Full login flow: expose the dev server over HTTPS through a Cloudflare tunnelnpm run dev:tunnelOn localhost you can inspect the UI and discovery. The full sign-in flow needs an HTTPS origin, because AIGW registration rejects HTTP callbacks. npm run dev:tunnel exposes the dev server through a Cloudflare tunnel so you get one.
If a step fails
| Symptom | Likely cause | Fix |
|---|---|---|
| Register fails with an HTTPS error | The Playground was opened over HTTP | Use the hosted HTTPS Playground, or run npm run dev:tunnel locally. |
| Authorize is refused | The agent is held or rejected by agent policy | Approve the agent in Console, Agents, or adjust the Project's approval rules. |
Proxy auth returns 401 | Wrong Proxy client ID or secret, or the Proxy client was revoked | Re-enter the values, or generate a new Proxy client. |
| Redeem fails | Proxy client from a different Project, Resource indicator not an exact match, or no merchant token stored because the merchant authorization server rejected AIGW's assertion | Fix the mismatch, then see Keycloak trust and user mapping. |

