Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

Advanced Searxng Search Skill

v0.1.1

Perform privacy-focused metasearch using local or remote SearXNG instances with retries, timeouts, category, time, and engine-specific filters.

0· 438·1 current·1 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for elmaslouhymouaad/searxng-search-skill.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Advanced Searxng Search Skill" (elmaslouhymouaad/searxng-search-skill) from ClawHub.
Skill page: https://clawhub.ai/elmaslouhymouaad/searxng-search-skill
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Canonical install target

openclaw skills install elmaslouhymouaad/searxng-search-skill

ClawHub CLI

Package manager switcher

npx clawhub@latest install searxng-search-skill
Security Scan
VirusTotalVirusTotal
Suspicious
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
The code implements an HTTP client that queries a user-supplied SearXNG instance, supports retries, timeouts, categories, and export — which matches the skill name/description. There are no unrelated network endpoints or extraneous credential requests in the code. However, the registry metadata lists no required env vars while SKILL.md and the code rely on environment/configuration (SEARXNG_URL, timeouts, etc.), so the declared requirements are incomplete.
Instruction Scope
SKILL.md instructs the agent to read configuration from .env or config.json and then call the library; the code only reads those configuration values and performs HTTP requests to the configured SearXNG instance. The instructions do not ask the agent to read arbitrary user files, secrets unrelated to SearXNG, or to exfiltrate results to unknown endpoints.
!
Install Mechanism
The registry lists no install spec, but the bundle includes setup.py/pyproject and SKILL.md contains pip install metadata. Inconsistencies: SKILL.md metadata/homepage point to 'yourusername' while README clone URL points to a different repo (mouaad-ops), and setup.py defines a console_script entry 'searxng-skill=searxng_skill.cli:main' while no searxng_skill/cli.py is present in the file list. These packaging/mismatch issues increase supply-chain risk (could be incomplete, mispackaged, or a stale copy).
Credentials
The skill does not request secrets or cloud credentials and only needs a SearXNG instance URL and non-sensitive options (timeouts, safesearch, user agent). However, the registry declares no required env vars while SKILL.md recommends several (SEARXNG_URL, SEARXNG_TIMEOUT, etc.). This mismatch is minor but should be clarified in registry metadata.
Persistence & Privilege
The skill does not request always:true, does not write to other skills' configs, and only provides methods to save its own config or export search results to files. It requires normal network access to the configured SearXNG instance; autonomous invocation is allowed (default) but not unusual for skills.
What to consider before installing
This package appears to implement exactly what it says (a client for SearXNG instances) and does not request unrelated credentials. However, several red flags should be resolved before installing: 1) the registry lists no install spec but the skill includes packaging metadata and SKILL.md suggests pip install — verify the package source (PyPI or a trustworthy GitHub repo) before running pip; 2) setup.py advertises a CLI entrypoint searxng_skill.cli:main but no cli.py is present in the bundle — that suggests a mispackaged or incomplete release; 3) SKILL.md/README reference inconsistent repository/usernames — confirm the authoritative upstream; 4) prefer pointing the skill at a local or trusted SearXNG instance (default is localhost) rather than accepting a remote URL you don't control; and 5) if you plan to install, review the repository contents (especially any missing/extra files), run installation in a sandbox or VM, and inspect network calls (or run with network disabled) until you trust the package. If the author or a well-known source (PyPI/GitHub org) can't be confirmed, treat installation as higher risk.

Like a lobster shell, security has layers — review code before you run it.

latestvk97c0n9tzy6qqgkgaj6j640xa181wqt4
438downloads
0stars
1versions
Updated 22h ago
v0.1.1
MIT-0

SearXNG Advanced Search Skill

---
name: searxng-skill
description: Advanced Python library for SearXNG metasearch with retry logic, timeout handling, and comprehensive search patterns.
homepage: https://github.com/yourusername/searxng-skill
metadata: {"clawdbot":{"emoji":"🔍","requires":{"python":">=3.8","packages":["requests","urllib3","python-dotenv"]},"install":[{"id":"pip","kind":"pip","package":"searxng-skill","label":"Install searxng-skill (pip)"},{"id":"local","kind":"local","command":"pip install -e .","label":"Install from source"}]}}
---

# searxng-skill

Use `searxng-skill` for privacy-focused metasearch with local/remote SearXNG instances. Supports retry logic, timeout handling, and advanced search patterns.

## Setup (once)

**Environment variables (recommended)**
```bash
# Create .env file
cat > .env << EOF
SEARXNG_URL=http://localhost:8080
SEARXNG_TIMEOUT=10
SEARXNG_MAX_RETRIES=3
SEARXNG_RETRY_DELAY=1.0
SEARXNG_BACKOFF_FACTOR=2.0
SEARXNG_VERIFY_SSL=true
SEARXNG_LANGUAGE=en
EOF

Or configuration file

# Create config.json
cat > config.json << EOF
{
  "instance_url": "http://localhost:8080",
  "default_timeout": 10,
  "max_retries": 3,
  "retry_delay": 1.0,
  "backoff_factor": 2.0,
  "verify_ssl": true,
  "default_language": "en"
}
EOF

Initialize in code

from searxng_skill import SearXNGSkill, SearXNGConfig

# From environment
config = SearXNGConfig.from_env()
skill = SearXNGSkill(config=config)

# From file
config = SearXNGConfig.from_file("config.json")
skill = SearXNGSkill(config=config)

# Direct
skill = SearXNGSkill(instance_url="http://localhost:8080")

Common Commands

Basic search

from searxng_skill import SearXNGSkill

skill = SearXNGSkill(instance_url="http://localhost:8080")
results = skill.search("Python programming")

# Access results
for result in results["results"][:10]:
    print(f"{result['title']} - {result['url']}")

Category search

from searxng_skill import SearchCategory

# Single category
results = skill.search("AI", categories=[SearchCategory.NEWS])

# Multiple categories
results = skill.search(
    "climate change",
    categories=[SearchCategory.NEWS, SearchCategory.SCIENCE]
)

Time-filtered search

from searxng_skill import TimeRange

# Recent news (last 24 hours)
news = skill.news_search("AI breakthrough", time_range=TimeRange.DAY)

# Last week
results = skill.search("Python", time_range=TimeRange.WEEK)

Image search

from searxng_skill import SafeSearch

images = skill.image_search(
    "nature photography",
    safesearch=SafeSearch.STRICT
)

for img in images[:10]:
    print(f"{img['title']}: {img.get('img_src', 'N/A')}")

Video search

videos = skill.video_search("Python tutorial")

for video in videos[:5]:
    print(f"{video['title']} ({video.get('duration', 'N/A')})")

Advanced search with operators

results = skill.advanced_search(
    query="machine learning",
    exact_phrase="deep learning",
    exclude_words=["tutorial", "beginner"],
    site="github.com",
    filetype="pdf"
)

Engine-specific search

results = skill.search(
    "quantum computing",
    engines=["google", "duckduckgo", "wikipedia"]
)

Structured search

response = skill.search_structured("artificial intelligence")

print(f"Query: {response.query}")
print(f"Total: {response.number_of_results}")

for result in response.results[:5]:
    print(f"{result.title} [{result.engine}]")
    print(f"  {result.url}")
    print(f"  Score: {result.score}\n")

Autocomplete

suggestions = skill.autocomplete("artificial int")
# ['artificial intelligence', 'artificial intelligence news', ...]

Multi-category search

categorized = skill.multi_category_search(
    "climate change",
    categories=[
        SearchCategory.GENERAL,
        SearchCategory.NEWS,
        SearchCategory.SCIENCE
    ]
)

for category, results in categorized.items():
    print(f"{category}: {len(results)} results")

Parallel searches

queries = ["Python", "JavaScript", "Go", "Rust"]
results = skill.parallel_search(queries, categories=[SearchCategory.IT])

for query, result_data in results.items():
    print(f"{query}: {len(result_data.get('results', []))} results")

Paginated search

# Get multiple pages
all_results = []
for page in range(1, 4):
    results = skill.search("AI", page=page)
    all_results.extend(results["results"])

print(f"Total results: {len(all_results)}")

Health check

if skill.health_check():
    print("✓ SearXNG instance is healthy")
else:
    print("✗ Instance unavailable")

Get engine info

engines = skill.get_engines_info()

for engine in engines[:10]:
    print(f"{engine.name} - {', '.join(engine.categories)}")
    print(f"  Enabled: {engine.enabled}")

Export results

from searxng_skill.utils import export_results_json, export_results_csv

results = skill.search("machine learning")

# Export to JSON
export_results_json(results, "results.json")

# Export to CSV
export_results_csv(results["results"], "results.csv")

Quick Reference

Search Categories

SearchCategory.GENERAL      # General web search
SearchCategory.IMAGES       # Image search
SearchCategory.VIDEOS       # Video search
SearchCategory.NEWS         # News articles
SearchCategory.MAP          # Maps
SearchCategory.MUSIC        # Music
SearchCategory.IT           # IT/Tech
SearchCategory.SCIENCE      # Scientific papers
SearchCategory.FILES        # File search
SearchCategory.SOCIAL_MEDIA # Social media

Time Ranges

TimeRange.DAY    # Last 24 hours
TimeRange.WEEK   # Last 7 days
TimeRange.MONTH  # Last 30 days
TimeRange.YEAR   # Last year
TimeRange.ALL    # All time

Safe Search Levels

SafeSearch.NONE     # No filtering (0)
SafeSearch.MODERATE # Moderate filtering (1)
SafeSearch.STRICT   # Strict filtering (2)

Notes

Environment variable shortcuts

  • Set SEARXNG_URL=http://localhost:8080 to avoid repeating instance URL
  • Set SEARXNG_LANGUAGE=en for default language
  • Set SEARXNG_MAX_RETRIES=5 for custom retry behavior

For scripting

  • Use format=OutputFormat.JSON for structured output (default)
  • Set verify_ssl=False for local development only
  • Implement rate limiting with time.sleep() between requests
  • Use health_check() before batch operations

Performance tips

  • Reuse SearXNGSkill instance for multiple searches
  • Use parallel_search() for independent queries
  • Cache results with functools.lru_cache for repeated queries
  • Set appropriate timeouts: fast queries (5s), complex queries (30s)

Retry behavior

  • Automatic retry with exponential backoff on timeout/connection errors
  • Default: 3 retries, 1s initial delay, 2x backoff factor
  • Customize: max_retries, retry_delay, backoff_factor
  • No retry on HTTP 4xx/5xx errors

Error handling

from searxng_skill.exceptions import TimeoutException, ConnectionException

try:
    results = skill.search("query", timeout=5)
except TimeoutException:
    print("Request timed out - try increasing timeout")
except ConnectionException:
    print("Cannot connect to instance - check URL and network")

Fallback instance

try:
    skill = SearXNGSkill(instance_url="http://localhost:8080")
    results = skill.search("query")
except ConnectionException:
    # Fallback to public instance
    skill = SearXNGSkill(instance_url="https://searx.be")
    results = skill.search("query")

Local instance setup

# Docker
docker run -d -p 8080:8080 searxng/searxng

# Verify
curl http://localhost:8080/healthz

Confirm before operations

  • Always validate query is not empty: if query.strip(): ...
  • Check results exist: if "results" in results: ...
  • Validate URLs before requests: validate_url(url)

Advanced Usage

Custom retry strategy

from searxng_skill.retry import RetryStrategy

strategy = RetryStrategy(
    max_retries=5,
    initial_delay=2.0,
    backoff_factor=1.5,
    max_delay=60.0,
    jitter=True
)

skill = SearXNGSkill(
    instance_url="http://localhost:8080",
    max_retries=5,
    retry_delay=2.0,
    backoff_factor=1.5
)

Batch processing

import time

queries = ["Python", "Java", "Go", "Rust"]

for query in queries:
    results = skill.search(query)
    print(f"{query}: {len(results['results'])} results")
    time.sleep(1)  # Rate limiting

Result deduplication

from searxng_skill.utils import deduplicate_results

results = skill.search("AI")
unique = deduplicate_results(results["results"], key="url")

Merge multiple searches

from searxng_skill.utils import merge_search_results

r1 = skill.search("Python", engines=["google"])
r2 = skill.search("Python", engines=["duckduckgo"])

merged = merge_search_results([r1, r2])

Logging

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("Searching for: Python")
results = skill.search("Python")
logger.info(f"Found {len(results['results'])} results")

API Methods

MethodPurposeReturns
search()Basic searchDict[str, Any]
search_structured()Structured searchSearchResponse
autocomplete()Get suggestionsList[str]
image_search()Image-specificList[Dict]
news_search()News-specificList[Dict]
video_search()Video-specificList[Dict]
advanced_search()With operatorsDict[str, Any]
multi_category_search()Multiple categoriesDict[str, List]
parallel_search()Multiple queriesDict[str, Dict]
health_check()Instance statusbool
get_engines_info()Engine detailsList[EngineInfo]

Troubleshooting

Connection refused

# Check instance is running
curl http://localhost:8080/healthz

# Or in Python
if not skill.health_check():
    print("Instance is down")

SSL errors (local development)

skill = SearXNGSkill(
    instance_url="http://localhost:8080",
    verify_ssl=False  # Only for local dev!
)

Timeout issues

# Increase timeout
skill = SearXNGSkill(
    instance_url="http://localhost:8080",
    default_timeout=30
)

# Or per-request
results = skill.search("query", timeout=30)

No results

# Check enabled engines
engines = skill.get_engines_info()
enabled = [e for e in engines if e.enabled]
print(f"Enabled: {len(enabled)} engines")

# Try specific engines
results = skill.search("query", engines=["duckduckgo"])

Comments

Loading comments...