From a78b8db3e8495baa8c4e9d34e2d555b48a325a88 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Fri, 3 Apr 2026 19:53:34 -0400 Subject: [PATCH] fix: require deleteTokens for client reuse, add missing import in MCP.js Client registration reuse without cleanup capability creates a permanent failure loop: if the reused client is stale, the code detects the rejection but cannot clear the stored registration because deleteTokens is missing, so every retry reuses the same broken client_id. - MCPConnectionFactory: only pass findToken to initiateOAuthFlow when deleteTokens is also available, ensuring reuse is only enabled when recovery is possible - api/server/services/MCP.js: add deleteTokens to the tokenMethods object (was the only MCP call site missing it) --- api/server/services/MCP.js | 3 ++- packages/api/src/mcp/MCPConnectionFactory.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/api/server/services/MCP.js b/api/server/services/MCP.js index dbb44740a9..ccff184d4d 100644 --- a/api/server/services/MCP.js +++ b/api/server/services/MCP.js @@ -23,7 +23,7 @@ const { getFlowStateManager, getMCPManager, } = require('~/config'); -const { findToken, createToken, updateToken } = require('~/models'); +const { findToken, createToken, updateToken, deleteTokens } = require('~/models'); const { getGraphApiToken } = require('./GraphTokenService'); const { reinitMCPServer } = require('./Tools/mcp'); const { getAppConfig } = require('./Config'); @@ -644,6 +644,7 @@ function createToolInstance({ findToken, createToken, updateToken, + deleteTokens, }, oauthStart, oauthEnd, diff --git a/packages/api/src/mcp/MCPConnectionFactory.ts b/packages/api/src/mcp/MCPConnectionFactory.ts index 8fc0d87fa3..1f24fe5ec4 100644 --- a/packages/api/src/mcp/MCPConnectionFactory.ts +++ b/packages/api/src/mcp/MCPConnectionFactory.ts @@ -351,7 +351,7 @@ export class MCPConnectionFactory { config?.oauth_headers ?? {}, config?.oauth, this.allowedDomains, - this.tokenMethods?.findToken, + this.tokenMethods?.deleteTokens ? this.tokenMethods.findToken : undefined, ); if (existingFlow) {