Skip to content

Custom MCP client

Any client that supports remote Model Context Protocol servers with OAuth can connect to Causalytics.

Setting Value
URL https://app-api.causalytics.ai/mcp
Transport Streamable HTTP, POST only, JSON responses, stateless
Auth OAuth 2.1 with PKCE (S256)
Access Read-only

You need a Causalytics account with an active trial or a paid plan that includes API access. Causalytics works only in Europe.

Most clients handle sign-in for you: add the URL, then sign in to Causalytics in the browser window that opens.

Claude Code

Terminal window
claude mcp add --transport http causalytics https://app-api.causalytics.ai/mcp

Then run /mcp in Claude Code and choose causalytics to sign in.

Cursor (.cursor/mcp.json)

{
"mcpServers": {
"causalytics": {
"url": "https://app-api.causalytics.ai/mcp"
}
}
}

VS Code (.vscode/mcp.json)

{
"servers": {
"causalytics": {
"type": "http",
"url": "https://app-api.causalytics.ai/mcp"
}
}
}

MCP Inspector, useful for trying the tools:

Terminal window
npx @modelcontextprotocol/inspector

Choose Streamable HTTP, enter the URL above and connect.

If you are implementing the connection yourself, an MCP SDK’s OAuth support covers these steps.

  1. Send a request to the server without a token. It responds 401 with a WWW-Authenticate header pointing to the protected resource metadata:

    {
    "resource": "https://app-api.causalytics.ai/mcp",
    "authorization_servers": ["https://upbeat-day-27.authkit.app"],
    "bearer_methods_supported": ["header"]
    }
  2. Fetch the authorization server’s metadata. These are the values you need:

    Field Value
    issuer https://upbeat-day-27.authkit.app
    authorization_endpoint https://upbeat-day-27.authkit.app/oauth2/authorize
    token_endpoint https://upbeat-day-27.authkit.app/oauth2/token
    registration_endpoint https://upbeat-day-27.authkit.app/oauth2/register
    jwks_uri https://upbeat-day-27.authkit.app/oauth2/jwks
    scopes_supported openid, profile, email, offline_access
  3. Register your client through the registration_endpoint (dynamic client registration), or use a client ID metadata document.

  4. Run the authorization code flow with PKCE, passing resource=https://app-api.causalytics.ai/mcp in the authorization and token requests. Tokens issued for another audience are rejected.

  5. Send the access token with every request:

Terminal window
curl https://app-api.causalytics.ai/mcp \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_profiles","arguments":{}}}'

Request the offline_access scope if your client needs refresh tokens.

Requests with an Origin header from another site are rejected with 403, so call the server from a backend or desktop client, not from a web page.

Tool Arguments Returns
list_profiles None LinkedIn profiles you can access, with their team_id
list_contacts team_id, limit, offset LinkedIn connections of a profile
get_contact id One enriched contact
get_company id One enriched company
list_posts team_id, limit, offset Posts of a profile
list_interactions team_id, limit, offset Interactions of a profile
list_activity team_id, limit, offset Activity of a profile
list_messages team_id, limit, offset Messages of a profile

limit is 1–100 and offset is 0 or more. team_id is required when you can access more than one profile, so call list_profiles first.

Each team can make 100 tool calls per minute, shared with its REST API usage.

Response Meaning
401 The token is missing or invalid, or the account has no eligible subscription
403 The request came from a disallowed Origin
405 The request wasn’t a POST. The server doesn’t offer a GET event stream
Tool result with isError The tool call failed, for example an unknown team_id. The text explains why