Imported from middle-chunjie/mywiki (
.aris/skill-sync/rendered/20260503_201810_375085/exa-search/SKILL.md). Install upstream withnpx skills add middle-chunjie/mywiki --skill exa-search. Copyright stays with the author.
Exa AI-Powered Web Search
Search query: $ARGUMENTS
Role & Positioning
Exa is the broad web search source with built-in content extraction:
| Skill | Best for |
|---|---|
/arxiv |
Direct preprint search and PDF download |
/semantic-scholar |
Published venue papers (IEEE, ACM, Springer), citation counts |
/deepxiv |
Layered reading: search, brief, section map, section reads |
/exa-search |
Broad web search: blogs, docs, news, companies, research papers — with content extraction |
Use Exa when you need results beyond academic databases, or when you want content (highlights, full text, summaries) extracted alongside search results.
Constants
- FETCH_SCRIPT —
tools/exa_search.pyrelative to the current project. - MAX_RESULTS = 10 — Default number of results to return.
Overrides (append to arguments):
/exa-search "RAG pipelines" — max: 5— top 5 results/exa-search "diffusion models" — category: research paper— research papers only/exa-search "startup funding" — category: news, start date: 2025-01-01— recent news/exa-search "transformer" — content: text, max chars: 8000— full text mode/exa-search "transformer" — content: summary— LLM-generated summaries/exa-search "transformer" — domains: arxiv.org,huggingface.co— domain filter/exa-search "https://arxiv.org/abs/2301.07041" — similar— find similar pages
Setup
Exa requires the exa-py SDK and an API key:
pip install exa-py
Set your API key:
export EXA_API_KEY=your-key-here
Get a key from exa.ai.
Workflow
Step 1: Parse Arguments
Parse $ARGUMENTS for:
- query: The search query (required) or a URL (for
find-similarmode) - similar: If present, use
find-similarmode instead of search - max: Override MAX_RESULTS
- category:
research paper,news,company,personal site,financial report,people - content:
highlights(default),text,summary,none - max chars: Max characters for content extraction
- type: Search type —
auto(default),neural,fast,instant - domains: Comma-separated include domains
- exclude domains: Comma-separated exclude domains
- include text: Phrase that must appear in results
- exclude text: Phrase to exclude from results
- start date: ISO 8601 date — only results after this
- end date: ISO 8601 date — only results before this
- location: Two-letter ISO country code
Step 2: Locate Script
SCRIPT=$(find tools/ -name "exa_search.py" 2>/dev/null | head -1)
If not found, tell the user:
exa_search.py not found. Make sure tools/exa_search.py exists and exa-py is installed:
pip install exa-py
Step 3: Execute Search
Standard search:
python3 "$SCRIPT" search "QUERY" --max 10 --content highlights
With filters:
python3 "$SCRIPT" search "QUERY" --max 10 \
--category "research paper" \
--start-date 2025-01-01 \
--content text --max-chars 8000
Find similar pages:
python3 "$SCRIPT" find-similar "URL" --max 5 --content highlights
Get content for known URLs:
python3 "$SCRIPT" get-contents "URL1" "URL2" --content text
Step 4: Present Results
Format results as a structured table:
| # | Title | Authors | Venue/Publisher | URL | Date | Key Content |
|---|-------|---------|-----------------|-----|------|-------------|
For each result:
- Show title and URL
- Show published date if available
- Show highlights, text excerpt, or summary depending on content mode
- Flag particularly relevant results
- For
category: "research paper"hits only — also record authors (from Exa'sauthor/authorsfields, or fallback: parse from the result snippet) and venue/publisher (frompublisher,source, or the domain hosting the paper). These are needed by Step 6's MyWiki staging entry; if either is unavailable for a given hit, skip staging for that one hit and log a note.
Step 5: Offer Follow-up
After presenting results, suggest:
- Deepen: "I can fetch full text for any of these results"
- Find similar: "I can find pages similar to any result"
- Narrow: "I can re-search with domain/date/text filters"
Step 6: Stage Papers for Wiki Writeback (MyWiki projects)
When inside a MyWiki project AND the query category was "research paper": for each academic hit, try to recover an arXiv ID from the URL (arxiv.org/abs/<id>). Append to projects/<slug>/wiki-contributions/pending-sources.md:
## <YYYY-MM-DD> | /exa-search
- **Title**: <title>
url: <url> | arxiv: <id if extractable else "(non-arxiv)"> | authors: <authors>
year: <year> | venue: <venue/publisher>
highlight: <top-1 Exa highlight>
Non-academic Exa results (blog posts, docs, news) go to the user's reply only, not to staging — the wiki is papers-only.
Then rebuild MEMORY.md: python3 scripts/project_memory.py rebuild --slug <slug>.
This skill only stages candidates. The user's /project-writeback flow
handles later promotion into canonical MyWiki wiki/sources/ pages after
review; do not write directly to wiki/sources/ or handwrite paper pages
from /exa-search.
Key Rules
- Always check that
EXA_API_KEYis set before searching - Default to
highlightscontent mode for a good balance of speed and context - Use
category: "research paper"when the user is clearly looking for academic content - Use
textcontent mode when the user needs full page content - Combine with
/arxivor/semantic-scholarfor comprehensive literature coverage