MCPcopy
hub / github.com/coder/mux / runServerTest

Function runServerTest

src/node/services/mcpServerManager.ts:418–550  ·  view source on GitHub ↗

* Run a test connection to an MCP server. * Connects, fetches tools, then closes.

(
  server:
    | { transport: "stdio"; command: string }
    | {
        transport: "http" | "sse" | "auto";
        url: string;
        headers?: ResolvedHeaders;
        authProvider?: OAuthClientProvider;
      },
  projectPath: string,
  logContext: string
)

Source from the content-addressed store, hash-verified

416 * Connects, fetches tools, then closes.
417 */
418async function runServerTest(
419 server:
420 | { transport: "stdio"; command: string }
421 | {
422 transport: "http" | "sse" | "auto";
423 url: string;
424 headers?: ResolvedHeaders;
425 authProvider?: OAuthClientProvider;
426 },
427 projectPath: string,
428 logContext: string
429): Promise<MCPTestResult> {
430 const timeoutPromise = new Promise<MCPTestResult>((resolve) =>
431 setTimeout(() => resolve({ success: false, error: "Connection timed out" }), TEST_TIMEOUT_MS)
432 );
433
434 const testPromise = (async (): Promise<MCPTestResult> => {
435 let stdioTransport: MCPStdioTransport | null = null;
436 let client: Awaited<ReturnType<typeof createMCPClient>> | null = null;
437 let getCapturedWwwAuthenticateHeader: (() => string | null) | null = null;
438
439 try {
440 if (server.transport === "stdio") {
441 const runtime = createRuntime({ type: "local", srcBaseDir: projectPath });
442 log.debug(`[MCP] Testing ${logContext}`, { transport: "stdio" });
443
444 const execStream = await runtime.exec(server.command, {
445 cwd: projectPath,
446 timeout: TEST_TIMEOUT_MS / 1000,
447 });
448
449 stdioTransport = new MCPStdioTransport(execStream);
450 await stdioTransport.start();
451 client = await createMCPClient({ transport: stdioTransport });
452 } else {
453 log.debug(`[MCP] Testing ${logContext}`, { transport: server.transport });
454
455 const challengeCapture = createWwwAuthenticateCaptureFetch();
456 getCapturedWwwAuthenticateHeader = challengeCapture.getCapturedHeader;
457
458 const transportBase = {
459 url: server.url,
460 headers: server.headers,
461 fetch: challengeCapture.fetch,
462 ...(server.authProvider ? { authProvider: server.authProvider } : {}),
463 };
464
465 const tryHttp = async () =>
466 createMCPClient({
467 transport: {
468 type: "http",
469 ...transportBase,
470 },
471 });
472
473 const trySse = async () =>
474 createMCPClient({
475 transport: {

Callers 1

testMethod · 0.85

Calls 13

createRuntimeFunction · 0.90
getErrorMessageFunction · 0.90
tryHttpFunction · 0.85
trySseFunction · 0.85
shouldAutoFallbackToSseFunction · 0.85
extractHttpStatusCodeFunction · 0.85
debugMethod · 0.80
resolveFunction · 0.70
execMethod · 0.65
closeMethod · 0.65

Tested by 1

testMethod · 0.68