Skip to content

docs: add use_idp_credentials to token_exchange config, make client_id optional when set, and document Entra ID requirement with updated prerequisites and gotchas - #6069

Merged
akshaydeo merged 1 commit into
devfrom
08-11-docs_mcp_token_exhcange_doc_updates
Aug 11, 2026
Merged

Conversation

@Pratham-Mishra04

Copy link
Copy Markdown
Collaborator

Summary

Adds use_idp_credentials to the token_exchange auth type, allowing the token exchange to run as the SSO login application itself rather than a separately registered dedicated exchange application. This is required for Microsoft Entra ID, whose on-behalf-of grant enforces that the assertion's audience matches the exchanging application — a structural constraint that makes a dedicated exchange application impossible to use with Entra.

Changes

  • Added use_idp_credentials: boolean (default false) to MCPTokenExchangeConfig across the config schema, OpenAPI spec, and management YAML schema. When true, client_id and client_secret are ignored and the exchange uses the SSO login application's credentials instead.
  • client_id is no longer unconditionally required — the schema now enforces it conditionally: required unless use_idp_credentials: true is set.
  • authorization_server_url was added to the transport config schema where it was previously missing.
  • Updated the token exchange documentation to explain the two exchange application modes, why Entra structurally requires use_idp_credentials: true (with a citation to Microsoft's own OBO reference), and how RFC 8693 providers differ from Entra's pre-standard OBO grant.
  • Reorganized the Microsoft Entra ID known-gotchas list to lead with setting use_idp_credentials: true as step 1, since without it no other Entra troubleshooting step is relevant.
  • Updated the UI setup instructions to reflect the new Exchange application selector (Dedicated vs. Identity provider application) and the conditional display of client ID/secret fields.
  • Added a use_idp_credentials: false field to the reference API response example for completeness.

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Chore/CI

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • Plugins
  • UI (React)
  • Docs

How to test

Configure an MCP client with auth_type: token_exchange against a Microsoft Entra ID tenant:

"token_exchange": {
  "audience": "<entra-resource-app-client-id>",
  "use_idp_credentials": true
}
  1. Verify the client reaches pending_verification state without a schema validation error (previously would have failed requiring client_id).
  2. Click Verify as me — the exchange should succeed and the client move to verified.
  3. Confirm that omitting both use_idp_credentials: true and client_id still fails schema validation.
  4. Confirm that a non-Entra provider (Okta, Auth0) still works with use_idp_credentials: false and an explicit client_id.

Breaking changes

  • Yes
  • No

client_id is no longer required at the schema level when use_idp_credentials: true is set. Existing configs that supply client_id are unaffected. No previously valid configuration becomes invalid.

Security considerations

use_idp_credentials: true causes the exchange to use the SSO login application's own credentials, which are shared across all MCP clients configured this way. This is intentional and required for Entra, but means a misconfigured audience could result in tokens being minted for unintended resources using the SSO application's grant. The per-client audience field remains the scope boundary. client_id and client_secret continue to be redacted in API responses and support env.VAR_NAME/vault.path references.

Checklist

  • I read docs/contributing/README.md and followed the guidelines
  • I added/updated tests where appropriate
  • I updated documentation where needed
  • I verified builds succeed (Go and UI)
  • I verified the CI pipeline passes locally if applicable

@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Token exchange can now use SSO identity-provider credentials instead of a separate exchange application.
    • Added an optional authorization server URL override.
    • Configuration validation supports conditional client credential requirements, with separate credentials ignored when SSO credentials are enabled.
  • Documentation

    • Updated setup guides, configuration references, API schemas, examples, and troubleshooting guidance, including Microsoft Entra ID requirements.

Walkthrough

The token exchange configuration now supports SSO identity-provider credentials. Schemas, OpenAPI definitions, validation rules, and Microsoft Entra ID documentation describe conditional use of client_id and client_secret.

Changes

Token exchange SSO support

Layer / File(s) Summary
Configuration schema contracts
transports/config.schema.json, docs/openapi/schemas/management/mcp.yaml
Token exchange schemas add use_idp_credentials and conditional client_id validation. The transport schema also adds authorization_server_url.
OpenAPI schema synchronization
docs/openapi/openapi.json
Five token exchange definitions require only audience, add use_idp_credentials, and document conditional client credential handling.
Token exchange documentation
docs/mcp/auth/token-exchange.mdx, docs/deployment-guides/config-json/schema-reference.mdx
Guides document SSO setup, Microsoft Entra ID requirements, troubleshooting, examples, defaults, and field behavior.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: akshaydeo, danpiths, bearts

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly and specifically summarizes the primary configuration and documentation changes.
Description check ✅ Passed The description covers the purpose, changes, testing steps, impact, security considerations, and checklist; omitted sections are not critical for this documentation-focused PR.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 08-11-docs_mcp_token_exhcange_doc_updates

Comment @coderabbitai help to get the list of available commands.

@coderabbitai
coderabbitai Bot requested a review from BearTS August 11, 2026 14:41

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/mcp/auth/token-exchange.mdx`:
- Around line 99-100: Update the token-exchange documentation wording so
Exchange Client ID is required when Dedicated application is selected, while
only Exchange Client Secret remains optional for public clients. Align the
guidance with transports/config.schema.json: client_id is required unless
use_idp_credentials is true.

In `@docs/openapi/openapi.json`:
- Around line 43557-43576: Update all eight token_exchange schema sites in
docs/openapi/openapi.json at lines 43557-43576, 43413, 43673, 43933,
43817-43836, 44077-44096, 44328-44347, and 93041-93060 to include the
conditional allOf requirement from transports/config.schema.json, requiring
client_id unless use_idp_credentials is true. Preserve audience,
authorization_server_url, and the existing properties and descriptions.

In `@docs/openapi/schemas/management/mcp.yaml`:
- Around line 19-49: Update the MCPTokenExchangeConfig schema to match the
token-exchange validation contract: reject configurations missing client_id
unless use_idp_credentials is true, and reject unknown properties by preserving
additionalProperties: false. Use the corresponding transports/config.schema.json
rules as the source of truth while retaining the documented field definitions.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: db0d4c8f-87d8-448b-a9ec-c07f1b5f1fb2

📥 Commits

Reviewing files that changed from the base of the PR and between 60cb165 and 4b35e05.

📒 Files selected for processing (5)
  • docs/deployment-guides/config-json/schema-reference.mdx
  • docs/mcp/auth/token-exchange.mdx
  • docs/openapi/openapi.json
  • docs/openapi/schemas/management/mcp.yaml
  • transports/config.schema.json

Comment thread docs/mcp/auth/token-exchange.mdx Outdated
Comment thread docs/openapi/openapi.json
Comment thread docs/openapi/schemas/management/mcp.yaml
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 08-11-docs_mcp_token_exhcange_doc_updates branch from 4b35e05 to 6a3e49b Compare August 11, 2026 15:08
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 08-11-feat_use_idp_creds_option_in_token_exchange_mcp branch from 60cb165 to a29fdaf Compare August 11, 2026 15:08
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 08-11-docs_mcp_token_exhcange_doc_updates branch from 6a3e49b to fc9527e Compare August 11, 2026 15:09
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 08-11-feat_use_idp_creds_option_in_token_exchange_mcp branch from a29fdaf to 5debb13 Compare August 11, 2026 15:09
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 11, 2026
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 08-11-feat_use_idp_creds_option_in_token_exchange_mcp branch from 5debb13 to d9e9d2c Compare August 11, 2026 15:38
@Pratham-Mishra04
Pratham-Mishra04 force-pushed the 08-11-docs_mcp_token_exhcange_doc_updates branch from fc9527e to c723ae9 Compare August 11, 2026 15:38

akshaydeo commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Merge activity

  • Aug 11, 4:47 PM UTC: A user started a stack merge that includes this pull request via Graphite.
  • Aug 11, 4:51 PM UTC: Graphite rebased this pull request as part of a merge.
  • Aug 11, 4:52 PM UTC: @akshaydeo merged this pull request with Graphite.

@akshaydeo
akshaydeo changed the base branch from 08-11-feat_use_idp_creds_option_in_token_exchange_mcp to graphite-base/6069 August 11, 2026 16:49
@akshaydeo
akshaydeo changed the base branch from graphite-base/6069 to dev August 11, 2026 16:50
@akshaydeo
akshaydeo dismissed coderabbitai[bot]’s stale review August 11, 2026 16:50

The base branch was changed.

@akshaydeo
akshaydeo force-pushed the 08-11-docs_mcp_token_exhcange_doc_updates branch from c723ae9 to 57625af Compare August 11, 2026 16:50
@akshaydeo
akshaydeo merged commit 80b5c75 into dev Aug 11, 2026
14 checks passed
@akshaydeo
akshaydeo deleted the 08-11-docs_mcp_token_exhcange_doc_updates branch August 11, 2026 16:52
akshaydeo pushed a commit that referenced this pull request Aug 13, 2026
…ent_id` optional when set, and document Entra ID requirement with updated prerequisites and gotchas (#6069)

## Summary

Adds `use_idp_credentials` to the `token_exchange` auth type, allowing the token exchange to run as the SSO login application itself rather than a separately registered dedicated exchange application. This is required for Microsoft Entra ID, whose on-behalf-of grant enforces that the assertion's audience matches the exchanging application — a structural constraint that makes a dedicated exchange application impossible to use with Entra.

## Changes

- Added `use_idp_credentials: boolean` (default `false`) to `MCPTokenExchangeConfig` across the config schema, OpenAPI spec, and management YAML schema. When `true`, `client_id` and `client_secret` are ignored and the exchange uses the SSO login application's credentials instead.
- `client_id` is no longer unconditionally required — the schema now enforces it conditionally: required unless `use_idp_credentials: true` is set.
- `authorization_server_url` was added to the transport config schema where it was previously missing.
- Updated the token exchange documentation to explain the two exchange application modes, why Entra structurally requires `use_idp_credentials: true` (with a citation to Microsoft's own OBO reference), and how RFC 8693 providers differ from Entra's pre-standard OBO grant.
- Reorganized the Microsoft Entra ID known-gotchas list to lead with setting `use_idp_credentials: true` as step 1, since without it no other Entra troubleshooting step is relevant.
- Updated the UI setup instructions to reflect the new **Exchange application** selector (Dedicated vs. Identity provider application) and the conditional display of client ID/secret fields.
- Added a `use_idp_credentials: false` field to the reference API response example for completeness.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Configure an MCP client with `auth_type: token_exchange` against a Microsoft Entra ID tenant:

```json
"token_exchange": {
  "audience": "<entra-resource-app-client-id>",
  "use_idp_credentials": true
}
```

1. Verify the client reaches `pending_verification` state without a schema validation error (previously would have failed requiring `client_id`).
2. Click **Verify as me** — the exchange should succeed and the client move to `verified`.
3. Confirm that omitting both `use_idp_credentials: true` and `client_id` still fails schema validation.
4. Confirm that a non-Entra provider (Okta, Auth0) still works with `use_idp_credentials: false` and an explicit `client_id`.

## Breaking changes

- [x] Yes
- [ ] No

`client_id` is no longer required at the schema level when `use_idp_credentials: true` is set. Existing configs that supply `client_id` are unaffected. No previously valid configuration becomes invalid.

## Security considerations

`use_idp_credentials: true` causes the exchange to use the SSO login application's own credentials, which are shared across all MCP clients configured this way. This is intentional and required for Entra, but means a misconfigured audience could result in tokens being minted for unintended resources using the SSO application's grant. The per-client `audience` field remains the scope boundary. `client_id` and `client_secret` continue to be redacted in API responses and support `env.VAR_NAME`/`vault.path` references.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akshaydeo pushed a commit that referenced this pull request Aug 13, 2026
…ent_id` optional when set, and document Entra ID requirement with updated prerequisites and gotchas (#6069)

## Summary

Adds `use_idp_credentials` to the `token_exchange` auth type, allowing the token exchange to run as the SSO login application itself rather than a separately registered dedicated exchange application. This is required for Microsoft Entra ID, whose on-behalf-of grant enforces that the assertion's audience matches the exchanging application — a structural constraint that makes a dedicated exchange application impossible to use with Entra.

## Changes

- Added `use_idp_credentials: boolean` (default `false`) to `MCPTokenExchangeConfig` across the config schema, OpenAPI spec, and management YAML schema. When `true`, `client_id` and `client_secret` are ignored and the exchange uses the SSO login application's credentials instead.
- `client_id` is no longer unconditionally required — the schema now enforces it conditionally: required unless `use_idp_credentials: true` is set.
- `authorization_server_url` was added to the transport config schema where it was previously missing.
- Updated the token exchange documentation to explain the two exchange application modes, why Entra structurally requires `use_idp_credentials: true` (with a citation to Microsoft's own OBO reference), and how RFC 8693 providers differ from Entra's pre-standard OBO grant.
- Reorganized the Microsoft Entra ID known-gotchas list to lead with setting `use_idp_credentials: true` as step 1, since without it no other Entra troubleshooting step is relevant.
- Updated the UI setup instructions to reflect the new **Exchange application** selector (Dedicated vs. Identity provider application) and the conditional display of client ID/secret fields.
- Added a `use_idp_credentials: false` field to the reference API response example for completeness.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Configure an MCP client with `auth_type: token_exchange` against a Microsoft Entra ID tenant:

```json
"token_exchange": {
  "audience": "<entra-resource-app-client-id>",
  "use_idp_credentials": true
}
```

1. Verify the client reaches `pending_verification` state without a schema validation error (previously would have failed requiring `client_id`).
2. Click **Verify as me** — the exchange should succeed and the client move to `verified`.
3. Confirm that omitting both `use_idp_credentials: true` and `client_id` still fails schema validation.
4. Confirm that a non-Entra provider (Okta, Auth0) still works with `use_idp_credentials: false` and an explicit `client_id`.

## Breaking changes

- [x] Yes
- [ ] No

`client_id` is no longer required at the schema level when `use_idp_credentials: true` is set. Existing configs that supply `client_id` are unaffected. No previously valid configuration becomes invalid.

## Security considerations

`use_idp_credentials: true` causes the exchange to use the SSO login application's own credentials, which are shared across all MCP clients configured this way. This is intentional and required for Entra, but means a misconfigured audience could result in tokens being minted for unintended resources using the SSO application's grant. The per-client `audience` field remains the scope boundary. `client_id` and `client_secret` continue to be redacted in API responses and support `env.VAR_NAME`/`vault.path` references.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
@akshaydeo akshaydeo mentioned this pull request Aug 13, 2026
akshaydeo added a commit that referenced this pull request Aug 13, 2026
## ✨ Features

- **MCP Per-User OAuth** - MCP clients can hold per-user OAuth
credentials and per-user headers, configurable from `config.json` as
well as the UI, with a documented shared vs per-identity token lookup
contract and VK/Users filters on the OAuth Grants and MCP Auth Sessions
sidebars
- **Token Exchange IDP Credentials** - New `use_idp_credentials` on
`token_exchange` reuses SSO login app credentials for providers that
require it, such as Microsoft Entra ID; `client_id` becomes optional
when it is set (#6068, #6069)
- **Bedrock VPC Endpoints** - AWS Bedrock keys can target VPC endpoints
(#6064)
- **Per-Request Flat-Fee Pricing** - New `cost_per_request` field flows
through datasheet sync, the cost engine, custom overrides and the UI
override form (#6079)
- **Pricing Overrides in the Model Catalog** - `/api/models/details`
exposes resolved pricing overrides, and catalog rows resolve overrides
server-side (#6055, #6056)
- **MCP Tool Discovery Persistence** - Discovered MCP tools persist and
resync uniformly across all client types through a hash-gated core
callback, surviving restarts and propagating across a cluster
- **W3C Trace ID Propagation** - Requests carry a W3C trace ID on the
context (#5945)
- **Cancellable Log Cost Recalculation** - Log cost recalculation tasks
can be cancelled from the backend (#5801)
- **Separate OTEL Metrics Pipeline** - The OTEL collector supports a
metrics tab independent of traces, plus separate headers for traces and
metrics (#5939, #5940)
- **Roots-Only Log Filter** - New `roots_only` filter collapses fallback
chains into their root entry with child aggregates (#5737)
- **MCP Log Redaction and Plugin Logs** - MCP tool logs carry redaction
mappings and plugin logs (#5744, #5746)
- **User Agent and App Attribution in Logs** - Logs and MCP tool logs
record user agent, app, source, decision, app key and device ID
- **S3 Log Export Metadata** - Additional metadata is written alongside
S3 log exports (#6070)
- **Matview Maintenance Off Switch** - `matview_refresh_interval`
accepts `"off"` to disable logstore matview maintenance entirely (thanks
[@jeremym-tanium](https://github.com/jeremym-tanium)!) (#5693)
- **Video Request Info in Logs UI** - Video requests surface their
details in the logs UI (#5946)
- **Shell Rewriter Hook** - The UI handler exposes a `ShellRewriter`
hook for pre-hydration HTML rewriting (#5807)
- **Auth Skip Path** - Adds a context path letting trusted internal
callers bypass auth resolution

## 🐞 Fixed

- **Path Normalization Auth Bypass** - Fixed a path normalization flaw
that allowed auth to be bypassed (#5763)
- **Minimal Reasoning Effort on GPT-5 Models** - `reasoning_effort:
"minimal"` is preserved for GPT-5-family OpenAI models instead of being
downgraded to `low` (thanks [@jitokim](https://github.com/jitokim)!)
(#6046)
- **Gemini Truncated Response Finish Reason** - Truncated Gemini
responses report `MAX_TOKENS` instead of `OTHER` (thanks
[@AdityaPainuli](https://github.com/AdityaPainuli)!) (#5979)
- **Null Tool-Call Function Name on Streaming** - Streaming continuation
deltas no longer materialize an absent tool-call function name as `null`
(thanks [@AdityaPainuli](https://github.com/AdityaPainuli)!) (#5966)
- **Bedrock Document Uploads** - Fixed Bedrock file handling in
inference so office and PDF documents sent as OpenAI `type: "file"` are
accepted (#5947)
- **xAI Usage Cost** - Fixed USD cost ticks for xAI usage (#5950)
- **Anthropic Encrypted Reasoning** - Added an Anthropic error branch
when stripping encrypted reasoning content
- **MCP Reconnect and Lock Ordering** - Broke a lock-order inversion in
`ConnectionCheckerManager`, rebuilt ephemeral clients across the whole
connect+init retry, preserved last-known tool maps across close-first
reconnects, bound connect attempts to entry identity, deduped background
reconnects and gated SSE `OnConnectionLost` on connection identity
- **MCP OAuth Session Correctness** - Restricted `Reauthorize` to shared
OAuth clients, rejected inactive tokens in `ValidateToken`, made the
OAuth flow claim atomic against concurrent reauth, stopped dropping
stored scopes on decode failure, and closed a verify-headers
double-submit race that also dropped TLS, timeout and per-user-header
fields
- **Session Stickiness Reconciliation** - `needs_session_stickiness` is
pinned across `config.json` reconciliation, so an unrelated file edit
can no longer silently revert a client to per-call
- **Credential Cache Cancellation** - `headerCredentialCache.Fill` and
`userTokenCache.Fill` propagate context so a cancelled request unblocks
instead of waiting on an unrelated leader; LRU entries carry a version
so a rejected stale `Get` cannot evict a concurrently-updated value
- **Governance List-Models Call** - Budgets and rate limits no longer
trigger a list-models call (#6051)
- **Realtime Response Create Input** - Guarded `response.create` input
(#6050)
- **HTTP Server Timeouts** - Configured bounded `http.Server` timeouts
and a request-body limit
- **MCP Client State Badges** - State badges render with spaces instead
of underscores, and the state filter bucket was renamed from
`disconnected` to `unstable`
- **Entra OBO Scope** - `offline_access` is combined with
`<audience>/.default` for Entra OBO instead of replacing it (#6078)

## 🔧 Maintenance

- **Governance Route Families** - Editions can override governance route
families (#5839)
- **Dependency Upgrades** - Dependabot updates across all modules, plus
module path fixes (#6040, #5864)
- **Documentation** - config.schema.json doc fixes and Datadog env var
reference fixes in the helm chart docs (#5938, #6019)

## 🗄️ Database Migrations

**configstore:**

- **add_mcp_client_pending_oauth_config_json_column** - Adds
`pending_oauth_config_json` to `config_mcp_clients`. Reversible: drops
the added column.
- **merge_oauth_token_tables** - Consolidates `oauth_tokens` and
`oauth_user_tokens` into `mcp_oauth_tokens`. **Non-reversible**:
rollback deliberately leaves `mcp_oauth_tokens` in place, because every
OAuth read and write targets it from this migration onward and dropping
it would destroy any token created or refreshed since, forcing every
holder to re-authorize.
- **create_mcp_oauth_flows_table** - Creates `mcp_oauth_flows` to track
in-flight OAuth flows. Reversible: drops the new table.
- **drop_oauth_config_pkce_columns** - Drops CSRF state, PKCE verifier
and `expires_at` from the OAuth config table now that they live on
`mcp_oauth_flows`. **Non-reversible**: forward-only, the dropped values
were per-flow ephemeral and re-adding empty columns would restore
nothing.
- **drop_oauth_config_token_id_column** - Drops `token_id`.
**Non-reversible**: forward-only, it was a pure FK shortcut now
reachable via `(oauth_config_id, auth_mode)`.
- **add_mcp_admin_auth_mode_indexes** - Adds admin partial unique
indexes on `mcp_oauth_tokens` and `mcp_per_user_header_credentials`.
Reversible: drops both indexes.
- **add_mcp_client_token_exchange_json_column** - Adds
`token_exchange_json` to `config_mcp_clients`. Reversible: drops the
added column.
- **add_needs_session_stickiness_column** - Adds
`needs_session_stickiness` to `config_mcp_clients`. Reversible: drops
the added column.
- **add_bedrock_endpoints_columns** - Adds Bedrock VPC endpoint columns
to the keys table. Reversible: drops the added columns.
- **add_cost_per_request_pricing_column** - Adds `cost_per_request` to
model pricing. Reversible: drops the added column.

**logstore:**

- **logs_add_guardrail_debug_column** - Adds `guardrail_debug` to logs.
Reversible: drops the added column.
- **mcp_tool_logs_add_redaction_mapping_column** - Adds the redaction
mapping column to MCP tool logs. **Non-reversible**: rollback is a no-op
because dropping the column would permanently destroy reveal data for
already-redacted MCP logs.
- **logs_add_user_agent_column** - Adds user agent and app columns,
their indexes, and a `UserAgentMapping` table. Reversible: drops the
indexes and the mapping table.
- **mcp_tool_logs_add_user_agent_column** - Adds user agent and app
columns plus indexes to MCP tool logs. Reversible: drops both indexes
and the `app` column.
- **mcp_tool_logs_add_endpoint_columns** - Adds `source`, `decision`,
`app_key` and `device_id` to MCP tool logs. Reversible: drops all four
columns.
- **mcp_tool_logs_add_plugin_logs_column** - Adds `plugin_logs` to MCP
tool logs. Reversible: drops the added column.
- **logs_recreate_matviews_with_user_agent_column** and
**logs_recreate_matviews_with_app_column** - Recreate the log
materialized views to include the new columns. Rollback is a no-op
because `ensureMatViews` recreates them on next startup.

<Warning>
**High-throughput deployments: run the logstore migrations during a
low-activity window.**

Every logstore migration above alters `logs` or `mcp_tool_logs`, the two
highest-insert tables in Bifrost, and several also build indexes on
them. On a busy instance the index builds hold locks that block
concurrent log inserts for the duration of the build, and the matview
recreations rebuild against the full table. Schedule the upgrade for a
low-traffic period, or expect elevated log-write latency and possible
request-path backpressure while the migrations run.
</Warning>

<Warning>
`merge_oauth_token_tables`, `drop_oauth_config_pkce_columns` and
`drop_oauth_config_token_id_column` transform or remove existing OAuth
state and cannot be rolled back. Take a database backup before
upgrading, and do not roll the binary back past this release once the
migration has run.
</Warning>

## 🐙 Closed GitHub Issues

- [#123](#123) - Files API
Support
- [#5472](#5472) - [Bug]:
Bedrock rejects office/PDF document uploads via OpenAI `type:"file"` -
"The PDF specified was not valid"
- [#5900](#5900) - [Bug]:
Streaming continuation chunks materialize omitted tool-call metadata as
null
- [#5978](#5978) - [Bug]:
Gemini egress reports truncated responses as FinishReason OTHER,
IncompleteDetails switch matches a string that never occurs
- [#6044](#6044) - [Bug]:
normalizeOpenAIReasoningEffort maps 'minimal' to 'low' for ALL OpenAI
models, even ones that natively support 'minimal'
akshaydeo pushed a commit that referenced this pull request Aug 14, 2026
…ent_id` optional when set, and document Entra ID requirement with updated prerequisites and gotchas (#6069)

## Summary

Adds `use_idp_credentials` to the `token_exchange` auth type, allowing the token exchange to run as the SSO login application itself rather than a separately registered dedicated exchange application. This is required for Microsoft Entra ID, whose on-behalf-of grant enforces that the assertion's audience matches the exchanging application — a structural constraint that makes a dedicated exchange application impossible to use with Entra.

## Changes

- Added `use_idp_credentials: boolean` (default `false`) to `MCPTokenExchangeConfig` across the config schema, OpenAPI spec, and management YAML schema. When `true`, `client_id` and `client_secret` are ignored and the exchange uses the SSO login application's credentials instead.
- `client_id` is no longer unconditionally required — the schema now enforces it conditionally: required unless `use_idp_credentials: true` is set.
- `authorization_server_url` was added to the transport config schema where it was previously missing.
- Updated the token exchange documentation to explain the two exchange application modes, why Entra structurally requires `use_idp_credentials: true` (with a citation to Microsoft's own OBO reference), and how RFC 8693 providers differ from Entra's pre-standard OBO grant.
- Reorganized the Microsoft Entra ID known-gotchas list to lead with setting `use_idp_credentials: true` as step 1, since without it no other Entra troubleshooting step is relevant.
- Updated the UI setup instructions to reflect the new **Exchange application** selector (Dedicated vs. Identity provider application) and the conditional display of client ID/secret fields.
- Added a `use_idp_credentials: false` field to the reference API response example for completeness.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Configure an MCP client with `auth_type: token_exchange` against a Microsoft Entra ID tenant:

```json
"token_exchange": {
  "audience": "<entra-resource-app-client-id>",
  "use_idp_credentials": true
}
```

1. Verify the client reaches `pending_verification` state without a schema validation error (previously would have failed requiring `client_id`).
2. Click **Verify as me** — the exchange should succeed and the client move to `verified`.
3. Confirm that omitting both `use_idp_credentials: true` and `client_id` still fails schema validation.
4. Confirm that a non-Entra provider (Okta, Auth0) still works with `use_idp_credentials: false` and an explicit `client_id`.

## Breaking changes

- [x] Yes
- [ ] No

`client_id` is no longer required at the schema level when `use_idp_credentials: true` is set. Existing configs that supply `client_id` are unaffected. No previously valid configuration becomes invalid.

## Security considerations

`use_idp_credentials: true` causes the exchange to use the SSO login application's own credentials, which are shared across all MCP clients configured this way. This is intentional and required for Entra, but means a misconfigured audience could result in tokens being minted for unintended resources using the SSO application's grant. The per-client `audience` field remains the scope boundary. `client_id` and `client_secret` continue to be redacted in API responses and support `env.VAR_NAME`/`vault.path` references.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
akshaydeo pushed a commit that referenced this pull request Aug 19, 2026
…ent_id` optional when set, and document Entra ID requirement with updated prerequisites and gotchas (#6069)

## Summary

Adds `use_idp_credentials` to the `token_exchange` auth type, allowing the token exchange to run as the SSO login application itself rather than a separately registered dedicated exchange application. This is required for Microsoft Entra ID, whose on-behalf-of grant enforces that the assertion's audience matches the exchanging application — a structural constraint that makes a dedicated exchange application impossible to use with Entra.

## Changes

- Added `use_idp_credentials: boolean` (default `false`) to `MCPTokenExchangeConfig` across the config schema, OpenAPI spec, and management YAML schema. When `true`, `client_id` and `client_secret` are ignored and the exchange uses the SSO login application's credentials instead.
- `client_id` is no longer unconditionally required — the schema now enforces it conditionally: required unless `use_idp_credentials: true` is set.
- `authorization_server_url` was added to the transport config schema where it was previously missing.
- Updated the token exchange documentation to explain the two exchange application modes, why Entra structurally requires `use_idp_credentials: true` (with a citation to Microsoft's own OBO reference), and how RFC 8693 providers differ from Entra's pre-standard OBO grant.
- Reorganized the Microsoft Entra ID known-gotchas list to lead with setting `use_idp_credentials: true` as step 1, since without it no other Entra troubleshooting step is relevant.
- Updated the UI setup instructions to reflect the new **Exchange application** selector (Dedicated vs. Identity provider application) and the conditional display of client ID/secret fields.
- Added a `use_idp_credentials: false` field to the reference API response example for completeness.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [x] Documentation
- [ ] Chore/CI

## Affected areas

- [ ] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [ ] Plugins
- [ ] UI (React)
- [x] Docs

## How to test

Configure an MCP client with `auth_type: token_exchange` against a Microsoft Entra ID tenant:

```json
"token_exchange": {
  "audience": "<entra-resource-app-client-id>",
  "use_idp_credentials": true
}
```

1. Verify the client reaches `pending_verification` state without a schema validation error (previously would have failed requiring `client_id`).
2. Click **Verify as me** — the exchange should succeed and the client move to `verified`.
3. Confirm that omitting both `use_idp_credentials: true` and `client_id` still fails schema validation.
4. Confirm that a non-Entra provider (Okta, Auth0) still works with `use_idp_credentials: false` and an explicit `client_id`.

## Breaking changes

- [x] Yes
- [ ] No

`client_id` is no longer required at the schema level when `use_idp_credentials: true` is set. Existing configs that supply `client_id` are unaffected. No previously valid configuration becomes invalid.

## Security considerations

`use_idp_credentials: true` causes the exchange to use the SSO login application's own credentials, which are shared across all MCP clients configured this way. This is intentional and required for Entra, but means a misconfigured audience could result in tokens being minted for unintended resources using the SSO application's grant. The per-client `audience` field remains the scope boundary. `client_id` and `client_secret` continue to be redacted in API responses and support `env.VAR_NAME`/`vault.path` references.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [ ] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [ ] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants