tinyhumansai/openhuman · error · anyhow::Error

MCP official registry GET {qualified_name} returned HTTP {st

Error message

MCP official registry GET {qualified_name} returned HTTP {status}: {}

What it means

Fetching a specific server's versions from the official MCP registry (registry.mcpservers.org / npm-backed `get {qualified_name}`) returned a non-2xx; the message includes the qualified name, status and first 200 chars of the body. This is the per-server detail lookup used when resolving/installing one registry entry.

Source

Thrown at src/openhuman/mcp/registry/registries/mcp_official.rs:211

        // latest version.
        let client = http_client()?;
        let url = format!(
            "{}/v0/servers/{}/versions",
            base_url(config),
            urlencoding_encode(qualified_name)
        );
        tracing::debug!("[mcp-official] get fetching {url}");
        let req = apply_auth(
            config,
            client.get(&url).header("Accept", "application/json"),
        );

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

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

        // The versions endpoint returns the same envelope array as the
        // list endpoint. Extract the raw JSON for the first (latest)
        // server object and cache it so subsequent calls skip the HTTP
        // round-trip.
        let raw: Value = serde_json::from_str(&body)
            .with_context(|| format!("Failed to re-parse MCP official versions: {body}"))?;
        let server_value = raw
            .pointer("/servers/0/server")
            .ok_or_else(|| anyhow::anyhow!("no versions found for {qualified_name}"))?;
        let server_json = server_value.to_string();
        let _ = store::set_cached(config, &cache_key, &server_json);

        let server: OfficialServer = serde_json::from_value(server_value.clone())

View on GitHub (pinned to 7491200858)

Solutions

  1. Verify the qualified name exists on the registry (search it via the registry UI/API first).
  2. If 401/403, refresh or remove the registry auth token in config.
  3. For 5xx/timeout, retry later or check the registry's status page.
  4. Ensure the host can reach the registry domain (proxy/egress rules).
Defensive patterns

Strategy: retry

Try / catch

match registry_get(qualified_name).await {
    Err(e) if e.to_string().contains("HTTP 404") => Err(e), // name typo: do not retry
    Err(e) => { backoff().await; registry_get(qualified_name).await } // transient: retry once
    ok => ok,
}

Prevention

When it happens

Trigger: `mcp_registry` get-by-qualified-name for a package that does not exist (404), registry auth token invalid/absent where required (401/403), registry outage (5xx), or network egress blocked from the environment.

Common situations: Typo'd qualified name (`@scope/server` casing or scope mistakes); package unpublished/renamed on npm; corporate firewall blocking registry.mcpservers.org; stale auth token for authenticated registry access.

Related errors


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