#2487·mcp-use

client: CodeModeConnector crashes on listTools(), session.info, and AI SDK dynamic tool adaptation

Author: rohith500Created Sep 9, 2026Updated Sep 14, 2026
LabelsbugTypeScriptPythonserverclientprotocol

Description

When enabling code mode on MCPClient ({ codeMode: true }), an internal synthetic session named "code_mode" is registered into client.activeSessions (src/core/node.ts:535). This session wraps CodeModeConnector, exposing built-in meta-tools (execute_code and search_tools) to allow consumers to interact with code execution via standard MCP protocol abstractions.

However, CodeModeConnector extends BaseConnector without implementing several fundamental protocol operations. Any consumer that queries session.listTools(), accesses session.info, checks session.supports("tools"), or adapts the session to the Vercel AI SDK dynamic tool system (createAiSdkTools(session)) triggers unhandled exceptions.


Expected vs Actual Behavior

Operation Expected Behavior Actual Behavior
connector.listTools() Resolves with Tool[] containing execute_code and search_tools Throws Error: MCP client is not connected
session.listTools() Resolves with Tool[] containing execute_code and search_tools Throws Error: MCP client is not connected
createAiSdkTools(session) Adapts execute_code and search_tools into AI SDK dynamic tools Throws Error: MCP client is not connected
session.supports("tools") Returns true Returns false
session.serverCapabilities Returns { tools: {} } Returns {}
session.serverInfo Returns { name: "code_mode", version: "1.0.0", ... } Returns null
session.info Returns normalized MCPConnectionInfo Throws Error: MCP connection is not initialized
session.listResources() Resolves with { resources: [] } Throws Error: MCP client is not connected
session.listPrompts() Resolves with { prompts: [] } Throws Error: MCP client is not connected

Minimal Reproduction

typescript
import { MCPClient } from "@mcp-use/client";
import { createAiSdkTools } from "@mcp-use/client/adapters/ai-sdk";

const client = new MCPClient({}, { codeMode: true });
const session = client.getSession("code_mode")!;

console.log("activeSessions:", client.activeSessions); // ['code_mode']

// 1. listTools() throws
await session.listTools(); 
// ❌ Uncaught Error: MCP client is not connected

// 2. session.info throws
console.log(session.info);
// ❌ Uncaught Error: MCP connection is not initialized

// 3. supports("tools") is false
console.log(session.supports("tools"));
// ❌ false

// 4. AI SDK dynamic tool adaptation throws
await createAiSdkTools(session);
// ❌ Uncaught Error: MCP client is not connected

Root Cause Analysis

  1. Missing listTools() Override: CodeModeConnector overrides the synchronous getter get tools(): Tool[], but omits async listTools(options?: RequestOptions): Promise<Tool[]>. Calls fall through to BaseConnector.prototype.listTools, which asserts if (!this.client) throw new Error("MCP client is not connected"). Because CodeModeConnector is an internal virtual meta-server wrapping MCPClient rather than an external transport client, this.client is null.
  2. Missing Protocol Metadata: CodeModeConnector leaves protocolEra and negotiatedProtocolVersion as undefined (which delegate to this.client). MCPSession.info requires both, throwing MCP connection is not initialized.
  3. Missing Capability & Server Caches: CodeModeConnector.initialize() returns { capabilities: {}, version: "1.0.0" }, but never assigns this.capabilitiesCache = { tools: {} } or this.serverInfoCache. Consequently, session.supports("tools") returns false and session.serverInfo returns null.
  4. Parity with Python: In Python, libraries/python/mcp_use/client/connectors/code_mode.py:108-160 already implements list_tools(), list_resources(), and list_prompts(). TypeScript was simply missing these overrides.