Summary
Vercel MCP connections created through Executor initially work, but later become Expired because the OAuth flow does not request Vercel's offline_access lifecycle scope and therefore stores no refresh token.
Environment
- Executor self-host
v1.6.7 in Docker
- Web UI accessed through a loopback SSH tunnel
- MCP server:
https://mcp.vercel.com/
The behavior is also reproducible against the current main OAuth service.
Steps to reproduce
- Add the official Vercel MCP integration.
- Complete OAuth and confirm the connection is initially healthy.
- Wait for the access token to expire.
- Run the connection health check or try to use the connection again.
Actual result
The connection becomes Expired and requires interactive reconnection. Executor has no refresh token stored for the connection.
Root cause
Vercel's protected-resource metadata advertises the MCP API scope openid, while its authorization-server metadata also supports the offline_access lifecycle scope and the refresh_token grant.
Executor correctly follows the protected-resource scope list, so it currently:
- registers the dynamic client with
scope: openid
- builds the authorization request with
scope=openid
Because offline_access is absent, the successful authorization does not yield a renewable connection.
Expected result
Connections to the official Vercel authorization endpoint should request offline_access during both Dynamic Client Registration and authorization so Executor can store and use a refresh token.
Other OAuth providers should remain unchanged.
Proposed fix
Add offline_access only when the OAuth authorization URL matches the exact official endpoint https://vercel.com/oauth/authorize, and include it in:
- the DCR
scope metadata
- the authorization request scope list
Verification
- Regression tests fail on current
main: DCR and authorization both contain only openid.
- With the proposed change, both requests contain
openid offline_access.
- A patched self-hosted instance was able to reconnect Vercel, stored a refresh-token pointer, recorded
offline_access, and reported the connection healthy.
Related work
Summary
Vercel MCP connections created through Executor initially work, but later become
Expiredbecause the OAuth flow does not request Vercel'soffline_accesslifecycle scope and therefore stores no refresh token.Environment
v1.6.7in Dockerhttps://mcp.vercel.com/The behavior is also reproducible against the current
mainOAuth service.Steps to reproduce
Actual result
The connection becomes
Expiredand requires interactive reconnection. Executor has no refresh token stored for the connection.Root cause
Vercel's protected-resource metadata advertises the MCP API scope
openid, while its authorization-server metadata also supports theoffline_accesslifecycle scope and therefresh_tokengrant.Executor correctly follows the protected-resource scope list, so it currently:
scope: openidscope=openidBecause
offline_accessis absent, the successful authorization does not yield a renewable connection.Expected result
Connections to the official Vercel authorization endpoint should request
offline_accessduring both Dynamic Client Registration and authorization so Executor can store and use a refresh token.Other OAuth providers should remain unchanged.
Proposed fix
Add
offline_accessonly when the OAuth authorization URL matches the exact official endpointhttps://vercel.com/oauth/authorize, and include it in:scopemetadataVerification
main: DCR and authorization both contain onlyopenid.openid offline_access.offline_access, and reported the connection healthy.Related work