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
- Create the auth config for the toolkit in the Composio dashboard (same account/workspace as the API key), then retry action='connect'.
- Confirm the app slug is the exact toolkit slug (check with action='list').
- If you already know the config id, pass auth_config_id to skip resolution entirely.
- 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
- Create auth configs for every app you plan to connect before enabling connect in agent flows
- Keep a per-environment checklist of toolkits with configs
- Pass explicit auth_config_id in automated/CI environments
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
- Composio v3 connect failed: {err}
- Composio v3 connected accounts lookup failed: {err}
- Composio v3 NLP execute failed on candidates ({v3_error_summ
- Composio execute failed on v3 ({v3_error_summary}){prime_suf
- Composio v3 auth config lookup failed: {err}
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/b6ea29bcfda2b8e6.
Report an issue: GitHub.