FounderMCPDocs

API

Connect your AI assistant

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

View Markdown

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. The install steps below use the assistant server. To use the Signals server, change the URL and use a gtk_ key from 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.

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:

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.

{
  "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):

[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.

{
  "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.