Verified MCP server: Exa

The Exa MCP server, its live tool list captured on a real Mac.

  • Tools enumerated2026-08-03macOS 14.4.1
  • Packageexa-mcp-server 3.4.0
  • Self-reportedexa-search-server 3.4.0
  • MCP protocol2025-06-18
  • Runtimev25.8.1

The tool list below is a live capture from the running server; an authenticated tool call is still pending credentials.

The short answer

Last verified 2026-08-03

The Exa MCP server gives an AI assistant a search engine built for AI: you describe the page you want in a sentence, and it returns clean article text instead of a list of blue links, plus a second tool that reads any URL as markdown. It is the official server from Exa Labs, MIT licensed in its repository, and it comes in two shapes. The npm package on this page, exa-mcp-server, runs on your own Mac over stdio and reads an API key from EXA_API_KEY. Exa now leads its own install matrix with a hosted server at https://mcp.exa.ai/mcp instead, where you sign in with your Exa account and paste no key anywhere. We ran the npm package, enumerated both tools it exposes, poked the hosted endpoint too, and kept every raw reply, including the exact errors it returns when the key is missing or wrong. [1][5][6][8][10]

  • Tools

    2, enumerated live

  • Credentials

    Exa API key needed [8]

  • Transport

    stdio, or a hosted URL [8]

  • Maintainer

    Exa Labs, official [1][5]

  • Downloads

    24.5k last week [2]

  • License

    MIT in the repo, blank on npm [6][7]

Verification

How this MCP server was verified.

Method

We spawned the server with npx over stdio, completed the MCP initialize handshake, called tools/list, and made one real tool call. The tool table below is that response, word for word, and the protocol version above is read straight off the raw initialize reply. This Mac holds no Exa API key, so EXA_API_KEY was set to an obvious placeholder instead of a real one. That turned out not to matter for booting: this server never checks the key at startup, so it starts and describes itself either way. The moment a tool runs, the request leaves for api.exa.ai and the placeholder is exposed, which is the 401 printed below. An authenticated call is pending credentials.

Startup banner

{"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{"listChanged":true},"prompts":{"listChanged":true},"resources":{"listChanged":true}},"serverInfo":{"name":"exa-search-server","title":"Exa","version":"3.4.0","websiteUrl":"https://exa.ai","icons":[{"src":"https://exa.ai/images/favicon-32x32.png","mimeType":"image/png","sizes":["32x32"]}]}},"jsonrpc":"2.0","id":1}

One real tool call

tools/call web_search_exa {"query": "model context protocol", "numResults": 3}
web_search_exa error (401): Invalid API key
Timestamp: 2026-08-03T04:51:41.361Z

Real lines from the captured result: enough to prove the call answered.

Tools

Every tool, enumerated from the running server.

The server answered tools/list with 2 tools on 2026-08-03. The names, descriptions and parameters below are its own words, copied from that response and never edited.

ToolWhat it does
web_search_exaquery*numResults

Search the web for any topic and get clean, ready-to-use content. Best for: Finding current information, news, facts, people, companies, or answering questions about any topic. Returns: Clean text content from top search results. Query tips: describe the ideal page, not keywords. "blog post comparing React and Vue performance" not "React vs Vue". Use category:people / category:company to search through Linkedin profiles / companies respectively. If highlights are insufficient, follow up with web_fetch_exa on the best URLs.

web_fetch_exaurls*maxCharacters

Read a webpage's full content as clean markdown. Use after web_search_exa when highlights are insufficient or to read any URL. Best for: Extracting full content from known URLs. Batch multiple URLs in one call. Returns: Clean text content and metadata from the page(s).

Parameters marked with * are required.

Setup

Working configs, one per app.

Copy the block for the app you use. Each one is the configuration this server was verified with.

Claude Desktop

Open the file ~/Library/Application Support/Claude/claude_desktop_config.json (in Claude Desktop: Settings, then Developer, then Edit Config) and add:

{
  "mcpServers": {
    "exa": {
      "command": "npx",
      "args": [
        "-y",
        "exa-mcp-server"
      ],
      "env": {
        "EXA_API_KEY": "your_api_key"
      }
    }
  }
}

Paste your own key from dashboard.exa.ai, then quit and reopen Claude Desktop. Two shorter routes exist if you would rather not hold a key at all: Claude Desktop lists Exa on its Connectors page, and the README also shows npx -y mcp-remote https://mcp.exa.ai/mcp, which signs you in to Exa in the browser instead. [8][12]

Claude Code

The command Exa documents points at its hosted server, so there is no key to paste:

claude mcp add --transport http exa https://mcp.exa.ai/mcp

# or the local npm package with your own key:
claude mcp add --env EXA_API_KEY=your_api_key exa -- npx -y exa-mcp-server

The first line is the exact command in the README. The second is the stdio equivalent for people who want the package running on their own machine: everything after the double dash is the command Claude Code will run. [8][13]

Cursor

Add to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside one project. Exa documents the hosted URL here:

{
  "mcpServers": {
    "exa": {
      "url": "https://mcp.exa.ai/mcp"
    }
  }
}

Cursor picks the file up on restart. To run the package locally instead, replace the url line with the command, args and env block shown in the Claude Desktop tab. If you do that, treat the file the way you treat any file with a key in it: it is plain text on disk, so keep it out of a repository you push. [8][14]

Routines

No JSON file and no terminal. In Routines: Settings, then Assistant, then Connections, then Add MCP Server. Switch the form to Command (stdio) and enter:

Name        Exa
Command     npx
Arguments   -y exa-mcp-server

Environment Variables
EXA_API_KEY    your_api_key

The Arguments field splits on spaces, so keep it to exactly those three words. The key goes in Environment Variables, never in Arguments. If you would rather use Exa's hosted server, leave the form on URL (SSE/HTTP) and enter https://mcp.exa.ai/mcp instead. Click Test Connection first: a working server answers with its tool count, two for this one. [15][8]

No terminal needed

Set the Exa MCP server up without the terminal.

If you have never opened Terminal and never want to, this is your path. Routines is a Mac app that runs MCP servers for you: fill in a few fields once, and this server's tools are available to your AI in chat and in scheduled routines. The only detour is the Exa API key, and it takes about two minutes.

  1. 01

    Install Routines

    Download the app from getroutines.ai/download, drag it to Applications, and sign in.

  2. 02

    Get an Exa API key

    Go to dashboard.exa.ai/api-keys, create an account, and copy the key it shows you. Exa gives new accounts a small amount of free search credit, so you can try this before deciding whether to pay for anything.

  3. 03

    Open the MCP settings

    Back in Routines, click your account at the bottom of the sidebar and choose Settings. Open the Assistant section, then the Connections tab, scroll to MCP Servers, and click Add MCP Server.

  4. 04

    Choose Command (stdio)

    The form opens in URL (SSE/HTTP) mode. Switch it to Command (stdio): the package is a command, not a web address. Name: Exa. Command: npx. Arguments: -y exa-mcp-server, exactly those three words.

  5. 05

    Add the key, then test

    In Environment Variables add EXA_API_KEY with the key you copied. Click Test Connection: Routines starts the server without saving it and reports how many tools it found, two for this one. Then click Add Server.

  6. 06

    Use it

    The tools work in chat right away. To let a scheduled routine use them, open the routine, find the Tools & connections card, and tick the server under Apps.

Routine ideas

Routines worth scheduling.

Once the server is connected, a scheduled routine can use its tools while you are away. Copy a prompt, paste it into Routines, and pick a time.

A Monday competitor watch

Prompt

Every Monday at 8:00, search the web for anything published in the last seven days about my three main competitors, read the pages worth reading, and write a one-page brief with links to competitors.md in my Notes folder.

A weekly topic digest

Prompt

Every Friday at 17:00, search for the best new articles and research published this week on the topics I follow, read the top five, and save a short summary of each with its link to weekly-reading.md.

A pre-meeting company brief

Prompt

Every weekday at 7:30, look at the companies I am meeting today, search the web for their recent news, funding and product launches, and write a five-line brief on each to meeting-brief.md.

Troubleshooting

The errors we hit, and what fixed them.

Real errors captured during the verification run, printed exactly as the server returned them.

The tools are listed, but every call answers Invalid API key

What you see

web_search_exa error (401): Invalid API key
Timestamp: 2026-08-03T04:51:41.361Z

The fix

This 401 is Exa's answer, not the server's: the server passed your key through and api.exa.ai rejected it. This is exactly what our run produced, because we booted the server with a placeholder key on purpose. Check that you copied the whole key from dashboard.exa.ai/api-keys, that it has not been rotated, and that your Exa account still has search credit.

You never set the key at all

What you see

web_search_exa error (401): API key must be provided as an argument or as an environment variable (EXA_API_KEY)
Timestamp: 2026-08-03T04:56:08.409Z

The fix

A different message from the one above, and a useful one: it means the variable never reached the server. The server itself starts happily with no key and still lists its tools, so the problem only shows up on the first real call. In Claude Desktop and Cursor the key goes in the env block, in Routines it goes in Environment Variables, and in Claude Code it goes in an --env flag.

A tool call is rejected before it reaches Exa

What you see

MCP error -32602: Input validation error: Invalid arguments for tool web_search_exa: [
  {
    "code": "invalid_type",
    "expected": "string",
    "received": "undefined",
    "path": [
      "query"
    ],
    "message": "Required"
  }
]

The fix

The server validates arguments locally before it calls Exa, so a missing required field never costs you a search credit. We triggered this by calling web_search_exa with no query. The same shape comes back from web_fetch_exa when urls is missing. Nothing is broken: the assistant simply needs to send the required field, which the tool table above lists.

Half your tools vanished after you set ENABLED_TOOLS

The fix

The server accepts an optional ENABLED_TOOLS variable that limits which tools it registers, and it fails silently: we started it with ENABLED_TOOLS set to web_search_exa,not_a_real_tool and it came up with one tool, no warning on stderr and no error anywhere. If a tool you expected is missing, check that variable first and check the spelling of every name in it against the tool table above.

The hosted URL answers Method not allowed in a browser

What you see

{"jsonrpc":"2.0","error":{"code":-32000,"message":"Method not allowed."},"id":null}

The fix

We got this back as an HTTP 405 from a plain GET to https://mcp.exa.ai/mcp, which is what a browser sends. It is not an outage: the hosted server speaks streamable HTTP and only answers POST. Pointing an MCP client at that URL works fine, and it answered our POST handshake without any credential attached, reporting itself as exa-search-server 3.2.1. Do not judge it by what a browser shows you.

Your MCP client cannot start the server at all

The fix

The npx command belongs to Node.js, and this package needs Node 20 or newer. If Node is missing or too old, every local config on this page fails at the spawn step before the server can say anything. Install Node from nodejs.org, restart your MCP client, and try again. The hosted URL needs no Node at all, which is one reason Exa leads with it.

FAQ

Questions people ask.

What is the Exa MCP server?

It is a small program that sits between an AI assistant and Exa, a search engine built for AI rather than for people scanning a results page. Once connected, an assistant such as Claude can search the web from a plain-language description of the page you want and read any URL back as clean markdown. The version we ran here runs as a local process on your Mac and talks to your AI app over stdio. [8][9]

What tools does the Exa MCP server include?

The running server exposes exactly 2 tools: web_search_exa, which takes a natural-language query and an optional result count, and web_fetch_exa, which takes a list of URLs and an optional character limit per page. The table above is the live tools/list output, word for word. Older versions and older tutorials show extra names like company_research_exa or deep_researcher_start; version 3.4.0 registered neither of them for us.

Do I need an API key or an account?

Yes, one or the other. The npm package reads EXA_API_KEY, which you create at dashboard.exa.ai/api-keys, and search is metered against your Exa account. Exa also runs a hosted server at https://mcp.exa.ai/mcp where you sign in with your Exa account instead of pasting a key. Either way there is an Exa account behind it: this is not a server you can run anonymously. [8]

Should I use the npm package or Exa's hosted server?

Exa now leads its own install matrix with the hosted server at https://mcp.exa.ai/mcp for nearly every client, and offers the npm package below it as the route for stdio-only clients. Pick the hosted one if you want the shortest setup and no key on disk. Pick the npm package, the one verified on this page, if you would rather the process ran on your own machine and the key stayed somewhere you control. [8][11]

Is the Exa MCP server safe to run?

The code is open source under the MIT license in the exa-labs repository, it is published by Exa Labs itself, and both tools it exposes declare themselves read-only in their own annotations: nothing here writes to your Mac. The real considerations are cost and confusion. Every search spends Exa credit, so a scheduled routine that searches hourly costs real money. And npm carries several similar names, including an unofficial exa-mcp last published in April 2025 and forks such as exa-acp-mcp that route requests through a third-party proxy. The official package is exa-mcp-server. [6][3][4]

Why does npm say the package has no license?

Because package.json has no license field, so the registry metadata reports none, while the repository carries a real LICENSE file: MIT, copyright Exa Labs 2025. Both facts are checkable and we checked both. It is a metadata gap, not a licensing trap, but it is worth knowing if your company screens dependencies by their npm license field. [1][7][6]

Which apps can use the Exa MCP server?

Any MCP client that can launch a local stdio server or connect to an HTTP one: Claude Desktop, Claude Code, Cursor, and Routines all can, and the exact config for each is above. Exa's own README also lists VS Code, Codex, Windsurf, Zed, OpenCode and Gemini CLI. The server is the same everywhere; only the place you paste the config differs. [8][12][13][14][15]

Sources

Every external claim, receipted.

Anything on this page we did not observe in the run is linked here, with the date we read it. The run itself is the receipt for the rest.

  1. [1]

    npm registry: exa-mcp-serveraccessed 2026-08-03

    Latest version 3.4.0, published 2026-08-01. No license field in the package metadata.

  2. [2]

    npm downloads API: last weekaccessed 2026-08-03

    24,528 downloads for the week ending 2026-08-02.

  3. [3]

    npm registry: exa-mcp, the unofficial namesakeaccessed 2026-08-03

    Version 0.0.7, last published 2025-04-02, no author or repository listed, 108 downloads in the same week.

  4. [5]

    GitHub: exa-labs/exa-mcp-serveraccessed 2026-08-03

    4,810 stars, 363 forks, last push 2026-08-01, not archived, per the GitHub API.

  5. [6]

    exa-labs/exa-mcp-server LICENSE fileaccessed 2026-08-03

    MIT License, Copyright (c) 2025 Exa Labs.

  6. [7]

    exa-labs/exa-mcp-server package.jsonaccessed 2026-08-03

    Version 3.4.0, bin exa-mcp-server, engines.node >=20.0.0, and no license field.

  7. [8]

    exa-labs/exa-mcp-server READMEaccessed 2026-08-03

    The install matrix: the hosted https://mcp.exa.ai/mcp endpoint first, the npm package with EXA_API_KEY under Via npm Package.

  8. [9]

    exa-mcp-server source: src/toolRegistry.tsaccessed 2026-08-03

    web_search_exa and web_fetch_exa are the tools enabled by default.

  9. [10]

    exa-mcp-server source: src/tools/config.tsaccessed 2026-08-03

    The key is read at call time, not at boot, which is why the server starts without one.

  10. [11]

    Exa docs: Exa MCPaccessed 2026-08-03

    The official docs page, mirroring the README install matrix.

  11. [12]

    modelcontextprotocol.io: Connect to local MCP serversaccessed 2026-08-03

    The official Claude Desktop quickstart and the config file location.

  12. [13]

    Claude Code docs: MCPaccessed 2026-08-03

    The claude mcp add syntax for local stdio servers and for HTTP transports.

  13. [14]

    Cursor docs: Model Context Protocolaccessed 2026-08-03

    The mcp.json shape, including url servers, and the file locations.

  14. [15]

    Routines: Connectorsaccessed 2026-08-03

    How Routines runs one-click OAuth connectors and any MCP server.

This page describes Exa as it behaved in one dated run on one Mac. Versions move: if something here no longer matches what you see, the capture date at the top says how old the reading is.

Behind this directory

Routines, the app behind this directory, runs MCP servers like this one without a terminal: see how connectors work. The briefs it writes stay markdown files on your Mac, and there is no cloud bill. Download Routines