Back to skills
SKILL.md
Brave Headless
ASecurityHeadless web search and content extraction via the Brave Search API.
- 16 stars
- 0 votes
- 0 copies
- 3 views
- Added June 7, 2026
Works with
Security analysis
100/100Pro scans all 14 files and shows the line behind each finding
npx -y skills add modbender/skill-library-mcp --skill brave-headless --agent claude-codeAre you the author of Brave Headless?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/modbender-brave-headless)---
name: brave-headless
description:
Headless web search and content extraction via the Brave Search API.
Features exponential-backoff retry, circuit breaker fault isolation, bounded-concurrency
parallel page fetching, structured leveled logging, and smart paragraph-boundary truncation.
No browser required. Use for web research, documentation lookup, URL content extraction,
and any workflow requiring scriptable, non-interactive web search.
version: 0.2.0
license: MIT
compatibility: Requires Node.js >= 20 and npm. Works on macOS and Linux.
metadata:
author: kelexine
homepage: https://github.com/kelexine/brave-headless
openclaw:
requires:
env:
- BRAVE_API_KEY
bins:
- node
- npm
primaryEnv: BRAVE_API_KEY
emoji: "π"
homepage: https://github.com/kelexine/brave-headless
os:
- macos
- linux
install:
- kind: node
package: "@mozilla/readability"
bins: []
- kind: node
package: jsdom
bins: []
- kind: node
package: turndown
bins: []
- kind: node
package: turndown-plugin-gfm
bins: []
---
# brave-search
Headless web search and content extraction via the Brave Search API.
## Setup
Run once before first use:
```bash
cd <skill-root>
npm ci
```
Required environment variable:
```bash
export BRAVE_API_KEY="your-key-here"
```
Get a free API key at [brave.com/search/api](https://brave.com/search/api).
## Usage
### Search
```bash
node scripts/search.js "query" # Basic (5 results)
node scripts/search.js "query" -n 10 # Up to 20 results
node scripts/search.js "query" --content # Include page content
node scripts/search.js "query" -n 3 --content # Combined
node scripts/search.js "query" --json # Newline-delimited JSON
node scripts/search.js --help # Full options + env vars
```
### Extract page content
```bash
node scripts/content.js https://example.com/article
node scripts/content.js https://example.com/article --json
node scripts/content.js https://example.com/article --max-length 8000
```
## Output format (plain text)
```
--- Result 1 ---
Title: Page Title
URL: https://example.com/page
Snippet: Description from Brave Search
Content:
# Page Title
Extracted markdown content...
--- Result 2 ---
...
```
Pass `--json` to get one JSON object per line instead, suitable for piping.
## Exit codes
| Code | Meaning |
|------|--------------------------------------------------|
| `0` | Success |
| `1` | Invalid input or configuration error |
| `2` | Page had no extractable content (`content.js`) |
| `130`| Interrupted (SIGINT) |
## Configuration (environment variables)
All behaviour is configurable without touching code:
| Variable | Default | Description |
|------------------------|----------|------------------------------------------------|
| `BRAVE_API_KEY` | β | **Required.** Brave Search subscription token |
| `LOG_LEVEL` | `info` | `debug` Β· `info` Β· `warn` Β· `error` Β· `silent` |
| `LOG_JSON` | `false` | Emit logs as newline-delimited JSON to stderr |
| `FETCH_TIMEOUT_MS` | `15000` | Per-page fetch timeout |
| `SEARCH_TIMEOUT_MS` | `10000` | Brave API call timeout |
| `MAX_CONTENT_LENGTH` | `5000` | Max chars of extracted content |
| `MAX_RETRY_ATTEMPTS` | `3` | Retry attempts on transient errors |
| `RETRY_BASE_DELAY_MS` | `500` | Base delay for exponential backoff |
| `RETRY_MAX_DELAY_MS` | `30000` | Backoff delay cap |
| `CONCURRENCY_LIMIT` | `3` | Parallel page fetches when `--content` is set |
| `CB_FAILURE_THRESHOLD` | `5` | Consecutive failures before circuit opens |
| `CB_RESET_TIMEOUT_MS` | `60000` | Circuit breaker reset window |
All variables are validated at startup β misconfigured runs fail immediately with a descriptive
list of every bad value rather than crashing mid-execution.
## Architecture
See [`references/ARCHITECTURE.md`](references/ARCHITECTURE.md) for a full module breakdown.
```
scripts/
βββ search.js β Search CLI entry point
βββ content.js β Content extraction CLI entry point
βββ content-fetcher.js β HTTP fetch + Readability + DOM fallback
βββ config.js β Schema-validated env config
βββ circuit-breaker.js β Fault isolation (CLOSED β OPEN β HALF_OPEN)
βββ retry.js β Exponential backoff with full jitter
βββ concurrency.js β Bounded parallel execution pool
βββ utils.js β htmlToMarkdown, smartTruncate, parseURL
βββ logger.js β Structured leveled logger β stderr
βββ errors.js β Typed error hierarchy
```
Files in this skill
- ARCHITECTURE.md
- SKILL.md
- package-lock.json
- package.json
- scripts/circuit-breaker.js
- scripts/concurrency.js
- scripts/config.js
- scripts/content-fetcher.js
- scripts/content.js
- scripts/errors.js
- scripts/logger.js
- scripts/retry.js
- scripts/search.js
- scripts/utils.js
Attribution
Comments
Loading commentsβ¦
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.