Kuberwastaken/claurst · error · anyhow::Error
failed to spawn rmcp stdio child for
Error message
failed to spawn rmcp stdio child for '{}': {} What it means
TokioChildProcess::new failed while spawning the MCP server's stdio child process for the configured command. The OS-level spawn failed — executable not found on PATH, permission denied, or exec error — before any MCP handshake occurred.
Solutions
- Verify the command exists on PATH (or use an absolute path) and is executable
- Check execute permissions and dependencies (interpreter/runtime) of the MCP server binary
- Look for OS-level errors in the appended error text for the exact cause
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src-rust/crates/mcp/src/rmcp_backend.rs:126 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of Kuberwastaken/claurst@b0637c97ec (2026-09-10).
Data as JSON: /api/errors/61e2bcb28e457042.
Report an issue: GitHub.
Appendix: source
Thrown at src-rust/crates/mcp/src/rmcp_backend.rs:126
#[allow(dead_code)]
running: Mutex<RunningService<RoleClient, RmcpNotificationClient>>,
notifications_rx: Arc<Mutex<mpsc::UnboundedReceiver<Value>>>,
}
impl RmcpClientBackend {
pub async fn connect_stdio(
config: &claurst_core::config::McpServerConfig,
) -> anyhow::Result<Self> {
let command = config
.command
.clone()
.ok_or_else(|| anyhow::anyhow!("MCP server '{}' has no command configured", config.name))?;
let transport = TokioChildProcess::new(Command::new(&command).configure(|cmd| {
cmd.args(&config.args);
cmd.envs(&config.env);
}))
.map_err(|e| anyhow::anyhow!("failed to spawn rmcp stdio child for '{}': {}", config.name, e))?;
let client_info = build_client_info(rmcp_model::ProtocolVersion::default());
Self::connect_with_transport(config, transport, client_info, "stdio").await
}
pub async fn connect_http(
config: &claurst_core::config::McpServerConfig,
auth_token: Option<String>,
protocol_version: rmcp_model::ProtocolVersion,
) -> anyhow::Result<Self> {
let endpoint = config
.url
.clone()
.ok_or_else(|| anyhow::anyhow!("MCP server '{}' has no URL configured", config.name))?;
let mut transport_config = StreamableHttpClientTransportConfig::with_uri(endpoint);
if let Some(token) = auth_token {
transport_config = transport_config.auth_header(token);View on GitHub (pinned to b0637c97ec)