ChatGPT MCP connector refreshes token on every tool call and doesn't persist sessions
Summary
ChatGPT’s MCP connector unconditionally refreshes the OAuth token and creates a new MCP session before every single tool call, even when the access token is still valid.
Observed Behavior
Every tool invocation follows this pattern:
POST /token (grant_type=refresh_token) ← token is still valid initialize ← new MCP session message processing canceled ← previous session killed tools/call ← actual work
This happens regardless of expires_in — even with a freshly issued access token (e.g.,
expires_in: 3600), the next tool call triggers a full refresh + new session.
Evidence from Server Logs
Refresh token request — clientId={clientId}, userAgent=Python/3.12 aiohttp/3.13.3 POST /token → 200 initialize → Client message processing canceled tools/call → success Refresh token request — clientId={clientId} ← immediately refreshes again initialize → Client ← brand new session tools/call → success
Problems This Causes
Unnecessary load on authorization servers. Every tool call hits the token endpoint even when the access token has minutes/hours of remaining validity.
Users are repeatedly prompted to re-authenticate despite having valid tokens with
offline_accessscope.
Environment
- MCP client: ChatGPT Desktop/Web
- OAuth flow: Authorization Code + PKCE (OAuth 2.1)
- Scopes:
openid profile api offline_access - Server correctly returns
expires_in,access_token, andrefresh_tokenin token responses
Discussion in the ATmosphere