failecho
Check what other agents hit the same tool failure — and what recovery worked. Ask before retrying.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"failecho": {
"command": "npx",
"args": [
"failecho-mcp"
]
}
}
}Runnable packages
0.1.1stdio0.1.1stdioRemote endpoints
https://failecho.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟢check_tool_failure(service, operation, error_type, error_message, error_code, ...)
Use FailEcho when another tool fails, before retrying blindly. Call this BEFORE retrying a failed tool, API or MCP call. Returns what other agents saw for this exact failure -- status (HEALTHY/DEGRADED/MAJOR/INSUFFICIENT_DATA), counts, the recovery actions that worked with success rates, and one `recommendation` (or `skip` when nothing tried recently has worked; null when evidence is thin -- a real answer). Works on your own history before anyone else joins. Free, anonymous, stores nothing, never rate limited.
Input Schema
{
"type": "object",
"properties": {
"service": {
"description": "The MCP server's own name (serverInfo.name) or the API host, e.g. 'api.github.com'. Not your client's local alias.",
"maxLength": 128,
"type": "string"
},
"operation": {
"description": "The tool or endpoint as the server names it, e.g. 'create_issue', not 'mcp__github__create_issue'.",
"maxLength": 128,
"type": "string"
},
"error_type": {
"maxLength": 64,
"type": "string",
"description": "Failure class, e.g. 'validation_error', 'timeout', 'rate_limit', 'auth_error'."
},
"error_message": {
"maxLength": 2000,
"type": "string",
"description": "The error text only; normalized server-side, not stored by this call."
},
"error_code": {
"maxLength": 32,
"type": "string",
"description": "Code, e.g. '422', 'ECONNRESET'."
},
"version": {
"maxLength": 64,
"type": "string",
"description": "Service/tool version, if known."
},
"schema_hash": {
"maxLength": 64,
"type": "string",
"description": "Short hash of the tool schema you used (separates 'API broke' from 'schema stale')."
},
"reporter_id": {
"maxLength": 200,
"type": "string",
"description": "Optional stable agent id; hashed, never stored raw. Lets from_other_agents be answered."
},
"verbose": {
"default": false,
"description": "Full record (timestamps, rates, effective counts, every action). Default: the compact answer.",
"type": "boolean"
}
},
"required": [
"service",
"operation"
]
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "check_tool_failureDictOutput"
}🟡report_tool_failure(service, operation, error_type, error_message, error_code, ...)
Report a failed tool/API/MCP call so others can recognise it; call after a failure, alongside check_tool_failure. PRIVACY: this is a shared network. Send failure metadata only -- never prompts, tool arguments, tool results, request or response bodies, headers, cookies, API keys, tokens, emails or user content. Error text is normalized server-side and the raw string discarded. A stable reporter_id (hashed, never stored raw) makes you one reporter instead of anonymous noise. Writes are rate limited per client.
Input Schema
{
"type": "object",
"properties": {
"service": {
"description": "The MCP server's own name (serverInfo.name) or the API host, e.g. 'api.github.com'. Not your client's local alias.",
"maxLength": 128,
"type": "string"
},
"operation": {
"description": "The tool or endpoint as the server names it, e.g. 'create_issue', not 'mcp__github__create_issue'.",
"maxLength": 128,
"type": "string"
},
"error_type": {
"maxLength": 64,
"type": "string",
"description": "Short failure class, e.g. 'validation_error'."
},
"error_message": {
"maxLength": 2000,
"type": "string",
"description": "Error text. Normalized before storage; no secrets please."
},
"error_code": {
"maxLength": 32,
"type": "string",
"description": "Protocol/vendor code, e.g. '422'."
},
"version": {
"maxLength": 64,
"type": "string",
"description": "Version of the service/tool."
},
"schema_hash": {
"maxLength": 64,
"type": "string",
"description": "Short hash of the tool schema used."
},
"latency_ms": {
"minimum": 0,
"type": "integer",
"description": "Observed call latency in milliseconds."
},
"reporter_id": {
"maxLength": 200,
"type": "string",
"description": "Optional stable identifier for your agent. Salted and hashed on arrival; never stored raw."
}
},
"required": [
"service",
"operation"
]
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "report_tool_failureDictOutput"
}⚪report_tool_success(service, operation, version, schema_hash, latency_ms, ...)
Report that a call SUCCEEDED. Failure rates are failures over all calls; a network that only hears failures cannot tell broken from busy. No error data -- service, operation, version, latency.
Input Schema
{
"type": "object",
"properties": {
"service": {
"description": "The MCP server's own name (serverInfo.name) or the API host, e.g. 'api.github.com'. Not your client's local alias.",
"maxLength": 128,
"type": "string"
},
"operation": {
"description": "The tool or endpoint as the server names it, e.g. 'create_issue', not 'mcp__github__create_issue'.",
"maxLength": 128,
"type": "string"
},
"version": {
"maxLength": 64,
"type": "string",
"description": "Version of the service/tool."
},
"schema_hash": {
"maxLength": 64,
"type": "string",
"description": "Short hash of the tool schema used."
},
"latency_ms": {
"minimum": 0,
"type": "integer",
"description": "Observed call latency in milliseconds."
},
"reporter_id": {
"maxLength": 200,
"type": "string",
"description": "Optional stable agent id; hashed, never stored raw."
}
},
"required": [
"service",
"operation"
]
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "report_tool_successDictOutput"
}🟢report_recovery_outcome(fingerprint, action, successful, reporter_id)
After acting on a failure -- retry, wait, refresh_schema, reconnect, use_fallback, reauthenticate -- report whether it worked. Every recommendation others get is built from these. Pass the fingerprint from check_tool_failure or report_tool_failure; one outcome per attempt.
Input Schema
{
"type": "object",
"properties": {
"fingerprint": {
"description": "From check_tool_failure or report_tool_failure (32 hex chars).",
"pattern": "^[0-9a-f]{32}$",
"type": "string"
},
"action": {
"description": "What you tried, e.g. 'refresh_schema' ([a-z0-9_.-]).",
"maxLength": 64,
"type": "string"
},
"successful": {
"description": "True when the action resolved the failure.",
"type": "boolean"
},
"reporter_id": {
"maxLength": 200,
"type": "string",
"description": "Optional stable agent id; hashed, never stored raw."
}
},
"required": [
"fingerprint",
"action",
"successful"
]
}Output Schema
{
"type": "object",
"additionalProperties": true,
"title": "report_recovery_outcomeDictOutput"
}Community
Evidence