From 798900a6c86fd19c2c94f2fd10bafc5ad3451bcf Mon Sep 17 00:00:00 2001 From: Jerop Kipruto Date: Thu, 22 Jan 2026 21:48:15 -0500 Subject: [PATCH] fix(core): Include MCP server name in OAuth message (#17351) --- packages/core/src/mcp/oauth-provider.test.ts | 58 +++++++++++++++++++- packages/core/src/mcp/oauth-provider.ts | 3 +- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/packages/core/src/mcp/oauth-provider.test.ts b/packages/core/src/mcp/oauth-provider.test.ts index a06d213462..352cdcd721 100644 --- a/packages/core/src/mcp/oauth-provider.test.ts +++ b/packages/core/src/mcp/oauth-provider.test.ts @@ -42,7 +42,11 @@ import type { OAuthTokenResponse, OAuthClientRegistrationResponse, } from './oauth-provider.js'; -import { MCPOAuthProvider } from './oauth-provider.js'; +import { + MCPOAuthProvider, + OAUTH_DISPLAY_MESSAGE_EVENT, +} from './oauth-provider.js'; +import { EventEmitter } from 'node:events'; import type { OAuthToken } from './token-storage/types.js'; import { MCPOAuthTokenStorage } from './oauth-token-storage.js'; import { @@ -1154,6 +1158,58 @@ describe('MCPOAuthProvider', () => { expect.any(Function), ); }); + it('should include server name in the authentication message', async () => { + // Mock HTTP server callback + let callbackHandler: unknown; + vi.mocked(http.createServer).mockImplementation((handler) => { + callbackHandler = handler; + return mockHttpServer as unknown as http.Server; + }); + + mockHttpServer.listen.mockImplementation((port, callback) => { + callback?.(); + // Simulate OAuth callback + setTimeout(() => { + const mockReq = { + url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw', + }; + const mockRes = { + writeHead: vi.fn(), + end: vi.fn(), + }; + (callbackHandler as (req: unknown, res: unknown) => void)( + mockReq, + mockRes, + ); + }, 10); + }); + + // Mock token exchange + mockFetch.mockResolvedValueOnce( + createMockResponse({ + ok: true, + contentType: 'application/json', + text: JSON.stringify(mockTokenResponse), + json: mockTokenResponse, + }), + ); + + const authProvider = new MCPOAuthProvider(); + const eventEmitter = new EventEmitter(); + const messagePromise = new Promise((resolve) => { + eventEmitter.on(OAUTH_DISPLAY_MESSAGE_EVENT, resolve); + }); + + await authProvider.authenticate( + 'production-server', + mockConfig, + undefined, + eventEmitter, + ); + + const message = await messagePromise; + expect(message).toContain('production-server'); + }); }); describe('refreshAccessToken', () => { diff --git a/packages/core/src/mcp/oauth-provider.ts b/packages/core/src/mcp/oauth-provider.ts index b79ec693a3..30240adba9 100644 --- a/packages/core/src/mcp/oauth-provider.ts +++ b/packages/core/src/mcp/oauth-provider.ts @@ -904,7 +904,8 @@ export class MCPOAuthProvider { mcpServerUrl, ); - displayMessage(`→ Opening your browser for OAuth sign-in... + displayMessage(`Authentication required for MCP Server: '${serverName}' +→ Opening your browser for OAuth sign-in... If the browser does not open, copy and paste this URL into your browser: ${authUrl}