MCP OAuth token refresh not persisting for Notion MCP server

Open 💬 10 comments Opened Feb 24, 2026 by wcampbellgalaxy

Description

The Notion MCP server (installed via the official marketplace plugin) requires re-authentication on nearly every session start, despite having a valid refresh token stored in ~/.claude/.credentials.json. The expected behavior is that Claude Code automatically uses the refresh token to obtain a new access token when the current one expires.

Steps to reproduce

  1. Install the Notion MCP plugin from the official marketplace
  2. Authenticate via OAuth (browser flow completes successfully)
  3. Use Notion MCP tools in a session — works fine
  4. Start a new session (or wait for the access token to expire, ~1 hour)
  5. Notion MCP shows △ needs authentication and requires manual re-auth via /mcp

Expected behavior

Claude Code should detect the expired access token, use the stored refresh token to obtain a new access token, update .credentials.json with the new tokens, and connect to the MCP server without user intervention.

Actual behavior

The MCP server shows needs authentication on every new session (or after token expiry within a session). The user must manually run /mcp to re-authenticate each time.

Environment

  • OS: macOS (Darwin 25.3.0)
  • Claude Code: latest stable channel
  • MCP server: Notion (https://mcp.notion.com/mcp) via official marketplace plugin
  • Credential storage: ~/.claude/.credentials.json contains both accessToken and refreshToken under mcpOAuth.notion|*

Additional context

  • The access token appears to have a short TTL (~1 hour based on expiresAt timestamps)
  • The refresh token IS present in the credentials file after each successful auth
  • This may also affect other OAuth-based MCP servers (Atlassian appears to work more reliably, possibly due to longer token TTLs)
  • Running multiple concurrent Claude Code sessions may exacerbate the issue if refresh token rotation causes one session to invalidate the other's stored token

View original on GitHub ↗

This issue has 10 comments on GitHub. Read the full discussion on GitHub ↗