1- import { Agent as HttpsAgent } from "https" ;
2-
31import { decodeFQSN , getTemplateVariables } from "@continuedev/config-yaml" ;
42import { type AssistantConfig } from "@continuedev/sdk" ;
53import { Client } from "@modelcontextprotocol/sdk/client/index.js" ;
6- import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js" ;
7- import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js" ;
8- import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js" ;
9- import {
10- HttpMcpServer ,
11- SseMcpServer ,
12- StdioMcpServer ,
13- } from "node_modules/@continuedev/config-yaml/dist/schemas/mcp/index.js" ;
144
155import { isAuthenticated , loadAuthConfig } from "src/auth/workos.js" ;
166
@@ -19,6 +9,11 @@ import { getErrorString } from "../util/error.js";
199import { logger } from "../util/logger.js" ;
2010
2111import { BaseService , ServiceWithDependencies } from "./BaseService.js" ;
12+ import {
13+ constructHttpTransport ,
14+ constructSseTransport ,
15+ constructStdioTransport ,
16+ } from "./mcpTransports.js" ;
2217import { isAuthError } from "./mcpUtils.js" ;
2318import { serviceContainer } from "./ServiceContainer.js" ;
2419import {
@@ -474,7 +469,7 @@ Org-level secrets can only be used for MCP by Background Agents (https://docs.co
474469
475470 if ( "command" in serverConfig ) {
476471 // STDIO: no need to check type, just if command is present
477- const transport = this . constructStdioTransport ( serverConfig , connection ) ;
472+ const transport = constructStdioTransport ( serverConfig , connection ) ;
478473 await client . connect ( transport , { } ) ;
479474 } else {
480475 // SSE/HTTP: if type isn't explicit: try http and fall back to sse
@@ -483,21 +478,22 @@ Org-level secrets can only be used for MCP by Background Agents (https://docs.co
483478 if ( serverConfig . apiKey && ! this . apiKeyCache . get ( serverConfig . name ) ) {
484479 this . apiKeyCache . set ( serverConfig . name , serverConfig . apiKey ) ;
485480 }
481+ const apiKey = this . apiKeyCache . get ( serverConfig . name ) ;
486482 if ( serverConfig . type === "sse" ) {
487- const transport = this . constructSseTransport ( serverConfig ) ;
483+ const transport = constructSseTransport ( serverConfig , apiKey ) ;
488484 await client . connect ( transport , { } ) ;
489485 } else if ( serverConfig . type === "streamable-http" ) {
490- const transport = this . constructHttpTransport ( serverConfig ) ;
486+ const transport = constructHttpTransport ( serverConfig , apiKey ) ;
491487 await client . connect ( transport , { } ) ;
492488 } else {
493489 try {
494- const transport = this . constructHttpTransport ( serverConfig ) ;
490+ const transport = constructHttpTransport ( serverConfig , apiKey ) ;
495491 await client . connect ( transport , { } ) ;
496492 } catch ( e ) {
497493 if ( isAuthError ( e ) ) {
498494 throw e ;
499495 }
500- const transport = this . constructSseTransport ( serverConfig ) ;
496+ const transport = constructSseTransport ( serverConfig , apiKey ) ;
501497 await client . connect ( transport , { } ) ;
502498 }
503499 }
@@ -527,7 +523,7 @@ Org-level secrets can only be used for MCP by Background Agents (https://docs.co
527523 ) ;
528524 }
529525
530- const transport = this . constructStdioTransport (
526+ const transport = constructStdioTransport (
531527 {
532528 name : serverConfig . name ,
533529 command : "npx" ,
@@ -544,95 +540,4 @@ Org-level secrets can only be used for MCP by Background Agents (https://docs.co
544540
545541 return client ;
546542 }
547-
548- private constructSseTransport (
549- serverConfig : SseMcpServer ,
550- ) : SSEClientTransport {
551- const apiKey = this . apiKeyCache . get ( serverConfig . name ) ;
552- const sseAgent =
553- serverConfig . requestOptions ?. verifySsl === false
554- ? new HttpsAgent ( { rejectUnauthorized : false } )
555- : undefined ;
556-
557- const headers = {
558- ...serverConfig . requestOptions ?. headers ,
559- ...( apiKey && {
560- Authorization : `Bearer ${ apiKey } ` ,
561- } ) ,
562- } ;
563-
564- return new SSEClientTransport ( new URL ( serverConfig . url ) , {
565- eventSourceInit : {
566- fetch : ( input , init ) =>
567- fetch ( input , {
568- ...init ,
569- headers : {
570- ...init ?. headers ,
571- ...headers ,
572- } ,
573- ...( sseAgent && { agent : sseAgent } ) ,
574- } ) ,
575- } ,
576- requestInit : {
577- headers,
578- ...( sseAgent && { agent : sseAgent } ) ,
579- } ,
580- } ) ;
581- }
582- private constructHttpTransport (
583- serverConfig : HttpMcpServer ,
584- ) : StreamableHTTPClientTransport {
585- const apiKey = this . apiKeyCache . get ( serverConfig . name ) ;
586- const streamableAgent =
587- serverConfig . requestOptions ?. verifySsl === false
588- ? new HttpsAgent ( { rejectUnauthorized : false } )
589- : undefined ;
590-
591- const headers = {
592- ...serverConfig . requestOptions ?. headers ,
593- ...( apiKey && {
594- Authorization : `Bearer ${ apiKey } ` ,
595- } ) ,
596- } ;
597-
598- return new StreamableHTTPClientTransport ( new URL ( serverConfig . url ) , {
599- requestInit : {
600- headers,
601- ...( streamableAgent && { agent : streamableAgent } ) ,
602- } ,
603- } ) ;
604- }
605- private constructStdioTransport (
606- serverConfig : StdioMcpServer ,
607- connection : ServerConnection ,
608- ) : StdioClientTransport {
609- const env : Record < string , string > = serverConfig . env || { } ;
610- if ( process . env ) {
611- for ( const [ key , value ] of Object . entries ( process . env ) ) {
612- if ( ! ( key in env ) && ! ! value ) {
613- env [ key ] = value ;
614- }
615- }
616- }
617-
618- const transport = new StdioClientTransport ( {
619- command : serverConfig . command ,
620- args : serverConfig . args || [ ] ,
621- env,
622- cwd : serverConfig . cwd ,
623- stderr : "pipe" ,
624- } ) ;
625-
626- const stderrStream = transport . stderr ;
627- if ( stderrStream ) {
628- stderrStream . on ( "data" , ( data : Buffer ) => {
629- const stderrOutput = data . toString ( ) . trim ( ) ;
630- if ( stderrOutput ) {
631- connection . warnings . push ( stderrOutput ) ;
632- }
633- } ) ;
634- }
635-
636- return transport ;
637- }
638543}
0 commit comments