Setup Guide

Connect Crispy to your AI tools in under 2 minutes.

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 (164)

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

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.

Full access(50 tools)All 164 tools. Full control over the LinkedIn account.

get_my_profile, get_profile, get_profile_viewers, list_conversations, get_messages, send_message, start_conversation, send_inmail, get_connections, send_invitation, list_pending_invitations, cancel_invitation, list_incoming_invitations, accept_invitation, decline_invitation, get_company_profile, create_post, get_post, list_posts, react_to_post, comment_on_post, list_post_comments, list_post_reactions, get_feed, search_people, search_companies, search_posts, get_search_parameters, get_post_analytics, get_cached_post_analytics, get_top_posts, get_content_summary, get_profile_analytics, get_activity_analytics, purge_analytics_cache, update_account_settings, get_profile_capacity, create_campaign, list_campaigns, archive_campaign, update_campaign, delete_campaign, get_campaign_stats, contact_support, create_list, list_lists, update_list, delete_list, add_to_list, remove_from_list, get_list_contacts

Outbound(37 tools)Messaging, invitations, InMail, search, analytics, campaigns, lists. No content posting.

get_my_profile, get_profile, send_invitation, get_connections, list_conversations, get_messages, send_message, start_conversation, send_inmail, list_pending_invitations, cancel_invitation, list_incoming_invitations, accept_invitation, decline_invitation, search_people, search_companies, get_search_parameters, get_company_profile, get_cached_post_analytics, get_top_posts, get_content_summary, get_profile_analytics, get_activity_analytics, update_account_settings, create_campaign, list_campaigns, archive_campaign, get_campaign_stats, contact_support, get_profile_capacity, create_list, list_lists, update_list, delete_list, add_to_list, remove_from_list, get_list_contacts

Content(34 tools)Posts, comments, reactions, feed, analytics, campaigns, lists. No messaging or invitations.

get_my_profile, get_profile, create_post, get_post, get_post_analytics, get_feed, list_posts, comment_on_post, react_to_post, list_post_comments, list_post_reactions, search_posts, get_search_parameters, get_company_profile, get_cached_post_analytics, get_top_posts, get_content_summary, get_profile_analytics, get_activity_analytics, purge_analytics_cache, update_account_settings, create_campaign, list_campaigns, archive_campaign, get_campaign_stats, contact_support, get_profile_capacity, create_list, list_lists, update_list, delete_list, add_to_list, remove_from_list, get_list_contacts

Read only(27 tools)Browse profiles, search, read messages, view analytics. No write actions.

get_my_profile, get_profile, get_connections, list_posts, get_post, get_post_analytics, get_feed, list_post_comments, list_post_reactions, list_conversations, get_messages, list_incoming_invitations, get_profile_viewers, search_people, search_companies, search_posts, get_search_parameters, get_company_profile, get_cached_post_analytics, get_top_posts, get_content_summary, get_profile_analytics, get_activity_analytics, contact_support, get_profile_capacity, list_lists, get_list_contacts

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
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)
get_campaign_statsGet usage stats for a campaign, broken down by tool and date
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. This means a full-access key cannot bypass a read-only 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

Not sure which scope to use? Pick the most restrictive one that covers your use case - you can always widen it later.

Use caseScope
Full outreach + content + analyticsfull_access
Outbound only - search, messages, invitationsoutbound
Content posting and engagementcontent
Research, reading inbox, viewing analyticsread_only
Give to a client or contractor (limited trust)read_only or outbound
Agency workspace - client-managed accountoutbound or full_access

You set the scope when connecting a LinkedIn account in the dashboard. Each account has its own scope - one API key can manage multiple accounts with different scopes.

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. For example, send_invitation requires outbound or full_access scope. Check your account's scope in the dashboard (Accounts → permission badge) and change it if needed.

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.

Bring Your Own Database

Crispy stores contacts and activities by default, or you can bring your own Supabase database. Use our free Starter Kit to set up your own CRM and markdown campaign templates. You own everything.

Get the Starter Kit