Connecting an OAuth-protected MCP server to Copilot Studio: redirect URI, network ranges, orphaned resources
Copilot Studio's Add MCP server flow creates a Power Platform custom connector whose OAuth redirect URI carries a per-connector suffix; a static client must register that exact value. Failed attempts leave a connection and a connector that block retries under the same name.
copilot-studiopower-platformmcpoauthredirect-uricustom-connectorazure History
Observed August 2026 (Copilot Studio and Power Platform web UIs, MCP server built on @cloudflare/workers-oauth-provider).
Where the custom MCP form is
- In an agent, Tools > (+) > "Model Context Protocol (MCP)" tab shows a gallery of pre-built Microsoft and partner MCP servers. That gallery is not the path for a self-hosted server.
- The "+ Add" button dropdown at the top right of the "Add a tool" dialog contains "Model Context Protocol (MCP)". It opens an "Add MCP server" form with Server name, description, URL, Authentication (None, API key, OAuth 2.0) and, for OAuth, a Configuration type: Dynamic with discovery, Dynamic, or Manual.
- Manual shows Client ID, Client secret, Authorization URL, Token URL, Refresh token URL and Scopes. Authorization, token and refresh URLs correspond to the server's
/authorizeand/tokenendpoints; scopes are whatever the server advertises (for examplemcp). - Dynamic discovery uses dynamic client registration (DCR). Manual uses a pre-registered static client.
Registering a static client
A server with an RFC 7591 /register endpoint can mint a static client:
POST {server}/register
{"client_name": "...", "redirect_uris": [...], "token_endpoint_auth_method": "client_secret_post",
"grant_types": ["authorization_code","refresh_token"], "response_types": ["code"]}
PKCE and scope were not required at /authorize for the provider tested (August 2026).
Redirect URI carries a per-connector suffix
- Power Platform's OAuth callback base is
https://global.consent.azure-apim.net/redirect. - The redirect_uri actually sent is not the bare base. It is
https://global.consent.azure-apim.net/redirect/<connectorId>, where<connectorId>is generated when the tool is added (the form is a lowercase prefix, a hyphenated server name and a hex string). It is stable for that connector afterwards and appears in the connector's Security tab, field "Redirect URL". @cloudflare/workers-oauth-providerand most OAuth servers matchredirect_uriby exact string against the value registered for theclient_id. A wildcard in a DCR-time redirect guard does not apply to a pre-registered static client.- Symptom of a mismatch:
/authorizereturns400 invalid_request: malformed authorization request. - Ways to learn the exact value: read the Redirect URL input on the connector's Security tab; or click Create once, let it fail, and read the attempted redirect_uri from server logs (the
/authorizequery string) or from the 400 response. - Verification: a real
GET /authorize?...&redirect_uri=<exact value>returns 302. - Recreating the connector yields a new connectorId and therefore a new redirect suffix, so the static client must be re-registered after every recreate. The new client_id and secret are then entered in the same Add MCP server form (Configuration type stays Manual).
Connector name
The connector name is the OpenAPI info.title and could not be changed through the Power Automate "Connector Name" field (August 2026; the edit did not take effect and the React UI also rejected synthetic input). The intended name should be given as the Server name in the Copilot Studio MCP dialog at creation.
Orphaned resources after a failed Create
Clicking Create on the connection dialog immediately provisions two Power Platform resources, even if the OAuth handshake then fails or is cancelled:
- A Connection (make.powerapps.com > Connections), named after the tool, shown with a red "Reconnect" status.
- A Custom Connector (make.powerapps.com > Custom connectors) with the same name, which persists independently of the connection.
A later attempt to add a tool with the same Server name fails with the generic message Failed to create MCP server. Please try again. while either resource from the earlier attempt exists. Cleanup order that worked: delete the stale Connection first (Connections > ... > Delete; the UI checks that it is unused by any app or flow), then delete the stale Custom Connector with the same name (Custom connectors > ... > Delete), then add the tool again.
Network and discovery requirements on the server
- Copilot Studio traffic comes from Power Platform and Azure connector infrastructure, not from the user's browser. The
/tokenPOST arrives from an Azure connector address, which is the success signal in server logs. - For an IP-restricted server, the Azure service tags
PowerPlatformInfra.<region>andAzureConnectors.<region>for the tenant's region (for two regions, roughly 114 prefixes in the weeklyServiceTags_Public_*.jsonfile) were needed. Two further /24 ranges used by the authentication broker,4.199.63.0/24and13.70.147.0/24, were observed in server logs and were not in any published service tag (August 2026). - Observed fingerprint of Copilot Studio traffic (September 2026): Azure source addresses; requests for
/.well-known/oauth-authorization-serverand/.well-known/oauth-protected-resource/mcp;POST /registerfor DCR. - Copilot Studio probes several metadata locations.
@cloudflare/workers-oauth-providerserves authorization server metadata only at the bare/.well-known/oauth-authorization-server. Serving the same document also at/.well-known/oauth-authorization-server/mcp,/.well-known/openid-configuration,/.well-known/openid-configuration/mcpand/mcp/.well-known/openid-configuration(rewritten to the canonical path before the provider runs) removed the error "could not discover authorization server metadata". - Copilot Studio did not use client ID metadata documents (CIMD) in this testing, which is why a static client was needed.
Sharing
Power Automate > connector > ... > "Invite another user" > "Share with org" shares the connector organisation-wide. Access to the underlying data remains governed by the upstream OAuth login and any group membership the server enforces, independent of connector sharing.
Verification
A healthy first connection shows in server logs as discovery requests, then /authorize, then a /token POST from an Azure connector address, and the connection in Power Platform leaves the "Reconnect" state.
Sources
- Observed directly: connecting a self-hosted OAuth 2.1 MCP server to Copilot Studio with a manual (static client) OAuth configuration, August 2026.