The Problem
MCP servers expose multiple tools, but there is no built-in health monitoring. A tool can start returning errors, timing out, or producing malformed responses, and no one notices until a user reports a broken workflow days later. The MCP protocol does not define health check endpoints, and most server implementations have no observability layer. Teams running multiple MCP servers in production are flying blind on tool reliability.
The Scavio Solution
Scavio's consistent response schema and explicit error codes make it trivial to build health checks for your search tools. You write a cron that calls each tool with a known-good query, validates the response schema, checks latency, and alerts on degradation. Because Scavio's responses are typed and predictable, your health check can assert on specific fields rather than just checking for a 200 status code. You get signal on partial degradation, not just total outages.
Before
Before Scavio, MCP tool failures were invisible until users reported broken workflows. No one knew which tools were degraded, and mean time to detection was measured in days.
After
After Scavio, a simple health check cron validates every search tool every hour. Degradation triggers alerts within minutes, and the team fixes issues before users notice.
Who It Is For
Platform engineers and SRE teams running MCP servers in production who need visibility into tool-level health. Anyone whose users discover MCP tool failures before the engineering team does.
Key Benefits
- Predictable response schema enables deep health validation
- Explicit error codes distinguish partial from total failures
- Health check runs in seconds with minimal API credit usage
- Catches latency degradation before it becomes a timeout
- Alerting integrates with any webhook, Slack, or PagerDuty endpoint
Python Example
import requests
import time
import json
API_KEY = "your_scavio_api_key"
PLATFORMS = ["google", "youtube", "amazon", "walmart", "reddit"]
TEST_QUERIES = {
"google": "python tutorial",
"youtube": "coding tutorial",
"amazon": "wireless mouse",
"walmart": "paper towels",
"reddit": "programming advice",
}
def check_tool_health(platform: str) -> dict:
start = time.time()
try:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": TEST_QUERIES[platform]},
timeout=15,
)
latency = round((time.time() - start) * 1000)
if res.status_code != 200:
return {"platform": platform, "status": "error", "code": res.status_code, "latency_ms": latency}
data = res.json()
has_results = bool(data.get("organic"))
return {
"platform": platform,
"status": "healthy" if has_results else "degraded",
"result_count": len(data.get("organic", [])),
"latency_ms": latency,
}
except requests.exceptions.Timeout:
return {"platform": platform, "status": "timeout", "latency_ms": 15000}
except Exception as e:
return {"platform": platform, "status": "exception", "error": str(e)}
def run_health_check():
results = [check_tool_health(p) for p in PLATFORMS]
unhealthy = [r for r in results if r["status"] != "healthy"]
if unhealthy:
print(f"ALERT: {len(unhealthy)} tools degraded")
print(json.dumps(unhealthy, indent=2))
else:
print(f"All {len(PLATFORMS)} tools healthy")
return results
run_health_check()JavaScript Example
const API_KEY = "your_scavio_api_key";
const TEST_QUERIES = {
google: "python tutorial",
youtube: "coding tutorial",
amazon: "wireless mouse",
walmart: "paper towels",
reddit: "programming advice",
};
async function checkToolHealth(platform) {
const start = Date.now();
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 15000);
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform, query: TEST_QUERIES[platform] }),
signal: controller.signal,
});
clearTimeout(timeout);
const latencyMs = Date.now() - start;
if (!res.ok) return { platform, status: "error", code: res.status, latencyMs };
const data = await res.json();
const hasResults = (data.organic?.length ?? 0) > 0;
return { platform, status: hasResults ? "healthy" : "degraded", resultCount: data.organic?.length ?? 0, latencyMs };
} catch (err) {
return { platform, status: err.name === "AbortError" ? "timeout" : "exception", latencyMs: Date.now() - start };
}
}
const platforms = Object.keys(TEST_QUERIES);
const results = await Promise.all(platforms.map(checkToolHealth));
const unhealthy = results.filter((r) => r.status !== "healthy");
if (unhealthy.length) {
console.log(`ALERT: ${unhealthy.length} tools degraded`);
console.log(JSON.stringify(unhealthy, null, 2));
} else {
console.log(`All ${platforms.length} tools healthy`);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews
YouTube
Video search with transcripts and metadata
Amazon
Product search with prices, ratings, and reviews
Walmart
Product search with pricing and fulfillment data
Community, posts & threaded comments from any subreddit
TikTok
Trending video, creator, and product discovery