Search the web with Exa, the fastest and most accurate web search API. Get token-efficient highlights and full page content.
The ExaSearchTool lets CrewAI agents search the web using Exa, the fastest and most accurate web search API. It returns the most relevant results for any query, with options for token-efficient highlights and full page content.
Here’s how to use the ExaSearchTool within a CrewAI agent:
import osfrom crewai import Agent, Task, Crewfrom crewai_tools import ExaSearchTool# Initialize the toolexa_tool = ExaSearchTool()# Create an agent that uses the toolresearcher = Agent( role='Research Analyst', goal='Find the latest information on any topic', backstory='An expert researcher who finds the most relevant and up-to-date information.', tools=[exa_tool], verbose=True)# Create a task for the agentresearch_task = Task( description='Find the top 3 recent breakthroughs in quantum computing.', expected_output='A summary of the top 3 breakthroughs with source URLs.', agent=researcher)# Form the crew and kick it offcrew = Crew( agents=[researcher], tasks=[research_task], verbose=True)result = crew.kickoff()print(result)
The ExaSearchTool accepts the following parameters during initialization:
type (str, optional): The search type to use. Defaults to "auto". Options: "auto", "instant", "fast", "deep".
highlights (bool or dict, optional): Return token-efficient excerpts most relevant to the query instead of the full page. Defaults to True. Pass a dict like {"max_characters": 4000} to configure, or False to disable.
content (bool, optional): Whether to include full page content in results. Defaults to False.
api_key (str, optional): Your Exa API key. Falls back to the EXA_API_KEY environment variable if not provided.
base_url (str, optional): Custom API server URL. Falls back to the EXA_BASE_URL environment variable if not provided.
When calling the tool (or when an agent invokes it), the following search parameters are available:
search_query (str): Required. The search query string.
start_published_date (str, optional): Filter results published after this date (ISO 8601 format, e.g. "2024-01-01").
end_published_date (str, optional): Filter results published before this date (ISO 8601 format).
include_domains (list[str], optional): A list of domains to restrict the search to.
For most agent workflows we recommend highlights — it returns the most relevant excerpts from each result and uses far fewer tokens than full page content:
# Get token-efficient excerpts most relevant to the queryexa_tool = ExaSearchTool( highlights=True, type="auto",)# Use it in an agentagent = Agent( role="Researcher", goal="Answer questions with current web data", tools=[exa_tool])
For thorough, multi-step searches, use type="deep":
You can also connect your agent to Exa’s hosted MCP server. Pass your API key with the x-api-key header:
from crewai import Agentfrom crewai.mcp import MCPServerHTTPagent = Agent( role="Research Analyst", goal="Find and analyze information on the web", backstory="Expert researcher with access to Exa's tools", mcps=[ MCPServerHTTP( url="https://mcp.exa.ai/mcp", headers={"x-api-key": "YOUR_EXA_API_KEY"}, ), ],)
Token-Efficient Highlights: Get the most relevant excerpts from each result, ~10x fewer tokens than full text
Semantic Search: Find results based on meaning, not just keywords
Full Content Retrieval: Get the full text of web pages alongside search results
Date Filtering: Limit results to specific time periods with published date filters
Domain Filtering: Restrict searches to specific domains
EXASearchTool is a deprecated alias for ExaSearchTool. Existing imports continue to work but will emit a deprecation warning; please migrate to ExaSearchTool.