tinyhumansai/openhuman · error

Smithery GET {qualified_name} returned HTTP {status}: {}

Error message

Smithery GET {qualified_name} returned HTTP {status}: {}

What it means

Raised when fetching a single MCP server's detail — get(config, qualified_name) with the name URL-encoded — and Smithery answers non-2xx. The dominant real case is 404: the qualified name (e.g. io.github.example/server) no longer exists upstream because the package was renamed, removed, or its version qualifier went away. Auth, rate-limit, and outage statuses surface here exactly as they do in search; a successful result is cached under 'smithery:detail:<qualified_name>'.

Source

Thrown at src/openhuman/mcp/registry/registries/smithery.rs:129

        tracing::debug!("[smithery] get fetching qualified_name={qualified_name}");

        let client = http_client()?;
        let url = format!(
            "{SMITHERY_BASE}/servers/{}",
            urlencoding_encode(qualified_name)
        );
        let req = apply_auth(
            config,
            client.get(&url).header("Accept", "application/json"),
        );

        let resp = req.send().await.context("Smithery get request failed")?;
        let status = resp.status();
        let body = resp.text().await.context("Smithery get read failed")?;

        if !status.is_success() {
            anyhow::bail!(
                "Smithery GET {qualified_name} returned HTTP {status}: {}",
                &body[..body.len().min(200)]
            );
        }

        let mut detail: SmitheryServerDetail = serde_json::from_str(&body)
            .with_context(|| format!("Failed to parse Smithery detail: {body}"))?;
        detail.source = SOURCE_SMITHERY.to_string();

        let _ = store::set_cached(config, &cache_key, &body);
        tracing::debug!(
            "[smithery] get ok qualified_name={qualified_name} connections={}",
            detail.connections.len()
        );

        Ok(detail)
    }
}

View on GitHub (pinned to 7491200858)

Solutions

  1. If 404: re-run a catalog search for the server's short name and use the qualified name it returns now — the old one is gone upstream.
  2. If the server vanished upstream, uninstall the stale local entry (store::delete_server) so UI lists stop referencing it.
  3. For 401/403/429/5xx, apply the same fixes as for search errors: credentials, backoff, proxy allowlisting.
  4. If a renamed package is served from cache, note the detail cache key format (smithery:detail:<qualified_name>) when investigating staleness.

Example fix

// before
let detail = registry.get(config, &qualified_name).await?;

// after — on 404, re-resolve the current qualified name via search, then retry
let detail = match registry.get(config, &qualified_name).await {
    Ok(d) => d,
    Err(e) if e.to_string().contains("HTTP 404") => {
        let results = registry.search(config, &short_name, 1, 20).await?;
        let fresh = results.servers.iter()
            .find(|s| s.qualified_name.contains(&short_name))
            .ok_or_else(|| anyhow::anyhow!("'{qualified_name}' no longer exists in the Smithery catalog"))?;
        registry.get(config, &fresh.qualified_name).await?
    }
    Err(e) => return Err(e),
};
Defensive patterns

Strategy: validation

Validate before calling

// Resolve the current qualified name from a fresh search before the detail GET
let results = registry.search(config, &short_name, 1, 20).await?;
let listed = results.servers.iter().map(|s| s.qualified_name.clone()).collect::<Vec<_>>();
if !listed.contains(&qualified_name) {
    anyhow::bail!("stale qualified name {qualified_name}; catalog now lists {listed:?}");
}

Try / catch

Match err.to_string() for `HTTP 404` and treat it as 'package removed/renamed' — offer a re-search or uninstall instead of a generic failure. Other statuses follow the search-error triage: auth vs transient vs network.

Prevention

When it happens

Trigger: Calling SmitheryRegistry::get with a qualified_name captured from stale metadata — a previously cached detail, a saved install record, or a hardcoded name — after the upstream package was deleted or renamed; also 401/403/429/5xx under the same conditions as the search endpoint.

Common situations: Reinstalling or updating a server whose upstream repo was renamed; saved install records referencing a version-pinned qualified name after the publisher cut a new release; registry outages; corporate proxies.

Related errors


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/d9607448a02d58bd. Report an issue: GitHub.