Skip to content

feat: add Exa AI-powered search tool#1

Open
tgonzalezc5 wants to merge 1 commit into
claude-world:mainfrom
tgonzalezc5:feat/exa-search-skill
Open

feat: add Exa AI-powered search tool#1
tgonzalezc5 wants to merge 1 commit into
claude-world:mainfrom
tgonzalezc5:feat/exa-search-skill

Conversation

@tgonzalezc5
Copy link
Copy Markdown

Summary

Adds a new /exa-search skill that lets the agent use the Exa Search API for AI-powered semantic web search, with category and domain filtering, optional content modes (text / highlights / summary), and graceful fallback to WebSearch when EXA_API_KEY is unset.

  • New skill: .claude/skills/exa-search/SKILL.md (haiku, user-invocable)
  • Bash + curl pattern matches existing skills like /weather and /x-twitter (no new npm deps, in line with CONTRIBUTING.md)
  • Documents EXA_API_KEY env var setup (get a key at https://dashboard.exa.ai)
  • Fits the Content & Research category in README.md's skill table
  • Adds a routing entry in CLAUDE.md's Task Delegation table for "Search Exa for...", "Find papers on...", "Find companies that..."
  • Bumps the documented skill count from 49 to 50 in the seven places it appears across README.md and CLAUDE.md

Why

The existing /quick-research skill relies on Claude Code's built-in WebSearch, which is keyword-based. Exa adds:

  • Semantic / neural retrieval (better for "papers explaining X", "companies doing Y")
  • Category filters: research paper, news, company, personal site, financial report, people
  • Domain include / exclude lists (up to 1200)
  • Date-range filters (startPublishedDate, endPublishedDate)
  • Per-result text, highlights, and summary content modes (combinable in one request)

Other skills (e.g. /trend-scout) already follow the pattern of "use a richer source with WebSearch fallback" — this slots into that pattern.

Usage

Once EXA_API_KEY is exported in the user's shell:

"Search Exa for arxiv papers on long-context attention since 2025"
"Find companies building vector databases for RAG"
"Search news for AI agent infrastructure announcements this month"

The skill picks the right category, includeDomains, and startPublishedDate, calls POST https://api.exa.ai/search, and formats the top results with snippet cascade (summary → highlights → text → title) under 400 words.

If EXA_API_KEY is unset or the request fails, it silently falls back to WebSearch and notes the fallback once.

Files changed

  • .claude/skills/exa-search/SKILL.md (new)
  • README.md — added /exa-search to the Content & Research skills table; bumped skill count 49 → 50
  • CLAUDE.md — added /exa-search to the skills list and the Task Delegation routing table; bumped skill count 49 → 50

Test plan

The repo's CONTRIBUTING.md describes the skill test method as: "Test by running Claude Code in the project directory and verify your addition works." There is no precedent in the repo for unit-testing markdown skills.

  • Frontmatter parses cleanly and includes all keys used by other skills (name, description, allowed-tools, model, user-invocable, when_to_use, argument-hint)
  • All six JSON request bodies in the skill examples are valid JSON
  • Existing npm test suite still passes (96/96 tests, vitest)
  • Documented skill count is consistent across README.md and CLAUDE.md
  • Manual: export EXA_API_KEY=..., run claude in the project, invoke /exa-search find recent papers on speculative decoding, verify ranked results appear with snippets
  • Manual: unset EXA_API_KEY, invoke /exa-search, verify fallback to WebSearch with the documented one-line note

Notes for reviewers

  • Auth header is x-api-key (not Authorization: Bearer); the skill instructs the model to set this on every request.
  • Every example also passes x-exa-integration: claude-agent for usage attribution.
  • type: auto is used as the default search mode (Exa picks neural vs. other modes per query); keyword is intentionally not used as it was removed from the API.
  • The contents field accepts text, highlights, and summary simultaneously — the skill makes this clear so the model doesn't treat them as mutually exclusive.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant