Setup Guide

Connect Crispy to your AI tools in under 2 minutes.

Crispy gives your AI complete access to LinkedIn: outreach, content, inbox, and your network, all driven by your AI agent. The primary way in is the MCP server, connect Claude, Cursor, ChatGPT, n8n, or any MCP-compatible client and your AI can take actions on LinkedIn immediately. If you prefer to call Crispy from code, the REST API works from any language with a Bearer token. For one-liners, scripts, and CI pipelines, the CLI is the third surface: the same tools as the MCP server, just over stdin/stdout.

New

Build any workflow with Crispy as your event source.

Webhooks, time-based triggers, and conditional filters wired into Make, n8n, Zapier, or your own code. See the integration guides →

Before you start

  1. Create an account on Crispy
  2. Connect your LinkedIn profile from the dashboard
  3. Generate an API key (starts with crispy_)
  4. Copy your API key - it's shown only once

Claude.ai and ChatGPT use OAuth and don't need an API key - just paste the endpoint URL and log in. All other platforms use an API key.

Claude.ai

No API key required

Connect Crispy directly from Claude.ai using the built-in connector system. Claude handles authentication via OAuth automatically.

  1. Go to Claude.ai → Settings → Connectors
  2. Click Add Custom Connector
  3. Enter the MCP endpoint URL:
MCP Endpoint URL
https://crispy.sh/api/mcp
  1. Claude will redirect you to Crispy to log in and pick a LinkedIn account
  2. Click Approve on the consent screen
  3. Done - Crispy tools are now available in all your Claude.ai conversations

ChatGPT

No API key required

Connect Crispy as a custom MCP connector in ChatGPT via Developer Mode. Requires a ChatGPT Pro, Team, Enterprise, or Edu plan.

  1. Go to ChatGPT → Settings → Connectors
  2. Enable Developer Mode under Advanced settings (workspace admins may need to enable this first)
  3. Click Create and enter a name (e.g. "Crispy")
  4. Set the MCP Server URL:
MCP Endpoint URL
https://crispy.sh/api/mcp
  1. Set Authentication to OAuth
  2. ChatGPT will redirect you to Crispy to log in and pick a LinkedIn account
  3. Click Approve on the consent screen
  4. In any chat, click +MoreDeveloper Mode and select your connector

Claude Desktop

Add this to your Claude Desktop MCP config file (claude_desktop_config.json):

claude_desktop_config.json
{
  "mcpServers": {
    "crispy": {
      "url": "https://crispy.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Replace YOUR_API_KEY with your actual API key. Restart Claude Desktop after saving.

Claude Code

Add Crispy to Claude Code using the CLI:

Terminal
claude mcp add crispy -- \
  --url "https://crispy.sh/api/mcp" \
  --header "Authorization: Bearer YOUR_API_KEY"

Or add it to your .claude/settings.json project config:

.claude/settings.json
{
  "mcpServers": {
    "crispy": {
      "url": "https://crispy.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

VS Code (GitHub Copilot)

Open the command palette (Ctrl+Shift+P) and run MCP: Open User Configuration. Add this to your .vscode/mcp.json:

.vscode/mcp.json
{
  "servers": {
    "crispy": {
      "url": "https://crispy.sh/api/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Requires GitHub Copilot with agent mode enabled. Replace YOUR_API_KEY with your actual API key.

Cursor

Go to Cursor Settings → MCP → Add Server, and paste this config:

MCP Server Config
{
  "mcpServers": {
    "crispy": {
      "url": "https://crispy.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Windsurf

Add this to your Windsurf MCP config file (~/.codeium/windsurf/mcp_config.json):

mcp_config.json
{
  "mcpServers": {
    "crispy": {
      "serverUrl": "https://crispy.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Note: Windsurf uses serverUrl instead of url for remote HTTP servers.

JetBrains IDEs

Works with IntelliJ IDEA, WebStorm, PyCharm, and other JetBrains IDEs with AI Assistant. Go to Settings → AI Assistant → MCP Servers and add:

MCP Server Config
{
  "mcpServers": {
    "crispy": {
      "url": "https://crispy.sh/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

n8n

n8n Setup
1. Add an "MCP Client" node to your workflow
2. Set the Server URL to: https://crispy.sh/api/mcp
3. Add a header: Authorization = Bearer YOUR_API_KEY
4. The node will auto-discover all available tools

Make (Integromat)

Use the built-in MCP Client module to connect your Make scenarios to Crispy. Available on all paid plans.

  1. Add an MCP Client module to your scenario
  2. Enter the server URL:
Server URL
https://crispy.sh/api/mcp
  1. Set authentication to Token and paste your API key
  2. Make will auto-discover all available tools with input schemas
  3. Map inputs visually and add the module to your workflow

Zapier

Use the MCP Client by Zapier app to connect any Zap to Crispy's tools.

  1. Add a MCP Client by Zapier step to your Zap
  2. Choose Run Tool as the action
  3. Enter the server URL:
Server URL
https://crispy.sh/api/mcp
  1. Add your API key as a Bearer token in the authorization header
  2. Select the Crispy tool you want to use and map your inputs

Direct HTTP / cURL

The MCP endpoint speaks JSON-RPC over HTTP. You can call it directly:

Terminal
curl -X POST https://crispy.sh/api/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list"
  }'

JSON-RPC Protocol

Crispy uses the Streamable HTTP transport from the MCP specification. All requests are JSON-RPC 2.0 over a single HTTP POST endpoint.

Endpoint

Endpoint
POST https://crispy.sh/api/mcp

Authentication

Pass your API key as a Bearer token. OAuth tokens (from Claude.ai / ChatGPT) are also accepted.

Header
Authorization: Bearer crispy_your_api_key

Available methods

MethodDescription
tools/listList all available tools and their input schemas
tools/callExecute a tool with arguments
prompts/listList available prompt templates
prompts/getGet a prompt template by name
resources/listList available resources
resources/readRead a resource by URI

Example: call a tool

Terminal
curl -X POST https://crispy.sh/api/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "search_people",
      "arguments": {
        "keyword": "VP Engineering",
        "limit": 5
      }
    }
  }'

Error codes

CodeMeaningRetryable
401Invalid or expired API keyNo
403Tool not allowed by permission scopeNo
404Profile, post, or resource not foundNo
408Request timed outYes
429LinkedIn or plan rate limit reachedYes (wait)
502/503LinkedIn API temporarily unavailableYes

Available Tools (184)

Your API key's permission scope determines which tools are available. Every tool accepts an optional account_id parameter for multi-account usage.

Crispy exposes 149 AI tools in core scope and 184 REST endpoints total. Tools are consolidated by domain, for example get_campaign aggregates campaign state, stats, health, and outreach config in a single parallel call. Deprecated aliases are maintained for backward compatibility until v6.2.

CategoryTools
Profile (3)get_my_profile, get_profile, get_profile_viewers
Messaging (5)list_conversations, get_messages, send_message, start_conversation, send_inmail
Network (8)get_connections, send_invitation, list_pending_invitations, cancel_invitation, list_incoming_invitations, accept_invitation, decline_invitation, get_company_profile
Content (8)create_post, get_post, list_posts, react_to_post, comment_on_post, list_post_comments, list_post_reactions, get_feed
Search (4)search_people, search_companies, search_posts, get_search_parameters
Analytics (7)get_post_analytics, get_cached_post_analytics, get_top_posts, get_content_summary, get_profile_analytics, get_activity_analytics, purge_analytics_cache
Campaigns (4)create_campaign, list_campaigns, archive_campaign, get_campaign_stats
Settings (2)update_account_settings, get_profile_capacity
Support (1)contact_support

Built-in Prompts

Crispy includes 8 pre-built workflow prompts. In Claude, these appear as prompt templates you can invoke directly. Use prompts/list to discover them programmatically.

inbox_zero

Check unread conversations, summarize them, and draft replies

outbound_prospecting

Search for prospects, review profiles, send personalized invitations

Parameters: criteria (required), message_template (optional)

follow_up_sequence

Daily outreach loop: welcome new connections, check pending invitations, follow up on stale conversations

Parameters: follow_up_days (optional, default: 3)

content_engagement

Find high-engagement posts and draft strategic comments

Parameters: topic (optional - leave empty to browse your feed)

post_drafter

Research what's performing on a topic, then draft posts in 3 formats (list, story, hot take)

Parameters: topic (required), tone (optional: professional, casual, provocative, storytelling)

competitor_intel

Research a competitor's LinkedIn presence, content strategy, audience, and key employees

Parameters: company (required)

weekly_report

Generate a LinkedIn performance report with post analytics, engagement trends, and recommendations

Parameters: profile_id (optional - leave empty for your own profile)

network_pulse

See who's active in your network, find conversation starters and connections to nurture

MCP Resources

Resources are read-only data endpoints your AI client can access without calling a tool. Use resources/list and resources/read to access them.

Account infocrispy://account/info

Your connected LinkedIn account details: name, permission scope, Sales Navigator status, and plan info.

Usage statscrispy://account/usage

Today's API usage and remaining LinkedIn safety limits by action category. Check this before running outreach to see how much capacity you have left.

Available toolscrispy://tools/list

List of all MCP tools available under your current permission scope, with descriptions.

Writing stylecrispy://account/writing-style

Your AI-generated messaging and posting style guides, based on analysis of your LinkedIn activity.

Permission Scopes

Each API key or connected account has a permission scope that controls which tools are available. Set the scope when generating an API key or connecting an account.

ScopeDescription
core(default)Default for all accounts. Covers the full daily loop: messaging, outbound, content, campaigns, lists, and intelligence.
full_accessAll 184 tools. For power users and builders who need webhooks, API key management, warm-up controls, advanced analytics, and raw LinkedIn API access.

LinkedIn Safety Limits

Crispy enforces daily limits per action type to protect your LinkedIn account from restrictions. These limits reset at midnight UTC. Check remaining capacity via the crispy://account/usage resource.

ActionDaily LimitTools
Search300/daysearch_people, search_companies, search_posts
Profile views250/dayget_profile
Messages150/daysend_message, start_conversation, send_inmail
Engagement100/dayreact_to_post, comment_on_post
Invitations15/daysend_invitation
Posts10/daycreate_post

Read-only tools (get_connections, list_posts, get_feed, etc.) have no safety limit.

Webhooks

Get real-time notifications when things happen on your LinkedIn account. Configure a webhook URL and signing secret from your dashboard settings.

Event types (24)

CategoryEvents
Actions you takeinvitation.sent, message.sent, inmail.sent, post.published, post.reacted, post.commented, invitation.cancelled, invitation.accepted_by_us, invitation.declined_by_us
Things that happenmessage.received, invitation.received, invitation.accepted, account.connected, account.disconnected, post.milestone, post.trending, profile.views_spike, safety_limit.reached, usage.daily_summary
Billingbilling.subscription_changed, billing.payment_failed, billing.payment_succeeded
Organizationorg.member_added, org.member_removed

Delivery headers

HeaderDescription
X-Crispy-SignatureHMAC-SHA256 signature: sha256=<hex digest>
X-Crispy-EventEvent type (e.g. invitation.sent)
X-Crispy-Delivery-IdUnique delivery ID for deduplication
Content-Typeapplication/json

Payload structure

Webhook payload
{
  "id": "evt_a1b2c3d4e5f6g7h8i9j0",
  "event": "invitation.sent",
  "timestamp": "2025-01-15T10:30:00.000Z",
  "webhook_id": "wh_...",
  "account_id": "acc_...",
  "data": {
    "account_name": "Jane Doe",
    "tool_name": "send_invitation",
    "tool_args": { "profile_url": "..." },
    "tool_result": { ... }
  }
}

Signature verification

Always verify the X-Crispy-Signature header to ensure the request came from Crispy.

Node.js
import { createHmac } from "crypto";

function verifyWebhook(body: string, signature: string, secret: string) {
  const expected = "sha256=" + createHmac("sha256", secret)
    .update(body)
    .digest("hex");
  return signature === expected;
}

// In your webhook handler:
const isValid = verifyWebhook(
  rawBody,
  req.headers["x-crispy-signature"],
  process.env.WEBHOOK_SECRET
);

Retry policy

Failed deliveries are retried up to 5 times with exponential backoff: 1 minute, 5 minutes, 25 minutes, 2 hours, 10 hours. After 5 failed attempts, the delivery is marked as permanently failed.

Campaigns

Crispy supports two outreach modes, depending on how much control you want.

Automated campaigns

Set up a multi-step sequence and Crispy handles the rest. Define your steps (e.g. send connection request, then follow up when they accept, then second follow-up if no reply), and Crispy automatically executes each step at the right time, detects replies, and pauses the sequence when someone responds.

  1. Create a campaign with create_campaign
  2. Set a follow-up message with update_campaign - this auto-sends when connections accept your invitation
  3. Send invitations with campaign_id attached - Crispy tracks everything
  4. Sit back - follow-ups, reply detection, and sequencing happen automatically

The easiest way to get started: just say "run campaign_builder" in Claude and it walks you through the whole setup.

Manual outreach with tracking

Prefer to control every message yourself? Just pass a campaign_id when calling outreach tools (send_invitation, send_message, start_conversation, send_inmail) and Crispy tracks the actions for analytics. You decide when and what to send - Crispy only handles tracking.

Campaign tools

ToolDescription
get_campaignFetch campaign state, stats, health, and outreach config in one call. Replaces 4 deprecated tools.
create_campaignCreate a new campaign with id, name, and optional description
update_campaignSet follow-up message for auto-send on acceptance, update name or description
list_campaignsList all active campaigns (use include_archived to see archived ones)
archive_campaignArchive a campaign (can be unarchived later)
list_accepted_invitationsSee who accepted your campaign invitations

Multi-account

You can connect multiple LinkedIn profiles and operate on any of them from a single API key.

How it works

  1. Connect multiple LinkedIn profiles from your dashboard
  2. Use get_profile_capacity to list all connected accounts and their IDs
  3. Pass account_id on any tool call to specify which LinkedIn profile to use
  4. Omit account_id to use the default account (the one linked to the API key)

Scope enforcement

Each connected account has its own permission scope. When you use account_id to target a different account, Crispy enforces that account's scope, not your API key's scope. A full_access key cannot bypass a core account's restrictions.

Safety limits

Safety limits are tracked per LinkedIn account, not per API key. Each connected profile gets its own daily limits. Use get_profile_capacity to check remaining capacity across accounts.

Choosing a permission scope

Most users should stay on core. Upgrade to full_access only when you need advanced infrastructure tooling.

Use caseScope
Daily outreach, content, campaigns, inboxcore
Webhooks, API key management, warm-up, raw APIfull_access
Give to a client or contractorcore
Agency workspace, power builderfull_access

All new accounts start on core. You can self-upgrade to full_access at any time via update_account_settings or from the dashboard.

Troubleshooting

My API key is valid but tools aren't appearing in my MCP client

Most clients require a restart after adding a new MCP server. In Claude Desktop, quit and reopen. In Cursor, open the Command Palette → "Reload Window". In Windsurf, restart the IDE. If tools still don't appear, verify the URL is exactly https://crispy.sh/api/mcp and the Authorization header is Bearer YOUR_KEY (with a space, not a colon).

I'm getting 401 Unauthorized errors

Your API key is either missing, malformed, or revoked. Make sure the header is Authorization: Bearer crispy_... - the key must start with crispy_. If you recently regenerated a key, update all clients using the old one. Keys are shown once at creation and can't be retrieved.

I'm getting 403 Forbidden on specific tools

The tool is outside your API key's permission scope. Check your account's scope in the dashboard (Accounts → permission badge). Most tools are available on the core scope. Advanced infrastructure tools (webhooks, API keys, warm-up) require full_access.

LinkedIn session expired - tools return session errors

Your LinkedIn session cookie has expired. Go to the dashboard, find the affected account, and click Reconnect. You'll re-authenticate via hosted auth or by pasting a fresh cookie. This happens every few weeks and is normal - LinkedIn periodically invalidates sessions.

I hit a safety limit - invitations or messages are blocked

Crispy enforces per-category daily limits (15 invitations, 150 messages, 300 searches, etc.) to protect your LinkedIn account. These reset at midnight UTC. Use get_profile_capacity to check remaining capacity. If you need higher limits, contact support - some limits can be raised with a safety override after account review.

search_people returns no results even with broad filters

Your LinkedIn account may not have a Sales Navigator subscription for advanced filters. Basic search works without it, but filters like seniority_level, company_headcount, and years_of_experience require Sales Navigator. Try a simpler query with just keywords and location first.

The MCP server isn't showing up in n8n / Make / Zapier

Make sure you're using a POST request to https://crispy.sh/api/mcp with Content-Type: application/json and Authorization: Bearer YOUR_KEY as headers. In n8n, use the MCP Client node. In Make, use HTTP > Make a request. In Zapier, use Webhooks by Zapier with POST method. See the setup sections above for exact config.

Still stuck? Email support or use the contact_support MCP tool to file a ticket directly from your AI client.