Skip to main content
Glama
README.md
# MCP Exa

> A Python MCP server that exposes Exa search capabilities (no API key required)

[![PyPI](https://img.shields.io/pypi/v/mcp-exa.svg)](https://pypi.org/project/mcp-exa/)
[![Python](https://img.shields.io/pypi/pyversions/mcp-exa.svg)](https://pypi.org/project/mcp-exa/)
[![Coverage](https://codecov.io/gh/daedalus/mcp-exa/branch/main/graph/badge.svg)](https://codecov.io/gh/daedalus/mcp-exa)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

mcp-name: io.github.daedalus/mcp-exa

## Install

```bash
pip install mcp-exa
```

## Usage

No API key required. The server uses Exa's public MCP endpoint.

Run the MCP server:

```bash
mcp-exa
```

Or use as a module:

```bash
python -m mcp_exa
```

## Configuration

### Available Tools

The server exposes the following MCP tools:

| Tool | Description |
| ---- | ----------- |
| `web_search_exa` | Search the web for any topic |
| `get_code_context_exa` | Find code examples from GitHub, Stack Overflow |
| `crawling_exa` | Get full content from a specific URL |
| `web_search_advanced_exa` | Advanced search with filters |

## MCP Client Configuration

### Claude Desktop

Add to your config file:
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "exa": {
      "command": "mcp-exa"
    }
  }
}
```

### OpenCode

Add to your `opencode.json`:

```json
{
  "mcp": {
    "exa": {
      "type": "stdio",
      "command": "mcp-exa",
      "enabled": true
    }
  }
}
```

## Development

```bash
git clone https://github.com/daedalus/mcp-exa.git
cd mcp-exa
pip install -e ".[test]"

# run tests
pytest

# format
ruff format src/ tests/

# lint
ruff check src/ tests/

# type check
mypy src/
```

TDQS

B3.1/5.0

Scored across 9 tools

Disambiguation3/5

Most tools have clear boundaries (search, get_contents, find_similar, research_*), but answer and stream_answer are nearly identical except for streaming behavior, which could cause misselection. find_similar and search are related but distinct enough with descriptions.

Naming Consistency3/5

The research_* tools follow a consistent prefix pattern, but the rest mix bare verbs (search, answer), verb_noun (find_similar, get_contents, stream_answer), and a long descriptive phrase (research_poll_until_finished), creating an inconsistent feel.

Tool Count4/5

9 tools is a reasonable size for a search and research server, covering immediate searches, content retrieval, and async research workflows. Slightly more than strictly necessary due to answer/stream_answer duplication, but not excessive.

Completeness4/5

The core search, similar, content, answer, and research lifecycle (create, get, poll, list) are covered. A notable gap is the lack of a cancel/delete research operation, but most main workflows are complete.

Maintenance

ActivityInactive
ResponsivenessNo issues