exa-search
Use Exa MCP for current web, code/docs, company, people, and page-fetch research. Prefer current hosted tool schemas and note deprecated tools.
Install
npx skills add https://github.com/mxyhi/ok-skills/tree/main/exa-search
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install mxyhi-ok-skills@llmmart
git clone https://github.com/mxyhi/ok-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole mxyhi/ok-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Exa MCP Search
Use this skill when online search, page fetch, code/docs lookup, company research, people research, or Exa MCP parameter checks are needed.
Current Source Of Truth
- Hosted MCP endpoint:
https://mcp.exa.ai/mcp - Official source:
exa-labs/exa-mcp-server@15ffb50519e719dc791cdc750ce5ed1934c0a1ed - Current npm package checked:
exa-mcp-server@3.4.1; verified tarball SHA-25662379fab5750cbc8334f096ff986ab1b7152488afffab5b0e275995310b6e978 - Tool schemas can change. Before adding new parameters, verify with
tools/listthrough a normal HTTP client.
Direct MCP HTTP is the required invocation model for this skill. curl is fine, but keep the session and SSE parsing in small shell helpers instead of repeating low-level flags at every call site.
Tool Choice
| Need | Prefer | Notes |
|---|---|---|
| General current web search | web_search_exa |
Simple search. Only query and numResults. |
| Filtered search, dates, domains, categories, summaries, highlights, subpages | web_search_advanced_exa |
Enable explicitly in tools=. Use this for company/people/papers/news filters. |
| Read known URLs fully | web_fetch_exa |
Use after search when highlights are insufficient. |
| Code examples/docs | web_search_exa |
get_code_context_exa still exists but is deprecated. |
| Company research | web_search_advanced_exa with category:"company" |
company_research_exa still exists but is deprecated. |
| People/profiles | web_search_advanced_exa with category:"people" |
people_search_exa still exists but is deprecated. |
Core Parameters
web_search_exa
queryrequired: semantically rich natural-language query. Can includecategory:companyorcategory:people.numResultsoptional: default10.- No
type,livecrawl,contextMaxCharacters, ortokensNumon current hosted schema.
{"query":"latest AI safety research June 2026","numResults":10}
web_search_advanced_exa
queryrequired.- Common optional filters:
numResults,type(auto|fast|instant),category,includeDomains,excludeDomains,startPublishedDate,endPublishedDate,startCrawlDate,endCrawlDate,includeText,excludeText,userLocation,moderation,additionalQueries. - Content controls:
textMaxCharacters,contextMaxCharacters,enableSummary,summaryQuery,enableHighlights,highlightsMaxCharacters,highlightsQuery,maxAgeHours,livecrawlTimeout,subpages,subpageTarget. - Deprecated highlight controls:
highlightsNumSentences,highlightsPerUrl; preferhighlightsMaxCharacters. - Categories include
company,publication,news,pdf,github,personal site,people,financial report.
{
"query":"Anthropic funding valuation 2026",
"category":"news",
"includeDomains":["techcrunch.com","bloomberg.com"],
"startPublishedDate":"2026-01-01",
"numResults":10,
"type":"auto",
"enableHighlights":true
}
web_fetch_exa
urlsrequired: array of URLs. Batch multiple URLs in one call.maxCharactersoptional: default3000.
{"urls":["https://docs.exa.ai/reference"],"maxCharacters":5000}
Deprecated But Still Available
get_code_context_exa: useweb_search_exainstead. Current schema isquery,numResults; oldtokensNumis obsolete.company_research_exa: useweb_search_advanced_exawithcategory:"company"instead. Schema iscompanyName,numResults; default3.people_search_exa: useweb_search_advanced_exawithcategory:"people"instead.crawling_exa: useweb_fetch_exainstead.deep_search_exa: useweb_search_advanced_exainstead; current hosted MCP requires OAuth or an API key when this tool is requested.deep_researcher_start/deep_researcher_check: deprecated; use Exa Research API directly when needed.
Curl Pattern
- POST
initialize; keep returnedMcp-Session-Idresponse header. - POST
notifications/initializedwith that header. - POST
tools/listortools/callwith that header. - If response is
text/event-stream, parse JSON fromdata:lines.
Minimal Curl Helper
EXA_URL="https://mcp.exa.ai/mcp?tools=web_search_exa,web_search_advanced_exa,web_fetch_exa"
EXA_SESSION_ID=""
exa_rpc() {
local payload="$1"
local session_header=()
local response
if [ -n "$EXA_SESSION_ID" ]; then
session_header=(-H "Mcp-Session-Id: $EXA_SESSION_ID")
fi
response="$(curl -isS "$EXA_URL" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
"${session_header[@]}" \
--data "$payload")"
if [ -z "$EXA_SESSION_ID" ]; then
EXA_SESSION_ID="$(printf '%s\n' "$response" | awk 'tolower($0) ~ /^mcp-session-id:/ { sub(/^[^:]+:[[:space:]]*/, ""); gsub(/\r/, ""); print; exit }')"
fi
printf '%s\n' "$response" | sed -n 's/^data: //p'
}
exa_init() {
exa_rpc '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"exa-curl","version":"0.1.0"}}}' >/dev/null
exa_rpc '{"jsonrpc":"2.0","method":"notifications/initialized"}' >/dev/null
}
exa_call() {
local tool_name="$1"
local arguments_json="$2"
jq -nc --arg name "$tool_name" --argjson arguments "$arguments_json" \
'{jsonrpc:"2.0",id:2,method:"tools/call",params:{name:$name,arguments:$arguments}}' |
while IFS= read -r payload; do exa_rpc "$payload"; done
}
exa_init
exa_call web_search_exa '{"query":"latest AI safety research","numResults":5}'
Tool output format differs: web_search_exa returns formatted text, web_search_advanced_exa returns JSON text, and web_fetch_exa returns fetched page text.
Research Practice
- For simple lookup, run one targeted
web_search_exacall. - For dated/current questions, calculate exact date ranges first and pass
startPublishedDate/endPublishedDatethroughweb_search_advanced_exa. - For source-heavy tasks, fetch only the best URLs with
web_fetch_exa; do not dump raw results into the final answer. - For company/people/paper/news workflows, prefer
web_search_advanced_exacategories rather than deprecated specialized tools. - Mention source uncertainty when Exa returns sparse, conflicting, or old results.
References
- Tool fields:
references/exa-tools.md
Files (ok-skills)
-
references
-
exa-tools.md 8.7 KB
# Exa MCP Tools And Parameters Snapshot checked against: - Hosted endpoint: `https://mcp.exa.ai/mcp` - Official repo: `exa-labs/exa-mcp-server@15ffb50519e719dc791cdc750ce5ed1934c0a1ed` - npm package: `exa-mcp-server@3.4.1` - npm tarball SHA-256: `62379fab5750cbc8334f096ff986ab1b7152488afffab5b0e275995310b6e978` - npm package `gitHead`: `66bacbe4afd35a7e1671be9ab55c2b6bf60aff34` - Date checked: 2026-09-04 ## Base URL - Base: `https://mcp.exa.ai/mcp` - Select tools: `?tools=tool_a,tool_b,...` - API key: `?exaApiKey=YOUR_EXA_API_KEY`, `Authorization: Bearer ...`, or `EXA_API_KEY` for local npm. - Anonymous hosted use works but has rate limits and may not register API-key-only tools. - Streamable HTTP flow: `initialize`, `notifications/initialized`, then `tools/list` or `tools/call` with the returned `Mcp-Session-Id`. - Hosted responses usually use `text/event-stream`; extract JSON from `data:` lines before parsing. - Use `curl` through small shell helpers. Repeating raw header/body plumbing at every call site is noisy. ## Enabled By Default | Tool | Purpose | Parameters | | --- | --- | --- | | `web_search_exa` | General web search with clean highlights/text | `query` required; `numResults` optional, default `10` | | `web_fetch_exa` | Fetch full content for known URLs | `urls` required; `maxCharacters` optional, default `3000` | ## Off By Default | Tool | Purpose | Parameters | | --- | --- | --- | | `web_search_advanced_exa` | Advanced search with filters and content controls | See detailed schema below | ## Deprecated Tools | Tool | Use Instead | Current Parameters | | --- | --- | --- | | `get_code_context_exa` | `web_search_exa` | `query`, `numResults` | | `company_research_exa` | `web_search_advanced_exa` with `category:"company"` | `companyName`, `numResults`; default `3` | | `people_search_exa` | `web_search_advanced_exa` with `category:"people"` | `query`, `numResults`; default `5` | | `crawling_exa` | `web_fetch_exa` | `urls`, `maxCharacters` | | `linkedin_search_exa` | `web_search_advanced_exa` with `category:"people"` | `query`, `numResults` | | `deep_search_exa` | `web_search_advanced_exa` | Requires OAuth or a user-provided API key on current hosted MCP when requested | | `deep_researcher_start` | Exa Research API | `instructions`, `model`, `outputSchema` | | `deep_researcher_check` | Exa Research API | `researchId` | ## `web_search_advanced_exa` Schema Required: - `query`: string Optional: - Search tuning: `numResults`, `type` (`auto` | `fast` | `instant`) - Category: `company`, `publication`, `news`, `pdf`, `github`, `personal site`, `people`, `financial report` - Domain filters: `includeDomains`, `excludeDomains` - Date filters: `startPublishedDate`, `endPublishedDate`, `startCrawlDate`, `endCrawlDate` - Text filters: `includeText`, `excludeText` - Geo/safety: `userLocation`, `moderation` - Query expansion: `additionalQueries` - Content: `textMaxCharacters`, `contextMaxCharacters`, `enableSummary`, `summaryQuery`, `enableHighlights`, `highlightsMaxCharacters`, `highlightsNumSentences`, `highlightsPerUrl`, `highlightsQuery` - Freshness/fetch: `maxAgeHours`, `livecrawlTimeout` - Subpages: `subpages`, `subpageTarget` Deprecated/compat details: - `highlightsNumSentences` and `highlightsPerUrl` are deprecated in official source comments; prefer `highlightsMaxCharacters`. - `livecrawl` is not a direct exposed parameter on current hosted `web_search_exa`; use advanced freshness controls (`maxAgeHours`, `livecrawlTimeout`) when needed. - Old local docs mentioning `tokensNum` for `get_code_context_exa` are obsolete. ## Minimal MCP Schema Check ```bash EXA_URL="https://mcp.exa.ai/mcp?tools=web_search_exa,web_search_advanced_exa,web_fetch_exa,get_code_context_exa,company_research_exa,people_search_exa" EXA_SESSION_ID="" exa_rpc() { local payload="$1" local session_header=() local response if [ -n "$EXA_SESSION_ID" ]; then session_header=(-H "Mcp-Session-Id: $EXA_SESSION_ID") fi response="$(curl -isS "$EXA_URL" \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ "${session_header[@]}" \ --data "$payload")" if [ -z "$EXA_SESSION_ID" ]; then EXA_SESSION_ID="$(printf '%s\n' "$response" | awk 'tolower($0) ~ /^mcp-session-id:/ { sub(/^[^:]+:[[:space:]]*/, ""); gsub(/\r/, ""); print; exit }')" fi printf '%s\n' "$response" | sed -n 's/^data: //p' } exa_rpc '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"exa-schema-check","version":"0.1.0"}}}' >/dev/null exa_rpc '{"jsonrpc":"2.0","method":"notifications/initialized"}' >/dev/null exa_rpc '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' ``` Expected hosted anonymous tools from that request on 2026-06-23: - `web_search_exa` - `web_search_advanced_exa` - `company_research_exa` - `web_fetch_exa` - `people_search_exa` - `get_code_context_exa` `deep_search_exa` was requested separately but did not register anonymously, matching official source behavior that requires a user-provided API key. Rechecked on 2026-06-28 with `deep_search_exa` included in `tools=`: - Returned HTTP 401 with `Authentication required. Use OAuth or provide an API key.` - Without `deep_search_exa`, anonymous hosted MCP still returns `web_search_exa`, `web_search_advanced_exa`, `web_fetch_exa`, and requested deprecated tools. - npm package `exa-mcp-server@3.2.1` confirms `deep_search_exa` only registers when a user-provided API key is present. - `web_search_advanced_exa` still exposes deprecated `highlightsNumSentences` and `highlightsPerUrl`; prefer `highlightsMaxCharacters`. Rechecked on 2026-07-06: - Official repo `main` is `8823cbea80b6ec5999c6217cccd91660fe953b97`. - npm latest remains `exa-mcp-server@3.2.1`, package `gitHead` remains `74438bc48ea9853e2e3e56f72535edc4f5c34bf6`, and tarball SHA-256 remains `675688dffcd746b8bb6ac7f077b64b7382c4a305f948d44ba526e67be50396df`. - Anonymous hosted schema still returns `web_search_exa`, `web_search_advanced_exa`, `company_research_exa`, `web_fetch_exa`, `people_search_exa`, and `get_code_context_exa` with the same parameter surface. - Requesting only `deep_search_exa` still returns HTTP 401 `Authentication required. Use OAuth or provide an API key.` ## Direct HTTP Smoke Result No-proxy direct HTTP passed on 2026-06-23: - `initialize`: protocol `2025-06-18`, server `exa-search-server`, version `3.2.1` - `tools/list`: returned `web_search_exa`, `web_search_advanced_exa`, `web_fetch_exa` - `tools/call web_search_exa`: returned `isError=false` and formatted search text - `tools/call web_search_advanced_exa`: returned `isError=false` and JSON text - `tools/call web_fetch_exa`: returned `isError=false` and fetched page text Rechecked on 2026-07-15: - Official repo `main` advanced to `8823cbea80b6ec5999c6217cccd91660fe953b97`. - npm latest remains `exa-mcp-server@3.2.1`, package `gitHead` remains `74438bc48ea9853e2e3e56f72535edc4f5c34bf6`, and tarball SHA-256 remains `675688dffcd746b8bb6ac7f077b64b7382c4a305f948d44ba526e67be50396df`. - Hosted `initialize` still returns `serverInfo.version=3.2.1`. - No skill body/tool-choice change required beyond source SHA refresh. Rechecked on 2026-07-23: - Official repo `main` advanced to `0de23f94b7e8539192bdc2008c16592156ada870`. - npm latest remains `exa-mcp-server@3.2.1`; package `gitHead` and tarball SHA-256 remain unchanged. - Hosted advanced schema now uses category `publication` instead of `research paper` and exposes deprecated `highlightsNumSentences` / `highlightsPerUrl` compatibility fields. Rechecked on 2026-08-15: - Official repo `main` advanced to `e64c11f2d3b4400ffbda8ccdd9658a450cc9d270`. - npm latest is `exa-mcp-server@3.4.0`; package `gitHead` is `a664592b5dd7c5598b70158c771dcc5c2a4fb2c1`; tarball SHA-256 is `cbc24567086756cde087eee8d8f617b7c423b1761e068e2b52e167b013e63f19`. - Hosted `initialize` still returns `serverInfo.version=3.2.1`. - Anonymous hosted `tools/list` still returns `web_search_exa`, `web_search_advanced_exa`, `company_research_exa`, `web_fetch_exa`, `people_search_exa`, and `get_code_context_exa` with the same parameter surface, including category `publication` and deprecated highlight compatibility fields. - No skill body/tool-choice change required beyond source SHA and npm metadata refresh. Rechecked on 2026-09-04: - Official repo `main` is `15ffb50519e719dc791cdc750ce5ed1934c0a1ed`; npm latest is `exa-mcp-server@3.4.1` with package `gitHead` `66bacbe4afd35a7e1671be9ab55c2b6bf60aff34`. - Hosted `initialize` still returns `serverInfo.version=3.2.1`. - Anonymous hosted `tools/list` returns the same six requested tools and parameter surface, including category `publication` and deprecated highlight compatibility fields. - The skill's tool selection and invocation guidance remain unchanged.
-
-
SKILL.md 6.4 KB
--- name: exa-search description: Use Exa MCP for current web, code/docs, company, people, and page-fetch research. Prefer current hosted tool schemas and note deprecated tools. --- # Exa MCP Search Use this skill when online search, page fetch, code/docs lookup, company research, people research, or Exa MCP parameter checks are needed. ## Current Source Of Truth - Hosted MCP endpoint: `https://mcp.exa.ai/mcp` - Official source: `exa-labs/exa-mcp-server@15ffb50519e719dc791cdc750ce5ed1934c0a1ed` - Current npm package checked: `exa-mcp-server@3.4.1`; verified tarball SHA-256 `62379fab5750cbc8334f096ff986ab1b7152488afffab5b0e275995310b6e978` - Tool schemas can change. Before adding new parameters, verify with `tools/list` through a normal HTTP client. Direct MCP HTTP is the required invocation model for this skill. `curl` is fine, but keep the session and SSE parsing in small shell helpers instead of repeating low-level flags at every call site. ## Tool Choice | Need | Prefer | Notes | | --- | --- | --- | | General current web search | `web_search_exa` | Simple search. Only `query` and `numResults`. | | Filtered search, dates, domains, categories, summaries, highlights, subpages | `web_search_advanced_exa` | Enable explicitly in `tools=`. Use this for company/people/papers/news filters. | | Read known URLs fully | `web_fetch_exa` | Use after search when highlights are insufficient. | | Code examples/docs | `web_search_exa` | `get_code_context_exa` still exists but is deprecated. | | Company research | `web_search_advanced_exa` with `category:"company"` | `company_research_exa` still exists but is deprecated. | | People/profiles | `web_search_advanced_exa` with `category:"people"` | `people_search_exa` still exists but is deprecated. | ## Core Parameters ### `web_search_exa` - `query` required: semantically rich natural-language query. Can include `category:company` or `category:people`. - `numResults` optional: default `10`. - No `type`, `livecrawl`, `contextMaxCharacters`, or `tokensNum` on current hosted schema. ```json {"query":"latest AI safety research June 2026","numResults":10} ``` ### `web_search_advanced_exa` - `query` required. - Common optional filters: `numResults`, `type` (`auto` | `fast` | `instant`), `category`, `includeDomains`, `excludeDomains`, `startPublishedDate`, `endPublishedDate`, `startCrawlDate`, `endCrawlDate`, `includeText`, `excludeText`, `userLocation`, `moderation`, `additionalQueries`. - Content controls: `textMaxCharacters`, `contextMaxCharacters`, `enableSummary`, `summaryQuery`, `enableHighlights`, `highlightsMaxCharacters`, `highlightsQuery`, `maxAgeHours`, `livecrawlTimeout`, `subpages`, `subpageTarget`. - Deprecated highlight controls: `highlightsNumSentences`, `highlightsPerUrl`; prefer `highlightsMaxCharacters`. - Categories include `company`, `publication`, `news`, `pdf`, `github`, `personal site`, `people`, `financial report`. ```json { "query":"Anthropic funding valuation 2026", "category":"news", "includeDomains":["techcrunch.com","bloomberg.com"], "startPublishedDate":"2026-01-01", "numResults":10, "type":"auto", "enableHighlights":true } ``` ### `web_fetch_exa` - `urls` required: array of URLs. Batch multiple URLs in one call. - `maxCharacters` optional: default `3000`. ```json {"urls":["https://docs.exa.ai/reference"],"maxCharacters":5000} ``` ### Deprecated But Still Available - `get_code_context_exa`: use `web_search_exa` instead. Current schema is `query`, `numResults`; old `tokensNum` is obsolete. - `company_research_exa`: use `web_search_advanced_exa` with `category:"company"` instead. Schema is `companyName`, `numResults`; default `3`. - `people_search_exa`: use `web_search_advanced_exa` with `category:"people"` instead. - `crawling_exa`: use `web_fetch_exa` instead. - `deep_search_exa`: use `web_search_advanced_exa` instead; current hosted MCP requires OAuth or an API key when this tool is requested. - `deep_researcher_start` / `deep_researcher_check`: deprecated; use Exa Research API directly when needed. ## Curl Pattern 1. POST `initialize`; keep returned `Mcp-Session-Id` response header. 2. POST `notifications/initialized` with that header. 3. POST `tools/list` or `tools/call` with that header. 4. If response is `text/event-stream`, parse JSON from `data:` lines. ### Minimal Curl Helper ```bash EXA_URL="https://mcp.exa.ai/mcp?tools=web_search_exa,web_search_advanced_exa,web_fetch_exa" EXA_SESSION_ID="" exa_rpc() { local payload="$1" local session_header=() local response if [ -n "$EXA_SESSION_ID" ]; then session_header=(-H "Mcp-Session-Id: $EXA_SESSION_ID") fi response="$(curl -isS "$EXA_URL" \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ "${session_header[@]}" \ --data "$payload")" if [ -z "$EXA_SESSION_ID" ]; then EXA_SESSION_ID="$(printf '%s\n' "$response" | awk 'tolower($0) ~ /^mcp-session-id:/ { sub(/^[^:]+:[[:space:]]*/, ""); gsub(/\r/, ""); print; exit }')" fi printf '%s\n' "$response" | sed -n 's/^data: //p' } exa_init() { exa_rpc '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"exa-curl","version":"0.1.0"}}}' >/dev/null exa_rpc '{"jsonrpc":"2.0","method":"notifications/initialized"}' >/dev/null } exa_call() { local tool_name="$1" local arguments_json="$2" jq -nc --arg name "$tool_name" --argjson arguments "$arguments_json" \ '{jsonrpc:"2.0",id:2,method:"tools/call",params:{name:$name,arguments:$arguments}}' | while IFS= read -r payload; do exa_rpc "$payload"; done } exa_init exa_call web_search_exa '{"query":"latest AI safety research","numResults":5}' ``` Tool output format differs: `web_search_exa` returns formatted text, `web_search_advanced_exa` returns JSON text, and `web_fetch_exa` returns fetched page text. ## Research Practice - For simple lookup, run one targeted `web_search_exa` call. - For dated/current questions, calculate exact date ranges first and pass `startPublishedDate` / `endPublishedDate` through `web_search_advanced_exa`. - For source-heavy tasks, fetch only the best URLs with `web_fetch_exa`; do not dump raw results into the final answer. - For company/people/paper/news workflows, prefer `web_search_advanced_exa` categories rather than deprecated specialized tools. - Mention source uncertainty when Exa returns sparse, conflicting, or old results. ## References - Tool fields: `references/exa-tools.md`
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.