<!--
Skill: exa-agent-cli
Source: one of the always-on agent skills from treygoff.com/stack
De-personalized for public use: machine paths, personal names, and private
infrastructure references have been genericized. Read it before you run it —
some steps assume tools you may not have installed.
Install: save as ~/.claude/skills/exa-agent-cli/SKILL.md
-->

---
name: exa-agent-cli
description: Use the exa-agent CLI for Exa search, contents, answer, context, similar, Websets, monitors, and agent workflows.
---

# exa-agent CLI skill

Generated by `cargo xtask generate-skill`; do not edit by hand.

## Guidance
- Use capabilities first to discover command metadata.
- Use capabilities <command-path> (for example capabilities search) for a small command slice.
- Use --dry-run --print-request before live mutations.
- Search is not cursor-paginated: use --num-results and follow error.suggestedCommand when an invocation is rejected.
- Search returns query-aware 800-char highlights by default; use --no-highlights for metadata only, or --text 1500 instead of --text full for capped triage text.
- Search results are under `.data.results[]`; verify the live JSON path with `exa-agent search "rust async runtimes" --num-results 1 --json | jq '.data.results[] | {title,url}'`.
- Filter search with `exa-agent search "AI infrastructure" --include-domain "exa.ai" --num-results 5 --json`.
- SOURCE_NOT_AVAILABLE is not a zero-result success. Broaden and filter locally: `exa-agent search "AI infrastructure" --num-results 20 --json | jq '[.data.results[] | select(.url | test("^https?://([^/]+\\.)?exa\\.ai(/|$)"; "i"))]'`; cite the accessible publisher rather than treating a syndicator as the original source.
- Contents accepts positional URLS or `--ids`: `exa-agent contents "https://exa.ai" "https://docs.exa.ai" --text 10000 --json`; text accepts bare, `full`, or numeric caps 1..10000.
- --ndjson emits one object per result for list-shaped data and a final summary envelope; non-list commands fall back to compact JSON.
- Contents/fetch success envelopes add outcome no_content (no failures and no returned rows), partial, or full (one results row per requested item with no failure evidence); missing statuses do not downgrade full coverage, and all-URL failures remain outcome partial with exit 10.
- Empty contents error objects use upstream_reason_unavailable and suggest retrying or direct-fetching the quoted URL.
- Set EXA_AGENT_NO_NETWORK to any value (including empty) to refuse live typed, raw, streaming, auth test/status, schema refresh --check, and doctor --online before credential resolution and transport; unset it to allow live calls, while dry-run and self-description remain available.
- Do not pass managed auth headers; use EXA_API_KEY or auth login.
- Errors are JSON on stderr with stable error.code values; run robot-docs errors for the full dictionary.

## Offline examples

```sh
exa-agent capabilities --compact
```
```sh
exa-agent capabilities search --compact
```
```sh
exa-agent search "AI infrastructure news" --include-domain "exa.ai" --num-results 5 --dry-run --print-request --compact
```
```sh
exa-agent contents "https://exa.ai" "https://docs.exa.ai" --text 10000 --dry-run --print-request --compact
```
```sh
exa-agent team info --dry-run --print-request --compact
```

## Footguns (bakeoff-learned, 2026-07-17)

- There is NO `github` search category. Valid: company, people, research paper, news, personal site, financial report. For GitHub releases/changelogs, skip `--category` entirely.
- `answer` finds pointers but does not dig page bodies (it will say so itself). For release notes, statutes, or any quotable body text, chain: `answer`/`search` to get the URL, then `contents "<url>" --text`.
- For statutory/official text, force authoritative domains (`--include-domain uscode.house.gov`, govinfo.gov, efile.fara.gov, agency sites) — the index happily serves clean-looking aggregator mirrors otherwise.
