/exa-research
Use when researching products, finding academic papers, discovering competitors, reading webpage content, or getting cited answers grounded in real web sources. Use over generic search when semantic relevance matters.
$ npx -y skills add BlockRunAI/blockrun-mcp --skill exa-research --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/exa-research
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when researching products, finding academic papers, discovering competitors, reading webpage content, or getting cited answers grounded in real web sources. Use over generic search when semantic relevance matters.
SKILL.md
exa-research.SKILL.mdname: exa-research
description: Use when researching products, finding academic papers, discovering competitors, reading webpage content, or getting cited answers grounded in real web sources. Use over generic search when semantic relevance matters.
triggers:
- "research"
- "web research"
- "find papers"
- "academic papers"
- "competitor discovery"
- "find similar sites"
- "exa search"
- "cited answer"
- "scrape webpage"
- "neural search"
- "semantic search"
- "look up sources"
Exa Research
Neural web search via BlockRun. Understands meaning, not keywords. Four distinct actions for different research modes.
How to Call from MCP
As of v0.14.1 the `blockrun_exa` tool is path-based. Pass the endpoint name as `path` and the request as `body`:
blockrun_exa({ path: "search", body: { query: "AI agent frameworks 2026", numResults: 10 } })
blockrun_exa({ path: "answer", body: { query: "What is speculative decoding?" } })
blockrun_exa({ path: "contents", body: { urls: ["https://example.com/a", "https://example.com/b"] } })
blockrun_exa({ path: "find-similar", body: { url: "https://arxiv.org/abs/2401.12345", numResults: 5 } })Quick Decision Table
Costs below are what you are actually CHARGED — the $0.001 transaction fee is already included (it applies once per call, not per result).
| User wants... | Path | Body | Cost | |--------------|------|------|------| | Relevant URLs on a topic | `search` | `{ query, numResults?, category? }` | $0.0110/call | | Cited answer to a question | `answer` | `{ query }` | $0.0110/call | | Full text of URLs | `contents` | `{ urls: [...] }` | $0.002/URL + $0.001 → 1 URL $0.0030, 3 URLs $0.0070 | | Pages like a given URL | `find-similar` | `{ url, numResults? }` | $0.0110/call | | Recent news | `search` + `category: "news"` | – | $0.0110/call | | Academic papers | `search` + `category: "research paper"` | – | $0.0110/call | | Company info | `search` + `category: "company"` | – | $0.0110/call |
`contents` bills per URL, so batching URLs into ONE call is markedly cheaper than one call each: 3 URLs together cost $0.0070, but three separate calls cost $0.0090 — you pay the flat fee three times instead of once.
Valid `category` values for `search`: `"news"`, `"research paper"`, `"company"`, `"tweet"`, `"github"`, `"pdf"`.
Python SDK Instructions
1. Initialize (Python SDK)
from blockrun_llm import setup_agent_wallet
chain = open(os.path.expanduser("~/.blockrun/.chain")).read().strip() if os.path.exists(os.path.expanduser("~/.blockrun/.chain")) else "base"
if chain == "solana":
from blockrun_llm import setup_agent_solana_wallet
client = setup_agent_solana_wallet()
else:
from blockrun_llm import setup_agent_wallet
client = setup_agent_wallet()2. Search — Find Relevant URLs
# Basic search
result = client._request_with_payment_raw("/v1/exa/search", {
"query": "AI agent frameworks 2025",
"numResults": 10,
})
for r in result.get("results", []):
print(f"{r['title']} — {r['url']}")
# Filter by category
result = client._request_with_payment_raw("/v1/exa/search", {
"query": "transformer architecture improvements",
"numResults": 10,
"category": "research paper",
})
# Restrict to specific domains
result = client._request_with_payment_raw("/v1/exa/search", {
"query": "prediction market regulation",
"numResults": 10,
"includeDomains": ["reuters.com", "bloomberg.com", "wsj.com"],
})**Categories:** `"news"`, `"research paper"`, `"company"`, `"tweet"`, `"github"`, `"pdf"`
3. Answer — Cited, Grounded Response
Use when the user asks a factual question and needs reliable sources (not Claude's training data).
result = client._request_with_payment_raw("/v1/exa/answer", {
"query": "What is the current market cap of Polymarket?",
})
print(result.get("answer", ""))
for c in result.get("citations", []):
print(f" [{c.get('title')}] {c.get('url')}")4. Contents — Fetch URL Text
Use when you have URLs and need their full text for LLM context (scraping without a browser).
urls = [
"https://example.com/article-1",
"https://example.com/article-2",
]
result = client._request_with_payment_raw("/v1/exa/contents", {
"urls": urls,
})
for item in result.get("results", []):
print(f"=== {item['url']} ===")
print(item.get("text", "")[:500])Up to 100 URLs per call. Returns Markdown-ready text.
5. Similar — Find Related Pages
Use to discover competitors, related research, or sites with similar content.
result = client._request_with_payment_raw("/v1/exa/find-similar", {
"url": "https://polymarket.com",
"numResults": 10,
})
for r in result.get("results", []):
print(f"{r['title']} — {r['url']}")Common Research Workflows
**Competitor discovery:**
# 1. Find similar companies
similar = client._request_with_payment_raw("/v1/exa/find-similar", {"url": "https://target-company.com", "numResults": 15})
urls = [r["url"] for r in similar.get("results", [])]
# 2. Fetch their about pages
contents = client._request_with_payment_raw("/v1/exa/contents", {"urls": urls[:10]})**Research synthesis:**
# 1. Find papers
papers = client._request_with_payment_raw("/v1/exa/search", {
"query": "your topic",
"category": "research paper",
"numResults": 20,
})
# 2. Get answer with citations
answer = client._request_with_payment_raw("/v1/exa/answer", {
"query": "What are the key findings on your topic?",
})When to Use Exa vs `client.search()`
| Use `blockrun_exa` / `_request_with_payment_raw` | Use `client.search()` | |---------------------------------------------------|----------------------| | Finding specific URLs and fetching content | Getting a summarized answer with citations | | Semantic similarity search | Web + news combined | | Academic paper discovery | Cheaper per call for simple lookups | | Domain-
Read more
name: exa-research description: Use when researching products, finding academic papers, discovering competitors, reading webpage content, or getting cited answers grounded in real web sources. Use over generic search when semantic relevance matters. triggers: - "research" - "web research" - "find papers" - "academic papers" - "competitor discovery" - "find similar sites" - "exa search" - "cited answer" - "scrape webpage" - "neural search" - "semantic search" - "look up sources"
Exa Research
Neural web search via BlockRun. Understands meaning, not keywords. Four distinct actions for different research modes.
How to Call from MCP
As of v0.14.1 the `blockrun_exa` tool is path-based. Pass the endpoint name as `path` and the request as `body`:
blockrun_exa({ path: "search", body: { query: "AI agent frameworks 2026", numResults: 10 } })
blockrun_exa({ path: "answer", body: { query: "What is speculative decoding?" } })
blockrun_exa({ path: "contents", body: { urls: ["https://example.com/a", "https://example.com/b"] } })
blockrun_exa({ path: "find-similar", body: { url: "https://arxiv.org/abs/2401.12345", numResults: 5 } })Quick Decision Table
Costs below are what you are actually CHARGED — the $0.001 transaction fee is already included (it applies once per call, not per result).
| User wants... | Path | Body | Cost | |--------------|------|------|------| | Relevant URLs on a topic | `search` | `{ query, numResults?, category? }` | $0.0110/call | | Cited answer to a question | `answer` | `{ query }` | $0.0110/call | | Full text of URLs | `contents` | `{ urls: [...] }` | $0.002/URL + $0.001 → 1 URL $0.0030, 3 URLs $0.0070 | | Pages like a given URL | `find-similar` | `{ url, numResults? }` | $0.0110/call | | Recent news | `search` + `category: "news"` | – | $0.0110/call | | Academic papers | `search` + `category: "research paper"` | – | $0.0110/call | | Company info | `search` + `category: "company"` | – | $0.0110/call |
`contents` bills per URL, so batching URLs into ONE call is markedly cheaper than one call each: 3 URLs together cost $0.0070, but three separate calls cost $0.0090 — you pay the flat fee three times instead of once.
Valid `category` values for `search`: `"news"`, `"research paper"`, `"company"`, `"tweet"`, `"github"`, `"pdf"`.
Python SDK Instructions
1. Initialize (Python SDK)
from blockrun_llm import setup_agent_wallet
chain = open(os.path.expanduser("~/.blockrun/.chain")).read().strip() if os.path.exists(os.path.expanduser("~/.blockrun/.chain")) else "base"
if chain == "solana":
from blockrun_llm import setup_agent_solana_wallet
client = setup_agent_solana_wallet()
else:
from blockrun_llm import setup_agent_wallet
client = setup_agent_wallet()2. Search — Find Relevant URLs
# Basic search
result = client._request_with_payment_raw("/v1/exa/search", {
"query": "AI agent frameworks 2025",
"numResults": 10,
})
for r in result.get("results", []):
print(f"{r['title']} — {r['url']}")
# Filter by category
result = client._request_with_payment_raw("/v1/exa/search", {
"query": "transformer architecture improvements",
"numResults": 10,
"category": "research paper",
})
# Restrict to specific domains
result = client._request_with_payment_raw("/v1/exa/search", {
"query": "prediction market regulation",
"numResults": 10,
"includeDomains": ["reuters.com", "bloomberg.com", "wsj.com"],
})**Categories:** `"news"`, `"research paper"`, `"company"`, `"tweet"`, `"github"`, `"pdf"`
3. Answer — Cited, Grounded Response
Use when the user asks a factual question and needs reliable sources (not Claude's training data).
result = client._request_with_payment_raw("/v1/exa/answer", {
"query": "What is the current market cap of Polymarket?",
})
print(result.get("answer", ""))
for c in result.get("citations", []):
print(f" [{c.get('title')}] {c.get('url')}")4. Contents — Fetch URL Text
Use when you have URLs and need their full text for LLM context (scraping without a browser).
urls = [
"https://example.com/article-1",
"https://example.com/article-2",
]
result = client._request_with_payment_raw("/v1/exa/contents", {
"urls": urls,
})
for item in result.get("results", []):
print(f"=== {item['url']} ===")
print(item.get("text", "")[:500])Up to 100 URLs per call. Returns Markdown-ready text.
5. Similar — Find Related Pages
Use to discover competitors, related research, or sites with similar content.
result = client._request_with_payment_raw("/v1/exa/find-similar", {
"url": "https://polymarket.com",
"numResults": 10,
})
for r in result.get("results", []):
print(f"{r['title']} — {r['url']}")Common Research Workflows
**Competitor discovery:**
# 1. Find similar companies
similar = client._request_with_payment_raw("/v1/exa/find-similar", {"url": "https://target-company.com", "numResults": 15})
urls = [r["url"] for r in similar.get("results", [])]
# 2. Fetch their about pages
contents = client._request_with_payment_raw("/v1/exa/contents", {"urls": urls[:10]})**Research synthesis:**
# 1. Find papers
papers = client._request_with_payment_raw("/v1/exa/search", {
"query": "your topic",
"category": "research paper",
"numResults": 20,
})
# 2. Get answer with citations
answer = client._request_with_payment_raw("/v1/exa/answer", {
"query": "What are the key findings on your topic?",
})When to Use Exa vs `client.search()`
| Use `blockrun_exa` / `_request_with_payment_raw` | Use `client.search()` | |---------------------------------------------------|----------------------| | Finding specific URLs and fetching content | Getting a summarized answer with citations | | Semantic similarity search | Web + news combined | | Academic paper discovery | Cheaper per call for simple lookups | | Domain-
Live data for AI agents — search, research, markets, crypto, X/Twitter. Pay-per-call via x402 micropayments.
Repo: BlockRunAI/blockrun-mcp
Other skills on blockrun-mcp.
- /blockrun
Pay-per-call access to AI models, real-time data, media generation and multi-chain RPC over x402 micropayments (USDC on Base or Solana). No API keys, no accounts, no subscriptions. Start here when you have the BlockRun MCP installed and need to know WHICH tool answers a
Open skill - /crypto-data
Use for any crypto data question — token/coin prices, FX, commodities, stocks, OHLC history, DEX pairs and liquidity, DeFi TVL, yield/APY pools, on-chain SQL, wallet labels and net worth, social mindshare, news, or raw JSON-RPC against a chain. Routes across five tools that
Open skill - /gentech-blockrun
GenTech Labs' integration patterns for BlockRun MCP from Hermes Agent. Covers daily usage patterns, cost-optimized workflows, multi-tool pipelines, and reliable error handling for BlockRun's full toolset.
Open skill - /image-prompting
Use when generating or editing images via `blockrun_image` — especially with GPT Image 2, Nano Banana, or Grok Imagine for posters, UI mockups, marketing assets, product shots, or anything with on-image text. Turns vague user requests ("make me a cool poster") into structured,
Open skill - /modal
Use when the user needs to run isolated code remotely — a disposable container, optional GPU access (T4 → H100), or a safer place for untrusted / heavy code. Prefer local execution for normal repo work; use Modal sandboxes for isolation, hardware access, or one-shot heavy
Open skill - /phone
Use when the user wants phone-number intelligence (lookup, carrier, line type, SIM-swap / call-forwarding fraud signals), US/CA number provisioning (rent a phone number), or outbound AI voice calls (Bland.ai under the hood — schedule, confirm, follow-up). Pay per call in USDC.
Open skill

