Skill: jordyvandomselaar/exa-plus (version 1.0.0)

--- name: exa-plus version: 1.0.0 description: Neural web search via Exa AI. Search people, companies, news, research, code. Supports deep search, domain filters, date ranges. metadata: {"clawdbot":{"emoji":"🧠","requires":{"bins":["curl","jq"]}}} --- # Exa - Neural Web Search Powerful AI-powered search with LinkedIn, news, research papers, and more. ## Setup Create `~/.clawdbot/credentials/exa/config.json`: ```json {"apiKey": "your-exa-api-key"} ``` ## Commands ### General Search ```bash bash scripts/search.sh "query" [options] ``` Options (as env vars): - `NUM=10` - Number of results (max 100) - `TYPE=auto` - Search type: auto, neural, fast, deep - `CATEGORY=` - Category: news, company, people, research paper, github, tweet, pdf, financial report - `DOMAINS=` - Include domains (comma-separated) - `EXCLUDE=` - Exclude domains (comma-separated) - `SINCE=` - Published after (ISO date) - `UNTIL=` - Published before (ISO date) - `LOCATION=NL` - User location (country code) ### Examples ```bash # Basic search bash scripts/search.sh "AI agents 2024" # LinkedIn people search CATEGORY=people bash scripts/search.sh "software engineer Amsterdam" # Company search CATEGORY=company bash scripts/search.sh "fintech startup Netherlands" # News from specific domain CATEGORY=news DOMAINS="reuters.com,bbc.com" bash scripts/search.sh "Netherlands" # Research papers CATEGORY="research paper" bash scripts/search.sh "transformer architecture" # Deep search (comprehensive) TYPE=deep bash scripts/search.sh "climate change solutions" # Date-filtered news CATEGORY=news SINCE="2026-01-01" bash scripts/search.sh "tech layoffs" ``` ### Get Content Extract full text from URLs: ```bash bash scripts/content.sh "url1" "url2" ```

path: scripts/code.sh
content: #!/bin/bash
# Exa code context search

QUERY="$1"
NUM_RESULTS="${2:-10}"

if [ -z "$QUERY" ]; then
    echo "Usage: $0 \"query\" [num_results]" >&2
    exit 1
fi

if [ -z "${EXA_API_KEY:-}" ]; then
    echo "Error: EXA_API_KEY is not set." >&2
    echo "Please set EXA_API_KEY environment variable." >&2
    exit 1
fi

# Optimized settings for code/docs
# No domain restrictions - let Exa's neural search find the best docs/repos
PAYLOAD=$(jq -n \
    --arg query "$QUERY" \
    --argjson numResults "$NUM_RESULTS" \
    '{
        query: $query,
        type: "auto",
        numResults: $numResults,
        text: true,
        highlights: true
    }')

curl -s -X POST 'https://api.exa.ai/search' \
    -H "x-[REDACTED_SECRET]" \
    -H 'Content-Type: application/json' \
    -d "$PAYLOAD"


path: scripts/content.sh
content: #!/bin/bash
# Exa content extraction from URLs

if [ $# -eq 0 ]; then
    echo "Usage: bash content.sh \"url1\" \"url2\" ..." >&2
    exit 1
fi

# Load API key from credentials
CONFIG_FILE="$HOME/.clawdbot/credentials/exa/config.json"
if [ -f "$CONFIG_FILE" ]; then
    EXA_API_KEY=$(jq -r '.apiKey' "$CONFIG_FILE")
fi

if [ -z "${EXA_API_KEY:-}" ]; then
    echo "Error: EXA_API_KEY not found. Create $CONFIG_FILE with {\"apiKey\": \"...\"}" >&2
    exit 1
fi

# Build URLs array
URLS=$(printf '%s\n' "$@" | jq -R . | jq -s .)

# Build payload
PAYLOAD=$(jq -n \
    --argjson urls "$URLS" \
    '{
        urls: $urls,
        text: { maxCharacters: 2000 },
        highlights: { numSentences: 3, highlightsPerUrl: 2 },
        summary: {}
    }')

# Call API
curl -s -X POST 'https://api.exa.ai/contents' \
    -H "x-[REDACTED_SECRET]" \
    -H 'Content-Type: application/json' \
    -d "$PAYLOAD"


path: scripts/search.sh
content: #!/bin/bash
# Exa neural web search with full options

QUERY="$1"

if [ -z "$QUERY" ]; then
    echo "Usage: bash search.sh \"query\"" >&2
    echo "" >&2
    echo "Options (env vars):" >&2
    echo "  NUM=10          Number of results" >&2
    echo "  TYPE=auto       Search type: auto, neural, fast, deep" >&2
    echo "  CATEGORY=       Category: news, company, people, research paper, github, tweet, pdf" >&2
    echo "  DOMAINS=        Include domains (comma-separated)" >&2
    echo "  EXCLUDE=        Exclude domains (comma-separated)" >&2
    echo "  SINCE=          Published after (YYYY-MM-DD)" >&2
    echo "  UNTIL=          Published before (YYYY-MM-DD)" >&2
    echo "  LOCATION=       User location (country code)" >&2
    exit 1
fi

# Load API key from credentials
CONFIG_FILE="$HOME/.clawdbot/credentials/exa/config.json"
if [ -f "$CONFIG_FILE" ]; then
    EXA_API_KEY=$(jq -r '.apiKey' "$CONFIG_FILE")
fi

if [ -z "${EXA_API_KEY:-}" ]; then
    echo "Error: EXA_API_KEY not found. Create $CONFIG_FILE with {\"apiKey\": \"...\"}" >&2
    exit 1
fi

# Defaults
NUM="${NUM:-10}"
TYPE="${TYPE:-auto}"
LOCATION="${LOCATION:-NL}"

# Build base payload
PAYLOAD=$(jq -n \
    --arg query "$QUERY" \
    --arg type "$TYPE" \
    --argjson numResults "$NUM" \
    --arg location "$LOCATION" \
    '{
        query: $query,
        type: $type,
        numResults: $numResults,
        userLocation: $location,
        contents: {
            text: { maxCharacters: 500 },
            highlights: { numSentences: 2, highlightsPerUrl: 1 },
            summary: {}
        }
    }')

# Add category if set
if [ -n "${CATEGORY:-}" ]; then
    PAYLOAD=$(echo "$PAYLOAD" | jq --arg cat "$CATEGORY" '. + {category: $cat}')
fi

# Add includeDomains if set
if [ -n "${DOMAINS:-}" ]; then
    PAYLOAD=$(echo "$PAYLOAD" | jq --arg domains "$DOMAINS" '. + {includeDomains: ($domains | split(","))}')
fi

# Add excludeDomains if set
if [ -n "${EXCLUDE:-}" ]; then
    PAYLOAD=$(echo "$PAYLOAD" | jq --arg domains "$EXCLUDE" '. + {excludeDomains: ($domains | split(","))}')
fi

# Add date filters if set
if [ -n "${SINCE:-}" ]; then
    PAYLOAD=$(echo "$PAYLOAD" | jq --arg date "${SINCE}T00:00:00.000Z" '. + {startPublishedDate: $date}')
fi

if [ -n "${UNTIL:-}" ]; then
    PAYLOAD=$(echo "$PAYLOAD" | jq --arg date "${UNTIL}T23:59:59.999Z" '. + {endPublishedDate: $date}')
fi

# Call API
curl -s -X POST 'https://api.exa.ai/search' \
    -H "x-[REDACTED_SECRET]" \
    -H 'Content-Type: application/json' \
    -d "$PAYLOAD"


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)