mcp-remote sometimes missing PKCE code_verifier for Dynamic applications

Problem to solve

On occasion, users are reporting that our PKCE code_verifier is missing when registering an OAuth Application through our mcp_server .

  def validate_pkce_for_dynamic_applications
    return unless server.client&.application&.dynamic?
    return unless params[:code_verifier].blank? # rubocop:disable Rails/StrongParams -- Only accessing a single named param

    render json: {
      error: 'invalid_request',
      error_description: 'PKCE code_verifier is required for dynamic OAuth applications'
    }, status: :bad_request
  end

Here's an example error trace

[2025-09-18T18:20:00.928Z][88849] Connection error {
  errorMessage: 'PKCE code_verifier is required for dynamic OAuth applications',
  stack: 'InvalidRequestError: PKCE code_verifier is required for dynamic OAuth applications\n' +
    '    at parseErrorResponse (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12226:12)\n' +
    '    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n' +
    '    at async refreshAuthorization (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12595:11)\n' +
    '    at async authInternal (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12298:25)\n' +
    '    at async auth (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12235:12)\n' +
    '    at async StreamableHTTPClientTransport.send (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:13454:26)',
  transportType: 'StreamableHTTPClientTransport'
}
[88849] Fatal error: InvalidRequestError: PKCE code_verifier is required for dynamic OAuth applications
    at parseErrorResponse (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12226:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async refreshAuthorization (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12595:11)
    at async authInternal (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12298:25)
    at async auth (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12235:12)
    at async StreamableHTTPClientTransport.send (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:13454:26) {
  errorUri: undefined
}
[2025-09-18T18:20:00.928Z][88849] Fatal error: InvalidRequestError: PKCE code_verifier is required for dynamic OAuth applications
    at parseErrorResponse (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12226:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async refreshAuthorization (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12595:11)
    at async authInternal (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12298:25)
    at async auth (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:12235:12)
    at async StreamableHTTPClientTransport.send (file:///Users/terrichu/.local/share/mise/installs/node/23.11.1/lib/node_modules/mcp-remote/dist/chunk-AKJME7CQ.js:13454:26) {
  errorUri: undefined

Current Solution

Running the following rm -rf ~/.mcp-auth resolves the issue but we should investigate why this is occuring.

Edited by 🤖 GitLab Bot 🤖