From 00f8628b8372ae1285313c9d8e36e58cf1d8a10e Mon Sep 17 00:00:00 2001 From: Lidang-Jiang Date: Sat, 28 Mar 2026 09:52:17 +0800 Subject: [PATCH 1/4] fix(codex): add startup_timeout_sec to MCP servers to prevent first-run timeouts On first startup, npx-based MCP servers need to download packages before they can respond. The default timeout is too short for this, causing frequent "timed out after 10 seconds" errors reported in #544. Add startup_timeout_sec = 30 to all five command-based MCP servers (github, context7, memory, playwright, sequential-thinking). The URL-based exa server is unaffected and left unchanged. 30 seconds was chosen over the 20s precedent in merge-mcp-config.js to give extra headroom for slow networks on first run. Fixes #544 Co-Authored-By: Claude Opus 4.6 Signed-off-by: Lidang-Jiang --- .codex/config.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.codex/config.toml b/.codex/config.toml index e1e1bf52..2b0f1f39 100644 --- a/.codex/config.toml +++ b/.codex/config.toml @@ -38,10 +38,12 @@ notify = [ [mcp_servers.github] command = "npx" args = ["-y", "@modelcontextprotocol/server-github"] +startup_timeout_sec = 30 [mcp_servers.context7] command = "npx" args = ["-y", "@upstash/context7-mcp@latest"] +startup_timeout_sec = 30 [mcp_servers.exa] url = "https://mcp.exa.ai/mcp" @@ -49,14 +51,17 @@ url = "https://mcp.exa.ai/mcp" [mcp_servers.memory] command = "npx" args = ["-y", "@modelcontextprotocol/server-memory"] +startup_timeout_sec = 30 [mcp_servers.playwright] command = "npx" args = ["-y", "@playwright/mcp@latest", "--extension"] +startup_timeout_sec = 30 [mcp_servers.sequential-thinking] command = "npx" args = ["-y", "@modelcontextprotocol/server-sequential-thinking"] +startup_timeout_sec = 30 # Additional MCP servers (uncomment as needed): # [mcp_servers.supabase] From 1e44475458561cf0c4f86bdb2bf7599deb552c86 Mon Sep 17 00:00:00 2001 From: Lidang-Jiang Date: Sat, 28 Mar 2026 10:36:04 +0800 Subject: [PATCH 2/4] fix(codex): sync startup_timeout_sec into merge-mcp-config.js ECC_SERVERS Reviewers identified that merge-mcp-config.js --update-mcp would silently strip the startup_timeout_sec from config.toml because the ECC_SERVERS spec did not include it. Add startup_timeout_sec = 30 to playwright, context7-mcp, github, memory, and sequential-thinking. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Lidang-Jiang --- scripts/codex/merge-mcp-config.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/codex/merge-mcp-config.js b/scripts/codex/merge-mcp-config.js index c75710b7..078fc626 100644 --- a/scripts/codex/merge-mcp-config.js +++ b/scripts/codex/merge-mcp-config.js @@ -85,18 +85,18 @@ function dlxServer(name, pkg, extraFields, extraToml) { /** Each entry: key = section name under mcp_servers, value = { toml, fields } */ const ECC_SERVERS = { supabase: dlxServer('supabase', '@supabase/mcp-server-supabase@latest', { startup_timeout_sec: 20.0, tool_timeout_sec: 120.0 }, 'startup_timeout_sec = 20.0\ntool_timeout_sec = 120.0'), - playwright: dlxServer('playwright', '@playwright/mcp@latest'), - 'context7-mcp': dlxServer('context7-mcp', '@upstash/context7-mcp'), + playwright: dlxServer('playwright', '@playwright/mcp@latest', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), + 'context7-mcp': dlxServer('context7-mcp', '@upstash/context7-mcp', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), exa: { fields: { url: 'https://mcp.exa.ai/mcp' }, toml: `[mcp_servers.exa]\nurl = "https://mcp.exa.ai/mcp"` }, github: { - fields: { command: 'bash', args: ['-lc', GH_BOOTSTRAP] }, - toml: `[mcp_servers.github]\ncommand = "bash"\nargs = ["-lc", ${JSON.stringify(GH_BOOTSTRAP)}]` + fields: { command: 'bash', args: ['-lc', GH_BOOTSTRAP], startup_timeout_sec: 30 }, + toml: `[mcp_servers.github]\ncommand = "bash"\nargs = ["-lc", ${JSON.stringify(GH_BOOTSTRAP)}]\nstartup_timeout_sec = 30` }, - memory: dlxServer('memory', '@modelcontextprotocol/server-memory'), - 'sequential-thinking': dlxServer('sequential-thinking', '@modelcontextprotocol/server-sequential-thinking') + memory: dlxServer('memory', '@modelcontextprotocol/server-memory', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), + 'sequential-thinking': dlxServer('sequential-thinking', '@modelcontextprotocol/server-sequential-thinking', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30') }; // Append --features arg for supabase after dlxServer builds the base From 9ad4351f5314b0259ecf864ba35237ac5d536091 Mon Sep 17 00:00:00 2001 From: Lidang-Jiang Date: Sat, 28 Mar 2026 11:38:38 +0800 Subject: [PATCH 3/4] fix(codex): align context7-mcp package specifier with config.toml Add @latest suffix to '@upstash/context7-mcp' in ECC_SERVERS so the generated merge spec matches .codex/config.toml exactly, preventing configDiffers from flagging false drift on --update-mcp runs. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Lidang-Jiang --- scripts/codex/merge-mcp-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/codex/merge-mcp-config.js b/scripts/codex/merge-mcp-config.js index 078fc626..25d845cf 100644 --- a/scripts/codex/merge-mcp-config.js +++ b/scripts/codex/merge-mcp-config.js @@ -86,7 +86,7 @@ function dlxServer(name, pkg, extraFields, extraToml) { const ECC_SERVERS = { supabase: dlxServer('supabase', '@supabase/mcp-server-supabase@latest', { startup_timeout_sec: 20.0, tool_timeout_sec: 120.0 }, 'startup_timeout_sec = 20.0\ntool_timeout_sec = 120.0'), playwright: dlxServer('playwright', '@playwright/mcp@latest', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), - 'context7-mcp': dlxServer('context7-mcp', '@upstash/context7-mcp', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), + 'context7-mcp': dlxServer('context7-mcp', '@upstash/context7-mcp@latest', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), exa: { fields: { url: 'https://mcp.exa.ai/mcp' }, toml: `[mcp_servers.exa]\nurl = "https://mcp.exa.ai/mcp"` From 78c98dd4fdd65c06ce22a7d016426d175251e611 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Sat, 28 Mar 2026 10:59:23 -0400 Subject: [PATCH 4/4] fix(codex): reuse shared MCP startup timeout constant --- scripts/codex/merge-mcp-config.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/scripts/codex/merge-mcp-config.js b/scripts/codex/merge-mcp-config.js index 25d845cf..917e2948 100644 --- a/scripts/codex/merge-mcp-config.js +++ b/scripts/codex/merge-mcp-config.js @@ -83,20 +83,23 @@ function dlxServer(name, pkg, extraFields, extraToml) { } /** Each entry: key = section name under mcp_servers, value = { toml, fields } */ +const DEFAULT_MCP_STARTUP_TIMEOUT_SEC = 30; +const DEFAULT_MCP_STARTUP_TIMEOUT_TOML = `startup_timeout_sec = ${DEFAULT_MCP_STARTUP_TIMEOUT_SEC}`; + const ECC_SERVERS = { supabase: dlxServer('supabase', '@supabase/mcp-server-supabase@latest', { startup_timeout_sec: 20.0, tool_timeout_sec: 120.0 }, 'startup_timeout_sec = 20.0\ntool_timeout_sec = 120.0'), - playwright: dlxServer('playwright', '@playwright/mcp@latest', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), - 'context7-mcp': dlxServer('context7-mcp', '@upstash/context7-mcp@latest', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), + playwright: dlxServer('playwright', '@playwright/mcp@latest', { startup_timeout_sec: DEFAULT_MCP_STARTUP_TIMEOUT_SEC }, DEFAULT_MCP_STARTUP_TIMEOUT_TOML), + 'context7-mcp': dlxServer('context7-mcp', '@upstash/context7-mcp@latest', { startup_timeout_sec: DEFAULT_MCP_STARTUP_TIMEOUT_SEC }, DEFAULT_MCP_STARTUP_TIMEOUT_TOML), exa: { fields: { url: 'https://mcp.exa.ai/mcp' }, toml: `[mcp_servers.exa]\nurl = "https://mcp.exa.ai/mcp"` }, github: { - fields: { command: 'bash', args: ['-lc', GH_BOOTSTRAP], startup_timeout_sec: 30 }, - toml: `[mcp_servers.github]\ncommand = "bash"\nargs = ["-lc", ${JSON.stringify(GH_BOOTSTRAP)}]\nstartup_timeout_sec = 30` + fields: { command: 'bash', args: ['-lc', GH_BOOTSTRAP], startup_timeout_sec: DEFAULT_MCP_STARTUP_TIMEOUT_SEC }, + toml: `[mcp_servers.github]\ncommand = "bash"\nargs = ["-lc", ${JSON.stringify(GH_BOOTSTRAP)}]\n${DEFAULT_MCP_STARTUP_TIMEOUT_TOML}` }, - memory: dlxServer('memory', '@modelcontextprotocol/server-memory', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30'), - 'sequential-thinking': dlxServer('sequential-thinking', '@modelcontextprotocol/server-sequential-thinking', { startup_timeout_sec: 30 }, 'startup_timeout_sec = 30') + memory: dlxServer('memory', '@modelcontextprotocol/server-memory', { startup_timeout_sec: DEFAULT_MCP_STARTUP_TIMEOUT_SEC }, DEFAULT_MCP_STARTUP_TIMEOUT_TOML), + 'sequential-thinking': dlxServer('sequential-thinking', '@modelcontextprotocol/server-sequential-thinking', { startup_timeout_sec: DEFAULT_MCP_STARTUP_TIMEOUT_SEC }, DEFAULT_MCP_STARTUP_TIMEOUT_TOML) }; // Append --features arg for supabase after dlxServer builds the base