> ## Documentation Index
> Fetch the complete documentation index at: https://docs.get-exo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Claude app and Claude Desktop

> Add Exo to claude.ai on web, desktop or mobile as a custom connector, using OAuth 2.1 with PKCE. There is no key to paste.

The consumer Claude app does not accept a pasted API key. It speaks OAuth. You give Claude one URL, it discovers Exo's sign-in page, you click **Allow**, and the `exo_*` tools appear in your next chat.

<Note>
  Connecting **Claude Code** instead? That path pastes a static key and is a different setup. See [Claude Code](/integrations/claude-code).
</Note>

## Before you start

* An Exo account that is allowlisted for the private preview. Sign-in shows a waitlist message otherwise.
* A paid Claude plan. Custom connectors are not available on the free tier.
* Nothing else. No key, no terminal, no install.

## The short version

Add this URL as a custom connector in Claude, keeping the trailing slash:

```
https://api.get-exo.com/mcp/
```

## Set it up

<Steps>
  <Step title="Open the connector form">
    In claude.ai, go to **Settings**, then **Connectors**, then **Add custom connector**.
  </Step>

  <Step title="Paste the MCP URL">
    ```
    https://api.get-exo.com/mcp/
    ```

    <Warning>
      The trailing slash matters. A bare `/mcp` answers with a 307 redirect, and MCP clients drop the `Authorization` header across a redirect, so discovery fails with a 401 that looks like a server problem.
    </Warning>
  </Step>

  <Step title="Sign in and allow">
    Claude sees that the endpoint is OAuth protected and sends you to Exo's `/connect` page. Sign in with the same Google or Microsoft account you use for [the dashboard](https://get-exo.com), then click **Allow** to authorize Claude to act as your Exo identity.
  </Step>

  <Step title="Use it">
    You land back in Claude. Open a new chat and the Exo tools appear. Ask something that references your own history, such as "what did we decide about the pricing model?", and Claude calls `exo_context`.
  </Step>
</Steps>

## Claude Desktop, one command

The desktop app can be wired up from a terminal instead. This is the same OAuth sign-in, relayed through `mcp-remote`, with nothing to paste:

<Tabs>
  <Tab title="macOS and Linux">
    ```bash theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    npx -y install-mcp@latest https://api.get-exo.com/mcp/ \
      --client claude --name exo --oauth=yes
    ```
  </Tab>

  <Tab title="Windows">
    ```powershell theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    npx -y install-mcp@latest https://api.get-exo.com/mcp/ --client claude --name exo --oauth=no
    ```
  </Tab>
</Tabs>

Requires Node.js. Restart Claude Desktop afterwards.

<Warning>
  **Windows must use `--oauth=no`.** The `--oauth=yes` pre-flight spawns `npx` without a shell, which fails instantly on Windows with "Authentication failed. Use the client to authenticate." and installs nothing at all. With `--oauth=no` the config is written normally and the same browser sign-in opens on Claude's first launch. The dashboard shows the correct variant for your operating system.
</Warning>

To pre-authenticate by hand:

```bash theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
npx -y -p mcp-remote@latest mcp-remote-client https://api.get-exo.com/mcp/
```

### What the relay does

The relay registers a loopback OAuth client at `http://127.0.0.1:<port>/oauth/callback` per RFC 8252, and catches the authorization code on that local port. Exo matches loopback redirect URIs while ignoring the port, because the relay binds whatever port is free at sign-in time. PKCE with S256 stays mandatory on every path.

Keys minted this way appear in your dashboard key list labeled **MCP connector (one-click)**.

## How auth and keys work

Every successful connect mints a **new** revocable `exo_` API key under your user and organization: the same key type the dashboard and Claude Code use. The OAuth access token is that key, which means there is one trust root and revoking the key kills the connection immediately.

Reconnecting mints another key, so keys accumulate. If you have removed and re-added the connector a few times, expect several. Revoke the stale ones.

To disconnect fully: remove the connector in Claude, then revoke its key in the dashboard so the credential cannot be used again. Removing the connector alone leaves a live key behind.

## When it goes wrong

| Symptom                                      | Cause                                                     | Fix                                                                  |
| -------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------- |
| Stuck in a 401 loop after clicking Allow     | The token is bad or expired, or the connection went stale | Remove the connector and re-add it. That runs a fresh OAuth sign-in. |
| Discovery fails, or "can't connect"          | The URL is missing its trailing slash                     | Re-add with `https://api.get-exo.com/mcp/`.                          |
| A waitlist message at sign-in                | Your account is not allowlisted yet                       | Exo is invite only during the private preview.                       |
| Custom connectors are not offered at all     | Custom connectors require a paid Claude plan              | Upgrade the Claude plan.                                             |
| It connects, but Exo knows nothing about you | Your organization has no content yet                      | [Bring data in](/integrations/imports) first.                        |

## Next

<Columns cols={2}>
  <Card title="ChatGPT connector" icon="message-square" href="/integrations/chatgpt">
    The same OAuth server, with a different toolset per surface.
  </Card>

  <Card title="MCP tool reference" icon="wrench" href="/integrations/mcp-tools">
    What each tool does and the REST route behind it.
  </Card>
</Columns>
