Setup Guide
Connect Crispy to your AI tools in under 2 minutes.
Before you start
- Create an account on Crispy
- Connect your LinkedIn profile from the dashboard
- Generate an API key (starts with
crispy_) - 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
Connect Crispy directly from Claude.ai using the built-in connector system. Claude handles authentication via OAuth automatically.
- Go to Claude.ai → Settings → Connectors
- Click Add Custom Connector
- Enter the MCP endpoint URL:
https://crispy.sh/api/mcp- Claude will redirect you to Crispy to log in and pick a LinkedIn account
- Click Approve on the consent screen
- Done - Crispy tools are now available in all your Claude.ai conversations
ChatGPT
Connect Crispy as a custom MCP connector in ChatGPT via Developer Mode. Requires a ChatGPT Pro, Team, Enterprise, or Edu plan.
- Go to ChatGPT → Settings → Connectors
- Enable Developer Mode under Advanced settings (workspace admins may need to enable this first)
- Click Create and enter a name (e.g. "Crispy")
- Set the MCP Server URL:
https://crispy.sh/api/mcp- Set Authentication to OAuth
- ChatGPT will redirect you to Crispy to log in and pick a LinkedIn account
- Click Approve on the consent screen
- In any chat, click + → More → Developer Mode and select your connector
Claude Desktop
Add this to your Claude Desktop MCP config file (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:
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:
{
"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:
{
"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:
{
"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):
{
"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:
{
"mcpServers": {
"crispy": {
"url": "https://crispy.sh/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}n8n
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 toolsMake (Integromat)
Use the built-in MCP Client module to connect your Make scenarios to Crispy. Available on all paid plans.
- Add an MCP Client module to your scenario
- Enter the server URL:
https://crispy.sh/api/mcp- Set authentication to Token and paste your API key
- Make will auto-discover all available tools with input schemas
- 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.
- Add a MCP Client by Zapier step to your Zap
- Choose Run Tool as the action
- Enter the server URL:
https://crispy.sh/api/mcp- Add your API key as a Bearer token in the authorization header
- 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:
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
POST https://crispy.sh/api/mcpAuthentication
Pass your API key as a Bearer token. OAuth tokens (from Claude.ai / ChatGPT) are also accepted.
Authorization: Bearer crispy_your_api_keyAvailable methods
| Method | Description |
|---|---|
| tools/list | List all available tools and their input schemas |
| tools/call | Execute a tool with arguments |
| prompts/list | List available prompt templates |
| prompts/get | Get a prompt template by name |
| resources/list | List available resources |
| resources/read | Read a resource by URI |
Example: call a tool
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
| Code | Meaning | Retryable |
|---|---|---|
| 401 | Invalid or expired API key | No |
| 403 | Tool not allowed by permission scope | No |
| 404 | Profile, post, or resource not found | No |
| 408 | Request timed out | Yes |
| 429 | LinkedIn or plan rate limit reached | Yes (wait) |
| 502/503 | LinkedIn API temporarily unavailable | Yes |
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.
| Category | Tools |
|---|---|
| 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_zeroCheck unread conversations, summarize them, and draft replies
outbound_prospectingSearch for prospects, review profiles, send personalized invitations
Parameters: criteria (required), message_template (optional)
follow_up_sequenceDaily outreach loop: welcome new connections, check pending invitations, follow up on stale conversations
Parameters: follow_up_days (optional, default: 3)
content_engagementFind high-engagement posts and draft strategic comments
Parameters: topic (optional - leave empty to browse your feed)
post_drafterResearch 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_intelResearch a competitor's LinkedIn presence, content strategy, audience, and key employees
Parameters: company (required)
weekly_reportGenerate a LinkedIn performance report with post analytics, engagement trends, and recommendations
Parameters: profile_id (optional - leave empty for your own profile)
network_pulseSee 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.
crispy://account/infoYour connected LinkedIn account details: name, permission scope, Sales Navigator status, and plan info.
crispy://account/usageToday's API usage and remaining LinkedIn safety limits by action category. Check this before running outreach to see how much capacity you have left.
crispy://tools/listList of all MCP tools available under your current permission scope, with descriptions.
crispy://account/writing-styleYour 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.
| Action | Daily Limit | Tools |
|---|---|---|
| Search | 300/day | search_people, search_companies, search_posts |
| Profile views | 250/day | get_profile |
| Messages | 150/day | send_message, start_conversation, send_inmail |
| Engagement | 100/day | react_to_post, comment_on_post |
| Invitations | 15/day | send_invitation |
| Posts | 10/day | create_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)
| Category | Events |
|---|---|
| Actions you take | invitation.sent, message.sent, inmail.sent, post.published, post.reacted, post.commented, invitation.cancelled, invitation.accepted_by_us, invitation.declined_by_us |
| Things that happen | message.received, invitation.received, invitation.accepted, account.connected, account.disconnected, post.milestone, post.trending, profile.views_spike, safety_limit.reached, usage.daily_summary |
| Billing | billing.subscription_changed, billing.payment_failed, billing.payment_succeeded |
| Organization | org.member_added, org.member_removed |
Delivery headers
| Header | Description |
|---|---|
| X-Crispy-Signature | HMAC-SHA256 signature: sha256=<hex digest> |
| X-Crispy-Event | Event type (e.g. invitation.sent) |
| X-Crispy-Delivery-Id | Unique delivery ID for deduplication |
| Content-Type | application/json |
Payload structure
{
"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.
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.
- Create a campaign with
create_campaign - Set a follow-up message with
update_campaign- this auto-sends when connections accept your invitation - Send invitations with
campaign_idattached - Crispy tracks everything - 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
| Tool | Description |
|---|---|
| create_campaign | Create a new campaign with id, name, and optional description |
| update_campaign | Set follow-up message for auto-send on acceptance, update name or description |
| list_campaigns | List all active campaigns (use include_archived to see archived ones) |
| archive_campaign | Archive a campaign (can be unarchived later) |
| get_campaign_stats | Get usage stats for a campaign, broken down by tool and date |
| list_accepted_invitations | See 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
- Connect multiple LinkedIn profiles from your dashboard
- Use
get_profile_capacityto list all connected accounts and their IDs - Pass
account_idon any tool call to specify which LinkedIn profile to use - Omit
account_idto 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 case | Scope |
|---|---|
| Full outreach + content + analytics | full_access |
| Outbound only - search, messages, invitations | outbound |
| Content posting and engagement | content |
| Research, reading inbox, viewing analytics | read_only |
| Give to a client or contractor (limited trust) | read_only or outbound |
| Agency workspace - client-managed account | outbound 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