tinyhumansai/openhuman · error · anyhow::Error
MCP tools/list response missing `tools`
Error message
MCP tools/list response missing `tools`
What it means
The HTTP MCP server's tools/list reply succeeded at the JSON-RPC layer but its result object lacked the "tools" array. The server responded to the wrong shape or returned an empty object — a server-side protocol violation.
Source
Thrown at src/openhuman/mcp/http_client/client.rs:318
Ok(init)
}
pub async fn list_tools(&self) -> anyhow::Result<Vec<McpRemoteTool>> {
self.initialize().await?;
let result = self
.send_jsonrpc(
"tools/list",
json!({}),
RequestOptions::standard("tools/list", None, None),
)
.await?
.result;
let tools = serde_json::from_value::<Vec<McpRemoteTool>>(
result
.get("tools")
.cloned()
.ok_or_else(|| anyhow::anyhow!("MCP tools/list response missing `tools`"))?,
)?;
let mut state = self.state.lock();
state.cached_tools = tools
.iter()
.cloned()
.map(|tool| (tool.name.clone(), tool))
.collect();
Ok(tools)
}
pub async fn call_tool(
&self,
name: &str,
arguments: Value,
) -> anyhow::Result<McpServerToolResult> {
self.initialize().await?;
let cached_tool = { self.state.lock().cached_tools.get(name).cloned() };
let tool = if let Some(tool) = cached_tool {View on GitHub (pinned to 7491200858)
Solutions
- Capture and inspect the raw result object to see what the server returned
- Verify the server's MCP protocol version matches LATEST_PROTOCOL_VERSION sent in initialize
- Report or upgrade the remote server if it never populates tools
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/openhuman/mcp/http_client/client.rs:318 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/68acce995ceba2bf.
Report an issue: GitHub.