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
- Verify the qualified name exists on the registry (search it via the registry UI/API first).
- If 401/403, refresh or remove the registry auth token in config.
- For 5xx/timeout, retry later or check the registry's status page.
- 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
- Verify qualified names via search before installing by name.
- Handle 401/403 by refreshing the registry auth token rather than retrying blindly.
- Cache per-server version metadata so repeated installs skip the GET.
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
- MCP official registry returned HTTP {status}: {}
- Smithery returned HTTP {status}: {}
- Smithery GET {qualified_name} returned HTTP {status}: {}
- MCP events GET {} — {}
- MCP DELETE failed with {}
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/65c9aacaf0df263e.
Report an issue: GitHub.