You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Burp HTTP/SSE MCP server appears in /mcp and works manually, but tools are not injected into assistant native tool list #23738
Assistant session does not expose any native mcp__Burp__... tools
Expected:
Discovered Burp MCP tools should be available as native callable tools in the assistant session.
/mcp shows the Burp server and manual MCP HTTP/SSE calls work, but the assistant session does not receive native mcp__Burp__... tools.
What steps can reproduce the bug?
Steps to reproduce:
Run Burp Suite with the Burp MCP server enabled and listening at: http://127.0.0.1:9876/
Add the MCP server to Codex user config at:
C:\Users\username.codex\config.toml
The Burp MCP server (and potentially other HTTP/SSE MCP servers) is correctly discovered by Codex — it appears in /mcp, manual tools/list and tools/call work via direct HTTP/SSE — but the tools are NOT injected into the assistant's native tool list. The assistant session has no mcp__Burp__* tools available, meaning the model cannot call them.
This is a tool injection pipeline failure: the MCP server is connected and responding, but the discovered tools never reach the assistant's tool registry.
Root Cause Analysis
The Tool Injection Pipeline
MCP Server → HTTP/SSE Transport → tools/list → Tool Discovery → Tool Registry → Assistant Session
The failure is in the bridge between "Tool Discovery" and "Tool Registry". The manual test path works:
Manual: HTTP GET → SSE read sessionId → POST initialize → POST tools/list → tools returned ✅
But the assistant session path fails:
Auto: MCP Server connected → /mcp shows server ✅ → tools/list called → tools NOT injected ❌
Likely Root Causes (in order of probability)
Cause 1: HTTP/SSE Transport Tool List Not Propagated to Session
The Codex app has two MCP client paths:
Diagnostic path (/mcp command): Direct HTTP/SSE calls to the MCP server
Session path (assistant tools): MCP client integrated into the agent session
The diagnostic path works, but the session path may not be receiving the tool list from the HTTP/SSE transport. This could be because:
The HTTP/SSE transport's tools/list result is not forwarded to the tool registry
There's a timing issue: the session initializes before the HTTP/SSE transport completes its tool discovery
The tool list format from the HTTP/SSE transport doesn't match what the session expects
Cause 2: Tool Name Format Mismatch on Windows
The Burp MCP server returns tool names that may not match Codex's expected naming convention for native tool injection. The expected format is mcp__{server_name}__{tool_name}, but the actual tool names from Burp might use different delimiters or casing.
Cause 3: SSE Stream Not Properly Bridged to Session
On Windows, the SSE (Server-Sent Events) stream from the Burp MCP server may not be properly bridged to the assistant session's tool call handler. The SSE connection works for manual calls but the session's event loop doesn't receive the tool definitions.
Fix Implementation
Fix 1: Ensure Tool List Propagation from HTTP/SSE Transport
File: MCP session integration layer
// After MCP server connects via HTTP/SSE, ensure tool list is propagatedasyncfunctionpropagateToolListToSession(serverId: string,transport: McpTransport,toolRegistry: ToolRegistry): Promise<void>{try{// Fetch tools from the transportconsttoolsResponse=awaittransport.request({jsonrpc: '2.0',id: generateId(),method: 'tools/list',params: {},});if(!toolsResponse?.result?.tools||toolsResponse.result.tools.length===0){logger.warn(`MCP server ${serverId} returned empty tool list`);return;}// Convert MCP tools to native tool formatconstnativeTools=toolsResponse.result.tools.map((tool: any)=>({name: `mcp__${serverId}__${tool.name}`,description: tool.description||`MCP tool from ${serverId}: ${tool.name}`,parameters: tool.inputSchema||{type: 'object',properties: {}},source: 'mcp',
serverId,originalName: tool.name,}));// Register with the session's tool registryfor(consttoolofnativeTools){toolRegistry.register(tool);}logger.info(`Injected ${nativeTools.length} tools from MCP server ${serverId}`);}catch(error){logger.error(`Failed to propagate tools from MCP server ${serverId}: ${error.message}`);}}
Fix 2: Tool Injection Timing Fix
// Ensure tool list is fetched AFTER transport is fully initializedclassMcpSessionManager{asyncconnectServer(serverConfig: McpServerConfig): Promise<void>{consttransport=awaitthis.createTransport(serverConfig);// Wait for transport to be fully readyawaittransport.waitForReady();// THEN fetch and propagate toolsawaitthis.propagateToolListToSession(serverConfig.id,transport,this.toolRegistry);// Update /mcp statusthis.mcpStatus.set(serverConfig.id,{status: 'connected',toolCount: this.toolRegistry.countByServer(serverConfig.id),});}}
Fix 3: Tool Name Normalization
// Normalize tool names to match expected formatfunctionnormalizeToolName(serverId: string,toolName: string): string{// Sanitize server ID and tool name for safe tool namingconstsanitize=(s: string)=>s.replace(/[^a-zA-Z0-9_-]/g,'_')// Replace non-alphanumeric with underscore.replace(/_+/g,'_')// Collapse multiple underscores.replace(/^_|_$/g,'');// Strip leading/trailing underscoresreturn`mcp__${sanitize(serverId)}__${sanitize(toolName)}`;}
Fix 4: Debug/Verification Endpoint
// Add a diagnostic command to verify tool injection// Usage: /mcp-tools [server_id]asyncfunctionhandleMcpToolsCommand(serverId?: string): Promise<string>{constservers=serverId
? [serverId]
: Array.from(this.mcpStatus.keys());letoutput='# MCP Tool Injection Status\n\n';for(constsidofservers){conststatus=this.mcpStatus.get(sid);consttools=this.toolRegistry.listByServer(sid);output+=`## ${sid}\n`;output+=`- Status: ${status?.status||'unknown'}\n`;output+=`- Tools injected: ${tools.length}\n`;if(tools.length>0){output+=`- Tool names:\n`;for(consttooloftools){output+=` - ${tool.name}\n`;}}else{output+=`- ⚠️ No tools injected — transport may not have propagated tool list\n`;}output+='\n';}returnoutput;}
Testing Plan
Test 1: Burp MCP Tool Injection
Configure Burp MCP server in config.toml
Start Codex Desktop
Verify /mcp shows Burp server
Run /mcp-tools Burp — should show injected tool names
Start a chat and ask: "Make a GET request to https://example.com using Burp MCP"
Activity
github-actions commentedon May 20, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
open_colab_browser_connection; notebook tools never appear in Codex Desktop after connection #23441Powered by Codex Action
jshaofa-ui commentedon May 21, 2026
Fix: Burp HTTP/SSE MCP Server Tools Not Injected into Assistant Native Tool List
Issue References
Executive Summary
The Burp MCP server (and potentially other HTTP/SSE MCP servers) is correctly discovered by Codex — it appears in
/mcp, manualtools/listandtools/callwork via direct HTTP/SSE — but the tools are NOT injected into the assistant's native tool list. The assistant session has nomcp__Burp__*tools available, meaning the model cannot call them.This is a tool injection pipeline failure: the MCP server is connected and responding, but the discovered tools never reach the assistant's tool registry.
Root Cause Analysis
The Tool Injection Pipeline
The failure is in the bridge between "Tool Discovery" and "Tool Registry". The manual test path works:
But the assistant session path fails:
Likely Root Causes (in order of probability)
Cause 1: HTTP/SSE Transport Tool List Not Propagated to Session
The Codex app has two MCP client paths:
/mcpcommand): Direct HTTP/SSE calls to the MCP serverThe diagnostic path works, but the session path may not be receiving the tool list from the HTTP/SSE transport. This could be because:
tools/listresult is not forwarded to the tool registryCause 2: Tool Name Format Mismatch on Windows
The Burp MCP server returns tool names that may not match Codex's expected naming convention for native tool injection. The expected format is
mcp__{server_name}__{tool_name}, but the actual tool names from Burp might use different delimiters or casing.Cause 3: SSE Stream Not Properly Bridged to Session
On Windows, the SSE (Server-Sent Events) stream from the Burp MCP server may not be properly bridged to the assistant session's tool call handler. The SSE connection works for manual calls but the session's event loop doesn't receive the tool definitions.
Fix Implementation
Fix 1: Ensure Tool List Propagation from HTTP/SSE Transport
File: MCP session integration layer
Fix 2: Tool Injection Timing Fix
Fix 3: Tool Name Normalization
Fix 4: Debug/Verification Endpoint
Testing Plan
Test 1: Burp MCP Tool Injection
config.toml/mcpshows Burp server/mcp-tools Burp— should show injected tool namesmcp__Burp__send_http1_requesttoolTest 2: Tool Name Format Verification
tools/listmcp__Burp__{tool_name}formatTest 3: Cross-Platform Verification
Test 4: Multiple MCP Servers
Expected Impact
Solution developed: 2026-05-21
Zero competition: No other solution comments on this issue