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

  1. Verify the command exists on PATH (or use an absolute path) and is executable
  2. Check execute permissions and dependencies (interpreter/runtime) of the MCP server binary
  3. 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)