# How mcporter Integrates Exa AI Search as an MCP Server Without API Keys

> Learn how mcporter integrates Exa AI Search as an MCP server without API keys. Route requests to Exa's public endpoint for secure, keyless semantic searches.

- Repository: [Pnant/Agent-Reach](https://github.com/Panniantong/Agent-Reach)
- Tags: how-to-guide
- Published: 2026-06-20

---

**mcporter eliminates API key requirements by routing requests to Exa's public MCP endpoint (`https://mcp.exa.ai/mcp`), which hosts the credentials server-side, allowing users to perform semantic searches without embedding secrets locally.**

The **Agent-Reach** repository demonstrates how **mcporter**—an npm-based CLI tool—bridges third-party services with the Model Context Protocol (MCP). By leveraging Exa AI's hosted MCP server, the integration provides free, semantic web search capabilities without forcing users to manage or expose API keys. This architecture delegates credential management to the service provider while maintaining a lightweight client-side configuration.

## How mcporter Eliminates API Key Requirements

Traditional API integrations require users to generate, store, and inject keys into environment variables or configuration files. The mcporter approach fundamentally changes this pattern by acting as a thin proxy to a pre-authenticated endpoint.

### The Public MCP Endpoint Pattern

Exa AI hosts a public MCP server at `https://mcp.exa.ai/mcp` that already contains the necessary API credentials. When mcporter forwards search requests to this endpoint, the server-side key handles authentication transparently. This pattern shifts the security burden from the user's machine to Exa's infrastructure, enabling truly keyless operation on the client side.

### Registration via mcporter config

Users register the endpoint once using mcporter's configuration system:

```bash

# Install mcporter globally

npm install -g mcporter

# Register the Exa MCP endpoint (no API key required)

mcporter config add exa https://mcp.exa.ai/mcp

```

After registration, the `mcporter` CLI stores this URL in its local configuration. Any subsequent `mcporter search` commands automatically route to this endpoint, which proxies the request to Exa's API using the server-side key.

## Detecting Exa Integration in Agent Reach

The **Agent-Reach** codebase implements health-check logic in [`agent_reach/channels/exa_search.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/exa_search.py) to verify whether mcporter is properly configured for Exa search. The `ExaSearchChannel.check()` method probes the local system to confirm the integration is active.

The detection workflow follows these steps:

1. **Probe mcporter installation**: Executes `mcporter config list` via `probe_command` to check if the tool is installed.
2. **Validate Exa endpoint**: Parses the command output for the string "exa" to confirm the endpoint is registered.
3. **Report status**: Returns a Chinese message indicating availability: "全网语义搜索可用（免费，无需 API Key）" (Global semantic search available, free, no API key required).

```python

# agent_reach/channels/exa_search.py

probe = probe_command("mcporter", ["config", "list"], timeout=10, package="mcporter")
if probe.status == "missing":
    return "off", "需要 mcporter + Exa MCP。安装：..."
if "exa" in probe.output.lower():
    self.active_backend = self.backends[0]
    return "ok", "全网语义搜索可用（免费，无需 API Key）"

```

If the probe fails or "exa" is absent from the configuration, the channel returns specific error messages guiding the user to install mcporter or add the endpoint.

## MCP Server Architecture

Agent-Reach exposes its internal health status through its own MCP server implementation in [`agent_reach/integrations/mcp_server.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/integrations/mcp_server.py). This server does not perform searches directly; instead, it reports whether the underlying mcporter configuration is valid.

The server registers a single tool named **`get_status`**, which invokes the doctor report:

```python

# agent_reach/integrations/mcp_server.py

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "get_status":
        result = eyes.doctor_report()  # Aggregates ExaSearchChannel.check() results

```

When an MCP client calls `get_status`, the server returns the aggregated health check, including the Exa search availability status. This separation of concerns keeps credential-heavy operations within mcporter while exposing only configuration state through the MCP interface.

## Running Searches Without Credentials

Once the doctor reports an "ok" status, users can execute semantic searches immediately without exporting any `EXA_API_KEY` or similar variables:

```bash

# Verify Agent Reach sees the backend

python -m agent_reach.cli doctor

# Expected output snippet:

#   Exa Search (exa_search): ok – 全网语义搜索可用（免费，无需 API Key）

# Perform a search (no API key required)

mcporter search "large language models"

```

The search command forwards the query to `https://mcp.exa.ai/mcp`, where Exa's server authenticates the request and returns semantic results. From the user's perspective, the service works out-of-the-box after the initial two-step setup (installation and endpoint registration).

## Summary

- **mcporter** acts as a keyless proxy by routing requests to Exa's public MCP endpoint (`https://mcp.exa.ai/mcp`), which manages API credentials server-side.
- **Configuration** requires only `npm install -g mcporter` and `mcporter config add exa https://mcp.exa.ai/mcp`—no environment variables or secret files.
- **Health detection** in [`agent_reach/channels/exa_search.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/exa_search.py) probes the local mcporter installation and validates the Exa endpoint registration via `probe_command`.
- **MCP server exposure** in [`agent_reach/integrations/mcp_server.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/integrations/mcp_server.py) provides a `get_status` tool that reports Exa availability without handling the actual search logic.
- **Search execution** occurs through `mcporter search <query>`, which contacts the pre-authenticated endpoint, bypassing the need for user-supplied API keys entirely.

## Frequently Asked Questions

### What is mcporter?

**mcporter** is an npm-based CLI tool that converts various third-party services into MCP (Model Context Protocol) servers. It functions as a lightweight router that forwards local commands to remote MCP endpoints, abstracting away the underlying API complexity and credential management.

### Why doesn't Exa require an API key through mcporter?

Exa AI hosts a public MCP server at `https://mcp.exa.ai/mcp` that contains the necessary API credentials on the server side. When mcporter forwards requests to this endpoint, the server authenticates using its internal key, allowing clients to access the service without exposing or managing secrets locally.

### How does Agent Reach verify the Exa configuration?

Agent Reach uses the `ExaSearchChannel.check()` method in [`agent_reach/channels/exa_search.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/exa_search.py) to execute `mcporter config list` via the `probe_command` utility. If the output contains "exa", the channel confirms the backend is active and reports that the service is available without requiring an API key.

### Can I use mcporter with other MCP services?

Yes. While the Agent-Reach implementation specifically configures Exa AI Search, mcporter supports multiple third-party MCP endpoints. Users can register additional services using `mcporter config add <name> <endpoint-url>`, provided those endpoints implement the MCP protocol and handle their own authentication.