Custom MCP client
Any client that supports remote Model Context Protocol servers with OAuth can connect to Causalytics.
Server details
Section titled “Server details”| 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.
Add the server to your client
Section titled “Add the server to your client”Most clients handle sign-in for you: add the URL, then sign in to Causalytics in the browser window that opens.
Claude Code
claude mcp add --transport http causalytics https://app-api.causalytics.ai/mcpThen 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:
npx @modelcontextprotocol/inspectorChoose Streamable HTTP, enter the URL above and connect.
Build your own client
Section titled “Build your own client”If you are implementing the connection yourself, an MCP SDK’s OAuth support covers these steps.
-
Send a request to the server without a token. It responds
401with aWWW-Authenticateheader 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"]} -
Fetch the authorization server’s metadata. These are the values you need:
Field Value issuerhttps://upbeat-day-27.authkit.appauthorization_endpointhttps://upbeat-day-27.authkit.app/oauth2/authorizetoken_endpointhttps://upbeat-day-27.authkit.app/oauth2/tokenregistration_endpointhttps://upbeat-day-27.authkit.app/oauth2/registerjwks_urihttps://upbeat-day-27.authkit.app/oauth2/jwksscopes_supportedopenid,profile,email,offline_access -
Register your client through the
registration_endpoint(dynamic client registration), or use a client ID metadata document. -
Run the authorization code flow with PKCE, passing
resource=https://app-api.causalytics.ai/mcpin the authorization and token requests. Tokens issued for another audience are rejected. -
Send the access token with every request:
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.
Limits and errors
Section titled “Limits and errors”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 |