@@ -42,6 +42,10 @@ import { OAuthClient } from './mcpOauthClient'
4242
4343export const MCP_SERVER_STATUS_CHANGED = 'mcpServerStatusChanged'
4444export const AGENT_TOOLS_CHANGED = 'agentToolsChanged'
45+ export enum AuthIntent {
46+ Interactive = 'interactive' ,
47+ Silent = 'silent' ,
48+ }
4549
4650/**
4751 * Manages MCP servers and their tools
@@ -166,7 +170,7 @@ export class McpManager {
166170 /**
167171 * Load configurations and initialize each enabled server.
168172 */
169- private async discoverAllServers ( ) : Promise < void > {
173+ private async discoverAllServers ( authIntent : AuthIntent = AuthIntent . Silent ) : Promise < void > {
170174 // Load agent config
171175 const result = await loadAgentConfig ( this . features . workspace , this . features . logging , this . agentPaths )
172176
@@ -217,7 +221,7 @@ export class McpManager {
217221 // Process servers in batches
218222 for ( let i = 0 ; i < totalServers ; i += MAX_CONCURRENT_SERVERS ) {
219223 const batch = serversToInit . slice ( i , i + MAX_CONCURRENT_SERVERS )
220- const batchPromises = batch . map ( ( [ name , cfg ] ) => this . initOneServer ( name , cfg ) )
224+ const batchPromises = batch . map ( ( [ name , cfg ] ) => this . initOneServer ( name , cfg , authIntent ) )
221225
222226 this . features . logging . debug (
223227 `MCP: initializing batch of ${ batch . length } servers (${ i + 1 } -${ Math . min ( i + MAX_CONCURRENT_SERVERS , totalServers ) } of ${ totalServers } )`
@@ -292,7 +296,11 @@ export class McpManager {
292296 * Start a server process, connect client, and register its tools.
293297 * Errors are logged but do not stop discovery of other servers.
294298 */
295- private async initOneServer ( serverName : string , cfg : MCPServerConfig ) : Promise < void > {
299+ private async initOneServer (
300+ serverName : string ,
301+ cfg : MCPServerConfig ,
302+ authIntent : AuthIntent = AuthIntent . Silent
303+ ) : Promise < void > {
296304 const DEFAULT_SERVER_INIT_TIMEOUT_MS = 60_000
297305 this . setState ( serverName , McpServerStatus . INITIALIZING , 0 )
298306
@@ -365,10 +373,19 @@ export class McpManager {
365373
366374 if ( needsOAuth ) {
367375 OAuthClient . initialize ( this . features . workspace , this . features . logging )
368- const bearer = await OAuthClient . getValidAccessToken ( base )
376+ const bearer = await OAuthClient . getValidAccessToken ( base , {
377+ interactive : authIntent === 'interactive' ,
378+ } )
369379 // add authorization header if we are able to obtain a bearer token
370380 if ( bearer ) {
371381 headers = { ...headers , Authorization : `Bearer ${ bearer } ` }
382+ } else if ( authIntent === 'silent' ) {
383+ // In silent mode we never launch a browser. If we cannot obtain a token
384+ // from cache/refresh, surface a clear auth-required error and stop here.
385+ throw new AgenticChatError (
386+ `MCP: server '${ serverName } ' requires OAuth. Open "Edit MCP Server" and save to sign in.` ,
387+ 'MCPServerAuthFailed'
388+ )
372389 }
373390 }
374391
@@ -707,7 +724,7 @@ export class McpManager {
707724 await saveAgentConfig ( this . features . workspace , this . features . logging , this . agentConfig , agentPath )
708725
709726 // Add server tools to tools list after initialization
710- await this . initOneServer ( sanitizedName , newCfg )
727+ await this . initOneServer ( sanitizedName , newCfg , AuthIntent . Interactive )
711728 } catch ( err ) {
712729 this . features . logging . error (
713730 `Failed to add MCP server '${ serverName } ': ${ err instanceof Error ? err . message : String ( err ) } `
@@ -872,7 +889,7 @@ export class McpManager {
872889 this . setState ( serverName , McpServerStatus . DISABLED , 0 )
873890 this . emitToolsChanged ( serverName )
874891 } else {
875- await this . initOneServer ( serverName , newCfg )
892+ await this . initOneServer ( serverName , newCfg , AuthIntent . Interactive )
876893 }
877894 } catch ( err ) {
878895 this . handleError ( serverName , err )
@@ -1086,7 +1103,7 @@ export class McpManager {
10861103 this . setState ( serverName , McpServerStatus . DISABLED , 0 )
10871104 } else {
10881105 if ( ! this . clients . has ( serverName ) && serverName !== 'Built-in' ) {
1089- await this . initOneServer ( serverName , this . mcpServers . get ( serverName ) ! )
1106+ await this . initOneServer ( serverName , this . mcpServers . get ( serverName ) ! , AuthIntent . Silent )
10901107 }
10911108 }
10921109
0 commit comments