Install
openclaw skills install @jwestburg/tavily-search-native-nodeMinimal Tavily web search for OpenClaw - native Node.js, zero dependencies, small audit surface. Use when the user asks to search the web, look up current information, find news, research a topic, check recent events, compare options, or get current or recent web information. Returns Tavily's synthesized answer plus source URLs/snippets for verification. Requires TAVILY_API_KEY in the process environment. NOT for scraping individual URLs; use the platform URL-fetch/read tool when available. For caching, raw content, extract endpoint, and usage stats, use a separately reviewed Pro Tavily skill/package when available.
openclaw skills install @jwestburg/tavily-search-native-nodeMinimal, auditable Tavily web search.
Version: 1.0.30 / public ClawHub utility candidate pending owner approval.
Native Node.js. Zero dependencies. Small runtime footprint and small audit surface.
TAVILY_API_KEY from the process environment only.~/.openclaw/.env.https://api.tavily.com/search; tests may override the endpoint with TAVILY_TEST_ENDPOINT for local no-credit regression checks only. The script refuses HTTP redirects instead of following them so the outbound request body cannot automatically leave the approved Tavily or local loopback destination boundary. TAVILY_TEST_ENDPOINT still receives the Authorization header and fails closed unless the key is clearly dummy/local/test-shaped, so use it only with dummy/local test keys, never a real Tavily key.TAVILY_API_KEY value from HTTP error text, Retry-After header text, invalid JSON text, and successful response output before printing. The query appears in stdout output so users can verify what was searched; redact stdout before sharing externally when the query or other outbound request fields are sensitive. The credential-source warn: line is written to stderr, not stdout result content.search.mjs receives argv.Trigger phrases: "search for", "look up", "what's the latest on", "find recent news about", "research", "compare", "current info on".
Use this when:
Do NOT use this when:
Want caching, raw full-page content, extract endpoint, or usage stats? Use a separately reviewed Pro Tavily skill/package when available.
The script is in scripts/search.mjs.
Requirement: Node.js 18+ for native fetch and AbortController support. Node.js 21+ is recommended when clean stderr is important because older Node releases may emit native-fetch experimental warnings.
The command-line examples below are for trusted, hand-typed search terms. Do not construct a shell command string by interpolating arbitrary user text into these examples. Shells can expand metacharacters before search.mjs receives the query.
Agents and automation must invoke the script with an argv array/non-shell boundary such as child_process.spawn or execFile with shell: false, passing the whole user query as one argv element:
spawn(process.execPath, [path.join(skillDir, "scripts", "search.mjs"), "--max", "5", userQuery], { shell: false });
If an argv-safe invocation path is not available, do not run arbitrary user-controlled query text through a shell. Ask for a sanitized hand-entered search term instead.
Basic search:
node "<skill-dir>/scripts/search.mjs" "recent OpenClaw release notes"
News search (past ~7 days by default, freshness-biased):
node "<skill-dir>/scripts/search.mjs" --topic news "software release notes"
Deeper research (costs 2 credits per call):
node "<skill-dir>/scripts/search.mjs" --depth advanced "AI agents market analysis 2026"
(Where <skill-dir> is typically workspace/skills/tavily-search-native-node/.)
| Flag | Values | Default | Purpose |
|---|---|---|---|
--topic | general | news | general | news biases to fresh articles |
--depth | basic | advanced | basic | advanced = deeper analysis, 2x credits |
--max | 1-20 | 5 | How many results to return |
--days | 1-365 | 7 (news only) | Age window for news topic |
--include | comma list | (none) | Only these domains, e.g. github.com,stackoverflow.com |
--exclude | comma list | (none) | Skip these domains |
--json | flag | off | Return redacted JSON instead of formatted output |
--help | flag | - | Show help |
Optional environment variable: TAVILY_TIMEOUT_MS sets the network timeout in milliseconds, from 1000 to 120000; default is 30000.
Testing-only environment variable: TAVILY_TEST_ENDPOINT may point to http://127.0.0.1:<port>/... for local no-credit regression checks. It sends the same Authorization header as a real call and now fails closed unless TAVILY_API_KEY is clearly dummy/local/test-shaped; never use a real Tavily key with it.
# Compare frameworks, GitHub+SO only
node "./scripts/search.mjs" --include "github.com,stackoverflow.com" "React Native vs Flutter 2026"
# Recent news, 10 results, last 14 days
node "./scripts/search.mjs" --topic news --max 10 --days 14 "small business AI adoption"
# Deep research with JSON for programmatic use
node "./scripts/search.mjs" --depth advanced --json "small business VPN options"
Human-readable by default:
JSON mode (--json) returns Tavily response JSON after redacting the exact API key from both object values and object keys; useful for piping into follow-up scripts. JSON stdout remains machine-readable; the credential-source warn: notice is emitted on stderr.
Requires TAVILY_API_KEY in the process environment.
If it is not set, the script exits with a clear error message before making a network call.
Get a key: https://app.tavily.com - free tier was 1,000 API credits/month as of 2026-05; verify current pricing and limits before relying on them. Credit usage depends on request type (for this skill, basic search is 1 credit and advanced search is 2 credits as of 2026-05).
--depth basic = 1 credit per search--depth advanced = 2 credits per searchTAVILY_TIMEOUT_MS only when a different operator-approved timeout is needed.When invoking this skill, prefer batching:
basic depth unless the user explicitly asks for a deep dive--include to scope to trusted domains when appropriatehttps://api.tavily.com/searchapi.tavily.com; tests may use local 127.0.0.1 loopback via TAVILY_TEST_ENDPOINT; redirects are refused rather than followedSanitized representative output for eval/review checks:
$ node scripts/search.mjs --max 2 "example AI operations news"
# stderr: warn: using TAVILY_API_KEY from process environment
Query: example AI operations news
Topic: general - Depth: basic - Results: 2/2
Answer:
Recent AI operations coverage emphasizes governed agent workflows, deployment safety, and measurable business outcomes. Teams are comparing lightweight automation with more advanced agent orchestration, while continuing to prioritize auditability, permissions, and source-backed research.
Results:
1. Example AI Operations Trends 2026
https://example.com/ai-operations-trends
A summary of current AI operations themes, including governance, rollout patterns, and practical adoption lessons for teams.
2. Agent Workflow Safety Checklist
https://example.org/agent-workflow-safety
A practical checklist for reviewing agent permissions, human approval gates, logging, and rollback before production use.
- elapsed 842ms - api 0.78s
JSON mode (--json) returns Tavily's JSON response after redacting the exact TAVILY_API_KEY value if an upstream or loopback response echoes it.
This skill is intentionally small and dependency-free for auditability. It is a publication candidate only; no ClawHub listing, upload, sync, publish, update, or registry action is approved by the source itself. Before any owner-approved publication or update, run node --check scripts/search.mjs, node scripts/search.mjs --help, a no-key smoke test with a temporary home directory, and the offline regression suite to verify credential/test-endpoint/output-redaction and argv-safe metacharacter query behavior without spending API credits.
1.0.30: Add regression coverage that mechanically asserts the reviewed frontmatter name, description, and risk class. No runtime behavior change.1.0.29: Strengthen offline redirect-containment regression coverage to assert the redirected origin receives no request at all, not just no forwarded POST body. No runtime behavior change.1.0.28: Refuse HTTP redirects instead of following them, add offline redirect-containment regression coverage, and document the effective outbound destination boundary. No intended direct Tavily search behavior change.1.0.27: Polish Retry-After error display so it does not imply every header value is seconds-only. No Tavily API behavior change.1.0.26: Redact Retry-After response-header values before stderr output, add regression coverage for credential echo through that header, and clarify privacy approval applies to all outbound Tavily request fields.1.0.25: Strengthen metacharacter query regression coverage to assert exact stdout echo as argv data. No runtime behavior change.1.0.24: Clean public changelog wording for publication-candidate clarity. No runtime behavior change.1.0.23: Polish public changelog wording for cleaner public-copy posture. No runtime behavior change.1.0.22: Clarify that the previous update addressed documented safety and privacy blockers. No runtime behavior change.1.0.21: Fix source-review blockers by defining a non-shell argv invocation contract, adding metacharacter-query regression coverage, making secrets categorically non-sendable, reconciling privacy guidance, expanding risk classification for invocation-boundary risk, and softening “real-time data” wording. No production Tavily behavior change.1.0.20: Soften timeout troubleshooting from “transient” to “may be transient” to avoid overclaiming provider/network causes. No runtime behavior change.1.0.19: Close final support-polish note by clarifying timeout retry/backoff/escalation guidance. No runtime behavior change.1.0.18: Close public-documentation polish: risk class now names query privacy/externalization, JSON/sample output clarify stderr vs stdout behavior, troubleshooting covers 403/5xx cases, and dated pricing text has an owner-refresh reminder. No runtime behavior change.1.0.17: Add regression coverage that CLI help advertises --json as redacted JSON output. No runtime behavior change.1.0.16: Align CLI/help docs to describe --json as redacted JSON output rather than raw/as-is output. No runtime behavior change.1.0.15: Redact the exact API key from successful JSON object keys as well as values, explicitly redact the human-mode API timing field, add success-response regressions for JSON key echoes and timing-field echoes, and move untrusted external-content guidance into the agent usage body. No intended production search behavior change.1.0.14: Fail closed when TAVILY_TEST_ENDPOINT is paired with a non-dummy-looking API key, redact the exact API key from successful human and JSON output, add 200-success echo regressions for both output modes, narrow frontmatter citation wording, and add untrusted external-content guidance. No intended production search behavior change.1.0.13: Clarify TAVILY_TEST_ENDPOINT must use dummy/local test keys because it receives the Authorization header, and redact the exact API key if a response/error body echoes it. No intended search behavior change.1.0.12: Refresh public-candidate/no-publish-authority wording, declare TAVILY_API_KEY in OpenClaw metadata, add delayed response-body timeout regression coverage, and normalize final line endings; no runtime behavior change.1.0.11: ClawHub publication-candidate/version refresh after source-readiness review; no runtime behavior change.1.0.10: Clarify that production network calls go only to api.tavily.com while tests may use local 127.0.0.1 loopback via TAVILY_TEST_ENDPOINT; no runtime behavior change.1.0.9: Extend timeout coverage through response body reads, document Node.js 18+ runtime requirement, and add populated-key non-leak regression coverage.1.0.8: Add offline tests, bounded TAVILY_TIMEOUT_MS network timeout, and stronger sensitive-query privacy guidance.1.0.7: Clarify Tavily free-tier wording as API credits/month rather than searches/month.1.0.6: Reject unknown flags instead of folding them into the query, wrap top-level async failures, handle response-read errors cleanly, and clarify stdout query visibility vs. no file logging.1.0.5: Add frontmatter version metadata, polish env-key status wording, and include sanitized representative success output for eval review.1.0.4: Public package wording and metadata cleanup; no runtime behavior change.Last reviewed: 2026-09-08