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

# Setup

> Connect the FixAEO MCP server to Claude, Cursor, or another client.

The server is remote. There's nothing to install and nothing to run locally — you point your client at one URL and pass your API key as a bearer token.

| Setting   | Value                                                      |
| --------- | ---------------------------------------------------------- |
| URL       | `https://api.fixaeo.com/api/mcp`                           |
| Transport | Streamable HTTP, stateless, JSON responses                 |
| Auth      | `Authorization: Bearer YOUR_FIXAEO_API_KEY`                |
| Plan      | Any paid plan. Free accounts are rejected at the handshake |

<Steps>
  <Step title="Create an API key">
    Open [Settings](https://fixaeo.com/app/settings#security) and find the **API keys** card, below two-factor and your active sessions. Select **Create API key** and give it a name you'll recognise later.

    The full key is shown once, at creation. FixAEO stores only a SHA-256 hash of it, so nobody — including support — can read it back. Copy it somewhere safe before you close the dialog. Keys start with `fixaeo_`.

    How many active keys you can hold depends on your plan: one on Free, three on Lite and Growth, fifty on Enterprise. Revoking a key frees the slot.
  </Step>

  <Step title="Add the server to your client">
    Pick your client below, paste the config, restart the client.
  </Step>

  <Step title="Check that it worked">
    Ask your assistant: "list my brands in FixAEO". You should get back your brands with their slugs. That slug is the input to every brand-specific tool, so it's the right first call anyway.
  </Step>
</Steps>

## Client configuration

<CodeGroup>
  ```bash Claude Code theme={null}
  claude mcp add --transport http fixaeo https://api.fixaeo.com/api/mcp \
    --header "Authorization: Bearer YOUR_FIXAEO_API_KEY"
  ```

  ```json Claude Code JSON theme={null}
  {
    "mcpServers": {
      "fixaeo": {
        "type": "http",
        "url": "https://api.fixaeo.com/api/mcp",
        "headers": {
          "Authorization": "Bearer YOUR_FIXAEO_API_KEY"
        }
      }
    }
  }
  ```

  ```json Claude Desktop theme={null}
  {
    "mcpServers": {
      "fixaeo": {
        "command": "npx",
        "args": [
          "-y",
          "mcp-remote",
          "https://api.fixaeo.com/api/mcp",
          "--header",
          "Authorization:${AUTH_HEADER}"
        ],
        "env": {
          "AUTH_HEADER": "Bearer YOUR_FIXAEO_API_KEY"
        }
      }
    }
  }
  ```

  ```json Cursor theme={null}
  {
    "mcpServers": {
      "fixaeo": {
        "url": "https://api.fixaeo.com/api/mcp",
        "headers": {
          "Authorization": "Bearer YOUR_FIXAEO_API_KEY"
        }
      }
    }
  }
  ```
</CodeGroup>

**Claude Code** speaks HTTP natively. The command above writes the JSON block for you; add `--scope project` if you'd rather commit it to a project `.mcp.json` than keep it local.

**Claude Desktop** needs the `mcp-remote` bridge, which runs through `npx` and needs Node installed. FixAEO's server authenticates with a bearer header and doesn't implement OAuth, so the built-in connector flow has no way to send your key. Note the header value has no space in the `args` array — some clients mangle spaces there, which is why the token lives in `env` instead. Config file lives at `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS.

**Cursor** reads `~/.cursor/mcp.json` for every project, or `.cursor/mcp.json` for one. Cursor also expands `${env:VAR}` inside header values, so you can keep the key out of the file.

<Tip>
  Treat the key like a password. It reads every brand, mention, citation, and Search Console figure in your account. If a config file with a key in it is going into git, use the environment-variable form instead.
</Tip>

## Why does the server look unreachable?

Almost always the plan. The paid gate runs before the MCP protocol does, so a free account gets a 403 on the handshake itself — your client reports "failed to connect" rather than "connected with zero tools".

<AccordionGroup>
  <Accordion title="401 — missing Authorization header">
    The header didn't arrive. On Claude Desktop this usually means the `mcp-remote` args are malformed. On Cursor, check that `headers` sits inside the server object, next to `url`.
  </Accordion>

  <Accordion title="401 — invalid API key">
    The key is wrong, or it's been revoked. Keys are shown once, so a truncated copy-paste is the common cause. Create a fresh one in Settings and swap it in.
  </Accordion>

  <Accordion title="403 — the FixAEO MCP server requires a paid plan">
    Exactly what it says. This also fires if a subscription lapsed: your effective plan drops back to Free, and MCP goes with it. The public REST API keeps working on Free.
  </Accordion>

  <Accordion title="400 — JSON-RPC batching is not supported">
    Your client tried to send several calls in one HTTP request. The server rejects batches on purpose, so one request can never fan out into several database reads. Turn batching off in the client.
  </Accordion>

  <Accordion title="429 — rate limit exceeded">
    The public surface allows 120 requests a minute per IP, shared between the REST API and MCP. The response carries a `Retry-After` header. Normal conversational use never comes close.
  </Accordion>

  <Accordion title="A tool call times out">
    Each call gets a 30-second budget. If a wide query hits it, narrow the window — ask for `7d` instead of `90d`, or filter to one engine.
  </Accordion>
</AccordionGroup>

## Related pages

* [Tools reference](/mcp/tools) — every parameter each tool accepts
* [Use cases](/mcp/use-cases) — questions to try once you're connected
* [Plans and limits](/plans-and-limits) — what each tier includes
* [Security](/security) — how keys are stored and what deleting your account removes
