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
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 connectedRoot Cause Analysis
- Missing
listTools()Override:CodeModeConnectoroverrides the synchronous getterget tools(): Tool[], but omitsasync listTools(options?: RequestOptions): Promise<Tool[]>. Calls fall through toBaseConnector.prototype.listTools, which assertsif (!this.client) throw new Error("MCP client is not connected"). BecauseCodeModeConnectoris an internal virtual meta-server wrappingMCPClientrather than an external transport client,this.clientisnull. - Missing Protocol Metadata:
CodeModeConnectorleavesprotocolEraandnegotiatedProtocolVersionasundefined(which delegate tothis.client).MCPSession.inforequires both, throwingMCP connection is not initialized. - Missing Capability & Server Caches:
CodeModeConnector.initialize()returns{ capabilities: {}, version: "1.0.0" }, but never assignsthis.capabilitiesCache = { tools: {} }orthis.serverInfoCache. Consequently,session.supports("tools")returnsfalseandsession.serverInforeturnsnull. - Parity with Python:
In Python,
libraries/python/mcp_use/client/connectors/code_mode.py:108-160already implementslist_tools(),list_resources(), andlist_prompts(). TypeScript was simply missing these overrides.
Source: mcp-use/mcp-use