zeroclaw-labs/zeroclaw · error

No auth config found for toolkit '{app_name}'. Create one in

Error message

No auth config found for toolkit '{app_name}'. Create one in Composio first.

What it means

resolve_auth_config_id got HTTP 200 from GET /auth_configs but the items array is empty for toolkit_slug={app} — note show_disabled=true is already in the query, so disabled configs would still be listed. The Composio workspace behind the API key has no auth config (app credential) for that toolkit, so there is nothing to mint an OAuth link against. Raised from action='connect' when auth_config_id is omitted; the Tool wrapper surfaces it as 'Failed to get connection URL: No auth config found for toolkit ...' with success=false.

Source

Thrown at crates/zeroclaw-tools/src/composio.rs:535

                ("toolkit_slug", app_name),
                ("show_disabled", "true"),
                ("limit", "25"),
            ])
            .send()
            .await?;

        if !resp.status().is_success() {
            let err = response_error(resp).await;
            anyhow::bail!("Composio v3 auth config lookup failed: {err}");
        }

        let body: ComposioAuthConfigsResponse = resp
            .json()
            .await
            .context("Failed to decode Composio v3 auth configs response")?;

        if body.items.is_empty() {
            anyhow::bail!(
                "No auth config found for toolkit '{app_name}'. Create one in Composio first."
            );
        }

        let preferred = body
            .items
            .iter()
            .find(|cfg| cfg.is_enabled())
            .or_else(|| body.items.first())
            .context("No usable auth config returned by Composio")?;

        Ok(preferred.id.clone())
    }
}

#[async_trait]
impl Tool for ComposioTool {
    fn name(&self) -> &str {

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Create the auth config for the toolkit in the Composio dashboard (same account/workspace as the API key), then retry action='connect'.
  2. Confirm the app slug is the exact toolkit slug (check with action='list').
  3. If you already know the config id, pass auth_config_id to skip resolution entirely.
  4. Verify the API key's workspace actually holds the config.

Example fix

// before: no auth config for 'linear' in this workspace yet
let args = json!({"action": "connect", "app": "linear"});

// after: create the config in Composio first, or address it directly
let args = json!({"action": "connect", "auth_config_id": "<id from the Composio dashboard>"});
Defensive patterns

Strategy: validation

Validate before calling

// Pre-check the same endpoint the tool uses before offering 'connect'
let resp = client
    .get("https://backend.composio.dev/api/v3/auth_configs")
    .header("x-api-key", api_key)
    .query(&[("toolkit_slug", app), ("show_disabled", "true")])
    .send()
    .await?;
let body: serde_json::Value = resp.json().await?;
if body["items"].as_array().map_or(true, |a| a.is_empty()) {
    anyhow::bail!("no auth config for '{app}'; create one in Composio first");
}

Try / catch

match tool.execute(json!({"action": "connect", "app": app})).await {
    Ok(r) if r.success => { /* open redirect_url */ }
    Ok(r) if r.error.clone().unwrap_or_default().contains("No auth config found") => {
        // route the user to Composio workspace setup instead of retrying
    }
    other => { /* other failures */ }
}

Prevention

When it happens

Trigger: action='connect' with app='github' before any GitHub auth config exists in the Composio workspace; an app slug that matches no toolkit so the filtered list comes back empty; the config lives in a different workspace than the API key.

Common situations: First-time integration setup where developers assume Composio ships default credentials per app; personal vs organization workspace key mix-ups; slug spelling mistakes that silently match nothing.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/b6ea29bcfda2b8e6. Report an issue: GitHub.