Start
Connect your assistant
Paste one URL in your assistant and click Allow. About a minute.
Paste the mySDR URL in your assistant and click Allow on the mySDR page that opens. That is the whole setup: mySDR signs your assistant in with OAuth, so there is no key to copy. Connect your agent walks you through it for Claude, ChatGPT, Gemini, Claude Code and Cursor. You do not need an account first: the Allow page lets you create one. In the app, the same steps are under Connect assistant in the header, which turns green once your assistant is connected. Agents such as Claude Duet, Grok Bot, Dots and Muse get one message to paste instead, below.
There are two servers. Every workspace has the assistant server; the Signals server opens per organization.
- Assistant — your workspace: find and enrich people (with credits), the Leads and Companies tables, your outreach process, LinkedIn sequences and replies.
POST https://mysdr.app/api/mcp. The response is JSON. - Signals — companies, signals, people at companies, enrich, monitors, the path in From companies to leads.
POST https://mysdr.app/api/v1/mcp. The response is a server-sent event stream, and its searches use credits. While the Signals API is closed for your organization, a valid sign-in or key answers 403api_not_enabled.
Owners and admins connect an assistant; the Allow page says so when you cannot. The connection works for your whole workspace. Disconnect it under Connect assistant in the app.
Claude (claude.ai and Claude Desktop)
- Copy
https://mysdr.app/api/mcp. - Open Customize → Connectors → Add custom connector (on a Team or Enterprise plan an owner uses Organization settings → Connectors → Add, then Custom → Web). Name it mySDR, paste the URL and click Add. When Claude asks for the OAuth client, choose Register automatically and leave the client id and secret empty: Claude registers itself.
- Click Connect, then Allow on the mySDR page.
ChatGPT
Under Plugins, click + and Add custom MCP server (or use developer mode on a Business, Enterprise or Edu plan). Paste https://mysdr.app/api/mcp, choose OAuth as the authentication, and leave the client id empty. Click I understand and want to continue, then Create as a plugin, and install the plugin: until it is installed, it does not show in a chat. Sign in when ChatGPT asks, then click Allow.
Gemini
- Copy
https://mysdr.app/api/mcp. - On gemini.google.com, open Settings → Connected Apps and click Add a custom app. Paste the URL and click Next. Leave the advanced credentials empty: Gemini registers itself.
- Sign in when Gemini asks, then click Allow on the mySDR page.
For now, Gemini allows custom apps only with a personal Google account in the US. In Gemini CLI, add the server and sign in with /mcp auth mysdr:
gemini mcp add --transport http --scope user mysdr https://mysdr.app/api/mcp
Claude Code
claude mcp add --transport http --scope user mysdr https://mysdr.app/api/mcp
Then type /mcp in Claude Code, pick mysdr and sign in. Your browser opens the Allow page. --scope user makes the server work in every project; without it, it only works in the folder where you ran the command. For the Signals server, add mysdr-signals with https://mysdr.app/api/v1/mcp the same way.
Cursor
Add the server to ~/.cursor/mcp.json with only its URL. Cursor asks you to sign in to mySDR; click Allow.
{
"mcpServers": {
"mysdr": {
"url": "https://mysdr.app/api/mcp"
}
}
}
How sign-in works
mySDR is its own OAuth 2.1 authorization server. A POST without a token is 401 with WWW-Authenticate: Bearer and resource_metadata, which points the client to /.well-known/oauth-protected-resource and from there to /.well-known/oauth-authorization-server. The client registers itself (dynamic client registration), sends you to the Allow page with PKCE (S256 only), and gets an access token for one hour plus a refresh token that rotates on every use. A connection you do not use for 90 days asks you to sign in again. A token works only on the server it was issued for, and never on the REST API.
With a key (a client that only sends a header)
n8n, scripts and any client without OAuth send Authorization: Bearer and a key on every POST.
- Assistant key prefix
ejk_, from Connect assistant → Other → Create assistant key in the app. The full key is shown once. An organization can have 10 active MCP keys; connections made with Allow do not count. - Signals key prefix
gtk_, from Connect assistant → API keys. POST without a key, or with an invalid or revoked key, is 401, including while the API is closed.
An ejk_ key cannot call the REST API, and a gtk_ key cannot call the assistant server. GET, PUT, PATCH and DELETE return 405 with Allow: POST on both URLs, before the key is checked and while an API is closed. Use POST. Do not put the key in the query string. Give it only to the client or agent that uses it, never in a shared chat or in code. Examples below read the key from MYSDR_API_KEY.
Generic MCP config
Paste this when the client asks for a remote MCP server and a header. Replace the key. An agent that reads docs and calls APIs does not need it: see the next section.
Signals server (company → lead):
{
"mcpServers": {
"mysdr-signals": {
"url": "https://mysdr.app/api/v1/mcp",
"headers": {
"Authorization": "Bearer gtk_…"
}
}
}
}
Assistant server (people, the tables, LinkedIn):
{
"mcpServers": {
"mysdr-assistant": {
"url": "https://mysdr.app/api/mcp",
"headers": {
"Authorization": "Bearer ejk_…"
}
}
}
}
A client with neither a header field nor OAuth cannot connect.
Claude Duet, Grok Bot, Dots and Muse
An agent gets one message to paste, not a form. Pick it at Connect your agent or under Connect assistant in the app, copy the message and paste it in a chat with your agent. The message holds no key: it points to the docs (https://mysdr.app/llms.txt) and to your Leads and Companies tables (https://mysdr.app/api/v1/tables/leads and /companies), and tells the agent to ask you for one. When it asks, click Create key and copy the gtk_ key. Enter it where the agent asks: in its field for secrets if it has one, so the key stays out of the chat history. The agent then makes one free call to check it (GET https://mysdr.app/api/v1/usage). That first call connects it, and the app shows it.
The agent works with the REST API: Search People and Enrich People, and the Company and Signals APIs when they are open for your organization. It reads and fills your Leads and Companies tables with the same key (List the Leads table), so what it finds and keeps is what you see in mySDR. It can also run LinkedIn sequences from your own LinkedIn account with the same key (Start a LinkedIn sequence), once you connected LinkedIn yourself under Settings → LinkedIn: the agent cannot do that for you. The key needs API access on your plan. mySDR has not verified a Duet-specific dialog (or one for Dots or Muse), and the message needs none: you paste it in a chat.
Grok Bot over MCP
The assistant server (finding people, the tables, LinkedIn sequences and replies) speaks MCP only; finding people, the tables and LinkedIn sequences are on the REST API too. To give it to Grok Bot, open Settings → Plugins in the Grok Bot app and add a custom MCP server (the app also accepts "Add this MCP server" in chat, then still needs the header below).
- Name: mySDR
- URL:
https://mysdr.app/api/mcpfor your workspace and LinkedIn, orhttps://mysdr.app/api/v1/mcpfor signal searches - HTTP header name:
Authorization - HTTP header value:
Bearerand the key (ejk_on the assistant URL,gtk_on the Signals URL) - 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.
With a key in a client that also signs in
The same clients take a key when you prefer one. The header is Authorization: Bearer.
Claude Code
claude mcp add --transport http --scope user mysdr-signals https://mysdr.app/api/v1/mcp \
--header "Authorization: Bearer $MYSDR_API_KEY"
Give each server its own name: mysdr for the assistant server and mysdr-signals for the Signals server. Claude Code refuses a second server with a name it already has, and a config file holds each name once.
A project .mcp.json needs "type": "http", the URL, and the same header. An entry with a url and no type is skipped. With the header set, Claude Code does not start a sign-in.
Claude Desktop and Claude.ai
In the custom connector, choose No sign-in and set request header authorization to Bearer plus the key. Request headers are in beta and missing on some organizations; signing in with Allow works everywhere.
Cursor
~/.cursor/mcp.json, then restart Cursor. Do not add an auth block: mySDR registers Cursor itself when it signs in.
{
"mcpServers": {
"mysdr-signals": {
"url": "https://mysdr.app/api/v1/mcp",
"headers": {
"Authorization": "Bearer ${env:MYSDR_API_KEY}"
}
}
}
}
Codex
In ~/.codex/config.toml. Codex adds the word Bearer itself.
[mcp_servers.mysdr-signals]
url = "https://mysdr.app/api/v1/mcp"
bearer_token_env_var = "MYSDR_API_KEY"
Next
Ask the assistant what is in your tables (list_table) or to find people (search_people). Buying signals (lookup_company, search_signals, …) are tools of the Signals server: when it is open for your organization, connect https://mysdr.app/api/v1/mcp too, as mysdr-signals, then follow From companies to leads. The tool map of the Signals server is MCP.