ScavioScavio
ToolsPricing
Sign InsGet Startedg
  1. Home
  2. Tutorials
  3. How to Fix Hermes Agent Web Search Failures
Tutorial

How to Fix Hermes Agent Web Search Failures

Hermes Agent web_search returns empty results? Learn how to replace the unreliable DuckDuckGo backend with a reliable search API via MCP.

Get Free API KeyAPI Docs

Hermes Agent's built-in web_search skill uses DuckDuckGo scraping which frequently fails with empty results, rate limiting, or timeouts. This tutorial replaces it with a reliable search API backend via MCP, fixing the 'web_search returned no results' error permanently.

Prerequisites

  • Hermes Agent installed (v0.10+)
  • A Scavio API key from scavio.dev

Walkthrough

Step 1: Diagnose the issue

Hermes web_search fails because DuckDuckGo rate-limits automated requests. Check your Hermes logs for the error pattern.

Bash
# Common error in Hermes logs:
# [WARN] web_search: DuckDuckGo returned 0 results for query 'python fastapi'
# [ERROR] web_search: Request timed out after 10s
# [WARN] web_search: Rate limited by DuckDuckGo (429)

# Check your Hermes config:
cat ~/.hermes/config.yaml | grep -A5 web_search

Step 2: Add Scavio MCP as search provider

Configure Hermes to use Scavio MCP server for web search instead of DuckDuckGo.

# In ~/.hermes/config.yaml, add MCP server:
mcp_servers:
  scavio:
    url: "https://mcp.scavio.dev/mcp"
    headers:
      x-api-key: "your_scavio_api_key"
    tools:
      - google_search
      - reddit_search
      - youtube_search

Step 3: Create a search skill override

Override the default web_search skill to use the MCP-provided google_search tool.

# Create ~/.hermes/skills/reliable_search.yaml:
name: reliable_search
description: Web search using Scavio API (replaces DuckDuckGo)
trigger: "search for|look up|find information about|web search"
action: |
  Use the google_search tool from the scavio MCP server.
  For Reddit-specific queries, use reddit_search instead.
  For video content, use youtube_search.
  Always return the top 5 results with title, URL, and snippet.

Step 4: Disable default web_search

Prevent Hermes from falling back to the broken DuckDuckGo scraper.

# In ~/.hermes/config.yaml, disable built-in web_search:
skills:
  disabled:
    - web_search  # Disable DuckDuckGo-based search
  # reliable_search skill (above) will handle search queries instead

Step 5: Test the fix

Verify search works reliably with the new backend.

Bash
# In Hermes chat:
> Search for best Python web framework 2026

# Expected: Hermes uses scavio google_search tool, returns results
# Previously: Empty results or timeout from DuckDuckGo

# Test Reddit search:
> Search Reddit for Python framework recommendations

# Test YouTube search:
> Find YouTube tutorials about FastAPI

Python Example

Python
import requests, os

# Scavio has one endpoint per platform - there is no dispatcher endpoint and no
# `platform` request param, so the selector lives in your code.
SCAVIO = "https://api.scavio.dev"
SCAVIO_ENDPOINTS = {
    "google": "/api/v2/google",
    "reddit": "/api/v1/reddit/search",
    "youtube": "/api/v1/youtube/search",
    "amazon": "/api/v1/amazon/search",
    "walmart": "/api/v1/walmart/search",
}
SCAVIO_QUERY_KEY = {"youtube": "search"}
SCAVIO_RESULTS_KEY = {"google": "organic_results", "reddit": "results",
                      "youtube": "results", "amazon": "products", "walmart": "products"}

def scavio_url(platform):
    return SCAVIO + SCAVIO_ENDPOINTS[platform or "google"]

def scavio_body(platform, query):
    return {SCAVIO_QUERY_KEY.get(platform or "google", "query"): query}

def scavio_payload(payload, platform="google"):
    """Google v2 passes Google's response through as-is; every other endpoint
    wraps its payload in `data`. Item fields differ per platform (see
    https://scavio.dev/docs), so only the result list is normalised here."""
    platform = platform or "google"
    out = payload if platform == "google" else payload["data"]
    return {**out, "results": out.get(SCAVIO_RESULTS_KEY[platform], [])}


def hermes_search(query: str, platform: str = 'google') -> list:
    resp = requests.post(scavio_url(platform), headers={'Authorization': 'Bearer ' + os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}, json=scavio_body(platform, query), timeout=10)
    return scavio_payload(resp.json(), platform).get('results', [])[:5]

JavaScript Example

JavaScript

// Scavio has one endpoint per platform - there is no dispatcher endpoint and no
// `platform` request param, so the selector lives in your code.
const SCAVIO = "https://api.scavio.dev";
const SCAVIO_ENDPOINTS = {
  google: "/api/v2/google",
  reddit: "/api/v1/reddit/search",
  youtube: "/api/v1/youtube/search",
  amazon: "/api/v1/amazon/search",
  walmart: "/api/v1/walmart/search",
};
const SCAVIO_QUERY_KEY = { youtube: "search" };
const SCAVIO_RESULTS_KEY = { google: "organic_results", reddit: "results",
  youtube: "results", amazon: "products", walmart: "products" };

const scavioUrl = (platform) => SCAVIO + SCAVIO_ENDPOINTS[platform || "google"];
const scavioBody = (platform, query) =>
  ({ [SCAVIO_QUERY_KEY[platform || "google"] || "query"]: query });

// Google v2 passes Google's response through as-is; every other endpoint wraps
// its payload in `data`. Item fields differ per platform (see
// https://scavio.dev/docs), so only the result list is normalised here.
function scavioPayload(json, platform = "google") {
  const p = platform || "google";
  const out = p === "google" ? json : json.data;
  return { ...out, results: out[SCAVIO_RESULTS_KEY[p]] || [] };
}

async function hermesSearch(query, platform = 'google') {
  const resp = await fetch(scavioUrl("google"), {
    method: 'POST',
    headers: {'Authorization': `Bearer ${process.env.SCAVIO_API_KEY}`, 'Content-Type': 'application/json'},
    body: JSON.stringify(scavioBody("google", query))
  });
  return (scavioPayload(await resp.json(), "google")).organic?.slice(0, 5) || [];
}

Expected Output

JSON
Hermes Agent with reliable web search via Scavio MCP, replacing the broken DuckDuckGo scraper with a managed API backend.

Related Tutorials

  • How to Give Hermes Agent Web Search Access
  • How to Build a Hermes Agent Search Tool

Frequently Asked Questions

Most developers complete this tutorial in 15 to 30 minutes. You will need a Scavio API key (free tier works) and a working Python or JavaScript environment.

Hermes Agent installed (v0.10+). A Scavio API key from scavio.dev. A Scavio API key gives you 50 free credits on signup.

Yes. The free tier includes 50 credits on signup, which is more than enough to complete this tutorial and prototype a working solution.

Scavio has a native LangChain package (langchain-scavio), an MCP server, and a plain REST API that works with any HTTP client. This tutorial uses the raw REST API, but you can adapt to your framework of choice.

Related Resources

Best Of

Best Search API for Hermes Agent in 2026

Read more
Best Of

Best Search Backends for Hermes Agent in 2026

Read more
Use Case

MCP Search Gateway for Multi-Agent Systems

Read more
Use Case

Hermes Agent Web Search

Read more
Solution

Ground Hermes Agent with Live Search

Read more
Solution

Fix Hermes Web Search Reliability with a Dedicated API

Read more

Start Building

Hermes Agent web_search returns empty results? Learn how to replace the unreliable DuckDuckGo backend with a reliable search API via MCP.

Get Free API KeyRead the Docs
ScavioScavio

One scraper API for every social, search and ecommerce platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy