A Monday competitor watch
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.
Verified MCP server: Exa
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]
Verification
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
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.
| Tool | What 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
Copy the block for the app you use. Each one is the configuration this server was verified with.
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]
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]
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]
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
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.
01
Download the app from getroutines.ai/download, drag it to Applications, and sign in.
02
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.
03
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.
04
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.
05
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.
06
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
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.
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.
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.
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
Real errors captured during the verification run, printed exactly as the server returned them.
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.
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.
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.
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.
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.
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
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]
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.
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]
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]
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]
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]
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
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]
Latest version 3.4.0, published 2026-08-01. No license field in the package metadata.
[2]
[3]
Version 0.0.7, last published 2025-04-02, no author or repository listed, 108 downloads in the same week.
[4]
Lists the community forks: markov-exa-mcp-server, @199bio/exa-mcp-server, exa-acp-mcp, @pipeworx/mcp-exa, @mcpcn/exa-mcp.
[5]
4,810 stars, 363 forks, last push 2026-08-01, not archived, per the GitHub API.
[6]
[7]
Version 3.4.0, bin exa-mcp-server, engines.node >=20.0.0, and no license field.
[8]
The install matrix: the hosted https://mcp.exa.ai/mcp endpoint first, the npm package with EXA_API_KEY under Via npm Package.
[9]
web_search_exa and web_fetch_exa are the tools enabled by default.
[10]
The key is read at call time, not at boot, which is why the server starts without one.
[11]
[12]
The official Claude Desktop quickstart and the config file location.
[13]
The claude mcp add syntax for local stdio servers and for HTTP transports.
[14]
The mcp.json shape, including url servers, and the file locations.
[15]
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