# Connect your AI assistant

Claude, Claude Code, ChatGPT, Grok Bot and Cursor, on the MCP servers FounderMCP actually runs.

FounderMCP speaks the Model Context Protocol on two HTTPS endpoints. Both are stateless: send one HTTP POST per call, with `Authorization: Bearer` and a key. FounderMCP does not run an OAuth server. A client that can only sign in with OAuth cannot connect.

- **Assistant** — templates, leads, drafts and replies in your workspace. `POST https://geteem.com/api/mcp` with a key that starts with `ejk_`.
- **Signals** — find leads from a signal, explain them, watch a signal, enrich. `POST https://geteem.com/api/v1/mcp` with a key that starts with `gtk_`.

The assistant server answers JSON. The Signals server answers a server-sent event stream, so a search can report progress while it runs. Clients that implement streamable HTTP handle both. GET and DELETE return 405 on both URLs; use POST.

What each server's tools do is on [MCP](/docs/api/mcp). The install steps below use the assistant server. To use the Signals server, change the URL and use a `gtk_` key from [Authentication](/docs/api/authentication). Until the Signals API is open for your organization, `https://geteem.com/api/v1/mcp` answers **404** with the same body as an unknown path — including when the key is missing, is an `ejk_` key, or belongs to another organization.

## Create an assistant key

In FounderMCP, open **Admin → API** and create a key under **MCP keys**. Name it after the client (*Claude Code*, *Cursor*). The full key is shown **once** and starts with `ejk_`. An organization can have 10 active MCP keys.

MCP access has to be on for the account. If it is not, the panel says MCP is not on your current plan and creating a key is refused. Owners, admins and super admins can create keys; the screen itself sits in the admin area.

Keep the key in a secret store or an environment variable named `FOUNDERMCP_MCP_KEY`. Do not commit it, and do not paste it into a chat.

A request with no key, or with a `gtk_` API key, gets **401** and a `WWW-Authenticate: Bearer` challenge. Send the header on the first request. Some clients treat a 401 as a prompt to start OAuth, and that sign-in cannot succeed here.

```bash
curl -sS -D - -o /dev/null -X POST "https://geteem.com/api/mcp" \
  -H "Authorization: Bearer $FOUNDERMCP_MCP_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

HTTP 401 means the key was missing or rejected. A valid key returns the tool list.

## Claude Code

Claude Code's HTTP transport sends the header you configure. Add the server from a shell that has the key:

```bash
claude mcp add --transport http foundermcp https://geteem.com/api/mcp \
  --header "Authorization: Bearer $FOUNDERMCP_MCP_KEY"
```

Or commit a project `.mcp.json` and keep the key in the environment. An entry with a `url` and no `type` is skipped. `streamable-http` is accepted as an alias of `http`.

```json
{
  "mcpServers": {
    "foundermcp": {
      "type": "http",
      "url": "https://geteem.com/api/mcp",
      "headers": {
        "Authorization": "Bearer ${FOUNDERMCP_MCP_KEY}"
      }
    }
  }
}
```

Because the `Authorization` header is set in that file, Claude Code does not start an OAuth sign-in when the server answers 401. A 401 then means the variable was empty or the key was rejected.

## Claude Desktop and Claude.ai

Both use a custom connector.

1. Open **Organization settings → Connectors → Add**, then **Custom → Web**. On a personal account the same dialog is **Add custom connector**.
2. Name it **FounderMCP**. Set the MCP server URL to `https://geteem.com/api/mcp`.
3. Under authentication choose **No sign-in**. Leave the OAuth client empty. FounderMCP has no authorization server to sign in to.
4. Under **Request headers**, set the name to `authorization` and the value to `Bearer ` followed by the `ejk_` key. Include the word Bearer and the space.

Request headers are in beta, and only some organizations see that section. If it is missing, that Claude organization cannot send the key. Use Claude Code or Cursor, which take the header in their own config.

## ChatGPT

ChatGPT's **Add custom MCP server** form (Plugins, or developer mode on Business, Enterprise and Edu) can store a server URL over streaming HTTP. The authentication choices in that form are OAuth and no authentication. FounderMCP implements neither of those: a call without `Authorization: Bearer` is rejected, and there is no OAuth server to complete. That form cannot connect.

Codex can. In `~/.codex/config.toml` (or `.codex/config.toml` in a trusted project):

```toml
[mcp_servers.foundermcp]
url = "https://geteem.com/api/mcp"
bearer_token_env_var = "FOUNDERMCP_MCP_KEY"
```

Codex reads `FOUNDERMCP_MCP_KEY` and sends it as a bearer token on `Authorization`. The value is the `ejk_` key, without you adding the word Bearer yourself.

## Grok Bot

In the Grok Bot app, open **Settings → Plugins** and add a custom MCP server (the app also accepts "Add this MCP server" in chat, then still needs the header below).

- **Name:** FounderMCP
- **URL:** `https://geteem.com/api/mcp` (public HTTPS, streamable HTTP)
- **HTTP header name:** `Authorization`
- **HTTP header value:** `Bearer ` and the `ejk_` key
- Leave the OAuth client id and secret empty

Save, install the server from Plugins, and attach it in a chat with @. A URL with no header is rejected. If the form only offers OAuth, that sign-in cannot finish; use the Cursor config below, which sends the header itself.

## Cursor

Create `~/.cursor/mcp.json` for every project, or `.cursor/mcp.json` in one project. Restart Cursor after saving.

```json
{
  "mcpServers": {
    "foundermcp": {
      "url": "https://geteem.com/api/mcp",
      "headers": {
        "Authorization": "Bearer ${env:FOUNDERMCP_MCP_KEY}"
      }
    }
  }
}
```

Do not add an `auth` block. That block is for an OAuth client id and secret, which FounderMCP does not issue. Set `FOUNDERMCP_MCP_KEY` in the environment Cursor was launched from.

To add the Signals server beside it, use a second name (`foundermcp-signals`), the URL `https://geteem.com/api/v1/mcp`, and a `gtk_` key in a different variable. A valid key on a closed Signals API still gets 404.

## Which server to give the assistant

Give it the assistant server when it should read leads, draft a message, or prepare a sequence. Nothing is sent until a person approves it. Give it the Signals server when it should run a signal search or a watch, which can spend credits. The two keys are not interchangeable.
