FinalStandards Track
| Field | Value |
|---|---|
| SEP | 1036 |
| Title | URL Mode Elicitation for secure out-of-band interactions |
| Status | Final |
| Type | Standards Track |
| Created | 2025-07-22 |
| Author(s) | Nate Barbettini (@nbarbettini) and Wils Dawson (@wdawson) |
| Sponsor | None |
| PR | #1036 |
Abstract
This SEP introduces a newurl mode for the existing elicitation client capability, enabling secure out-of-band interactions that bypass the MCP client. URL mode elicitation addresses sensitive use cases that form mode elicitation cannot, such as gathering sensitive credentials, performing OAuth flows for external (3rd-party) authorization, and handling payments, without exposing sensitive data to the MCP client. By directing users to trusted URLs in their browser, this mode maintains security boundaries while enabling rich integrations with third-party services.
Motivation
The current MCP specification (2025-06-18) provides an elicitation mechanism for gathering non-sensitive information from users through structured, in-band requests (most commonly imagined as the MCP client rendering a form to collect data from the end-user). However, several critical use cases require interactions that must not pass through the MCP client:- Sensitive data collection: API keys, passwords, and other credentials must never transit through intermediary systems.
- External authorization: MCP servers often need to access third-party APIs on behalf of users. The MCP authorization specification only covers client-to-server authorization, not server-to-third-party authorization. The Security Best Practices document explicitly forbids token passthrough, requiring a secure mechanism for external (3rd-party) OAuth flows. This was a particularly important motivating factor emerging from discussions in #234 and #284.
- Payment and Subscription Flows: Financial transactions require PCI compliance and secure payment processing that cannot be achieved through in-band data collection.
Specification
Overview
Elicitation is updated to support two modes:- Form mode (in-band): Servers can request structured data from users with optional JSON schemas to validate responses (no change here, other than adding a name to the existing capability)
- URL mode (out-of-band): Servers can direct users to external URLs for sensitive interactions that must not pass through the MCP client
Capabilities
Clients that support elicitation MUST declare theelicitation capability during initialization:
form mode only:
elicitation capability MUST support at least one mode (form or url).
Form Elicitation Requests
The only change from the existing specification is the addition of amode field in the elicitation/create request:
URL Elicitation Requests
URL elicitation requests MUST specifymode: "url" and include these parameters:
| Name | Type | Description |
|---|---|---|
url | string | The URL that the user should navigate to. |
elicitationId | string | A unique identifier for the elicitation. |
message | string | A human-readable message explaining why the interaction is needed. |
Example: OAuth Authorization Flow
Response Actions
URL elicitation responses use the same three-action model as form elicitation:action: "accept" indicates that the user has consented to the interaction. The interaction occurs out of band and the client is not aware of the outcome unless the server sends a completion notification.
Completion Notifications
Servers SHOULD send anotifications/elicitation/complete notification when an
out-of-band interaction started by URL mode elicitation is completed. This allows clients to react programmatically if appropriate.
- The notification MUST only be sent to the client that initiated the elicitation request.
- The notification MUST include the
elicitationIdestablished in the originalelicitation/createrequest. - Clients MUST ignore notifications referencing unknown or already-completed IDs.
- If a completion notification never arrives, clients SHOULD provide a manual way for the user to continue the interaction.
URL Elicitation Required Error
When a request cannot be processed until an elicitation is completed, the server MAY return aURLElicitationRequiredError (code -32042) to indicate that a URL mode elicitation is required. The server MUST NOT return this error except when URL mode elicitation is required by the user interaction.
elicitationId.
Returning a URLElicitationRequiredError is equivalent to sending an elicitation/create request. The server may return an error (instead of sending a separate elicitation/create request) as an affordance to the client to make it clear that a particular elicitation is directly related to a failed client request.
The client must treat URLElicitationRequiredError responses as equivalent to elicitation/create requests. Clients may automatically retry the failed request after the elicitation is completed successfully, for example after receiving a completion notification.
Rationale
Design Decisions
Why extend elicitation instead of creating a new mechanism? Initially, we considered creating a separate mechanism for out-of-band interactions (discussed in #475). However, after discussions with the MCP maintainers, we decided to extend the existing elicitation specification because:- Both mechanisms serve the same fundamental purpose: gathering information from users
- Having two similar-but-separate mechanisms for the same purpose is confusing and error-prone
- The
modeparameter cleanly separates the two interaction patterns
- If the MCP client obtains user tokens from a third-party authorization server, the MCP server becomes a token passthrough server, which is explicitly forbidden.
- Similarly, for payment-type flows, the MCP client would need to perform PCI-compliant payment processing, which is not a desired requirement for MCP clients.
url field of a URL mode elicitation request, client implementers can implement UX patterns that are consistent with the security model. For example, a client could refuse to render a URL as a clickable hyperlink in a form mode elicitation request, reducing the likelihood of a user clicking on a malicious URL sent by a malicious server.
Alternative Approaches Considered
- Token Passthrough: Simply passing the MCP client’s token to external services was rejected due to security concerns documented in the Security Best Practices. Having the MCP client obtain additional tokens and passing those to the MCP server was rejected for the same reason.
- OAuth-specific Capability: Creating a capability specific to external (3rd-party) authorization with OAuth was considered, but rejected in favor of the more general URL mode elicitation approach that supports multiple use cases.
Community Feedback
This proposal incorporates extensive community feedback from discussions in #475, #234, and #284, as well as the #auth-wg working group on Discord. The community identified the need for:- Secure credential collection without client exposure
- External authorization patterns separate from MCP authorization
- Payment and subscription flow support
- Clear security boundaries and trust models
Backward Compatibility
This SEP introduces the following breaking changes:-
Capability Declaration: Clients must now specify which elicitation modes they support:
Previously, clients only declared
"elicitation": {}without mode specification. -
Mode Parameter: All
elicitation/createrequests must now include amodeparameter ("form"or"url").
Migration Path
To ease migration:- Servers SHOULD check client capabilities before sending mode-specific requests
- Clients MAY initially support only form mode to maintain compatibility
- Existing form elicitation implementations continue to work with the addition of the mode parameter
Reference Implementation
Client/server implementation in TypeScript: feat/url-elicitation Explainer video: https://drive.google.com/file/d/1llCFS9wmkK_RUgi5B-zHfUUgy-CNb0n0/view?usp=sharingSecurity Implications
This SEP introduces several security considerations:URL Security Requirements
- SSRF Prevention: Clients must validate URLs to prevent Server-Side Request Forgery attacks
- Protocol Restrictions: Only HTTPS URLs are allowed for URL elicitation
- Domain Validation: Clients must clearly display target domains to users
Trust Boundaries
URL elicitation explicitly creates clear trust boundaries:- The MCP client never sees sensitive data obtained by the MCP server via URL elicitation
- The MCP server must independently verify user identity
- Third-party services interact directly with users through secure browser contexts
Identity Verification
Servers must verify that the user completing a URL elicitation is the same user who initiated the request. Verifying the identity of the user must not rely on untrusted input (e.g. user input) from the client.Implementation Requirements
-
Clients must:
- Use secure browser contexts that prevent inspection of user inputs
- Validate URLs for SSRF protection
- Obtain explicit user consent before opening URLs
- Clearly display target domains
-
Servers must:
- Bind elicitation state to authenticated user sessions
- Verify user identity at the beginning and end of a URL elicitation flow
- Implement appropriate rate limiting
-
Both parties should:
- Log security events for audit purposes
- Implement timeout mechanisms for elicitation requests
- Provide clear error messages for security failures
Relationship to Existing Security Measures
This proposal builds upon and complements existing MCP security measures:- Works within the existing MCP authorization framework (MCP authorization is not affected by this proposal)
- Follows Security Best Practices regarding token handling
- Maintains separation of concerns between client-server and server-third-party authorization