Every LinkedIn Tool, One MCP Server
Search people, send messages, publish posts, track analytics, and manage campaigns - all through the Model Context Protocol. Works with Claude, GPT, and any MCP-compatible AI agent.
Free LinkedIn tools
Calculators, formatters, and generators that run right in your browser. No signup, no limits.
Text Formatter
Bold and italic text for posts
Open toolCharacter Counter
Counts for every field limit
Open toolHeadline Generator
Keyword-rich profile headlines
Open toolConnection Request Generator
Notes that get accepted
Open toolSafety Calculator
Find your safe daily limits
Open toolROI Calculator
Estimate your outreach ROI
Open toolProfile Audit
Score your LinkedIn profile
Open toolSearch & Discovery
Find people, companies, and content on LinkedIn
Add or Update Company
Add or update a company record, looking it up by LinkedIn company ID (preferred) or by a name plus website fallback. You can set industry, headcount, headquarters, website, tags, custom attributes, external IDs, and notes, with custom attributes merged into any existing values. Fires a company.created or company.updated webhook, and fails if neither a LinkedIn company ID nor a name is provided.
Delete Saved Search
Delete a saved search by its ID. The call is safe to repeat and has no effect if the search ID does not exist or does not belong to you. Use it to keep your saved-search library tidy after a search is no longer needed.
Get Company Page Viewers
Get company page analytics such as page views and visitor demographics for the last 30 days. Requires the organization's numeric ID and page admin access. Optionally pass a start and end date to set the analytics range. Returns empty or fails if you are not an admin of the page.
Get Company Profile
Get a company's LinkedIn page by public ID or name (for example 'microsoft' or 'urn:li:company:1035'), returning its description, employee count, industry, and follower count. Results are cached for seven days for fast, repeated lookups. Fails with 'not found' if the identifier is invalid or the page is private.
Get LinkedIn Company
Retrieve a single company record by its internal company UUID or its LinkedIn company ID. Optionally include linked contacts, outreach stats (cached for 6 hours), and external IDs for a fuller picture of your relationship with the account. Returns the company record, or null if no match is found.
Get Saved Search Results
Return cached results for a saved search by its ID. Results are populated nightly, so an empty array means the search has not been populated yet. Set only_new=true to see only results new since your last check, which marks them as seen. Fails with 'not found' if the search ID is invalid.
Invite Connections to Follow Page
Invite your connections to follow a company page, up to 20 profiles per call with a safety limit of 50 per day. You must be an admin of the page, and you pass the profile identifiers (provider ID, slug, or URL) plus the numeric company page ID. Fails if you are not a page admin or the member IDs are invalid.
List and Export Companies
Query and export companies from your account with rich filtering by industry, headcount range, location, tags, custom attributes, or external IDs, and optionally scope to a company list. Results return as JSON or as CSV when format='csv', with cursor-based pagination. Returns an empty array when no companies match.
List Saved Searches
List only the searches you saved in Crispy via save_search, each with the ID needed to re-run it. This does not include saved searches built in the LinkedIn or Sales Navigator web app. Returns an empty array if you have no saved searches.
Look Up LinkedIn Filter IDs
Look up LinkedIn filter IDs by name across types like location, industry, function, school, seniority, technologies, and persona. Pass a type and an optional query (for example type='location', query='Netherlands') to get back the matching IDs to use in people and company searches. Returns an empty array when nothing matches, and fails if the type is not recognized.
Run Saved Search
Execute a saved search by its ID and return live results. Set from_last_cursor=true to resume pagination from where the previous run left off, or new_results_only=true to return just the results that are new since the last run. Fails with 'not found' if the search ID is invalid, and returns an empty array when there are no results.
Save a LinkedIn Search
Save a search for re-execution by name (for example 'CTOs in Germany'), storing either a structured parameters object or a pasted LinkedIn or Sales Navigator search URL. The saved search can then be paginated and re-run with run_saved_search. Fails if the search type is not people, companies, or posts.
Search LinkedIn Companies
Search LinkedIn for companies by keyword, industry, location, and employee headcount range, returning up to 25 results per call with a company ID for each match. When headcount or industry filters are used, the search routes to Sales Navigator for richer results. You can also paste a LinkedIn or Sales Navigator company search URL to run it directly. Returns an empty array when nothing matches.
Search LinkedIn People
Search LinkedIn's people directory by keyword, job title, company, location, and industry, returning up to 25 results per call with a provider ID for each match. When Sales Navigator filters like seniority level or company headcount are supplied, the search auto-routes to Sales Navigator and unlocks advanced criteria such as years of experience, function, school, and recently-changed-jobs. You can also paste a LinkedIn or Sales Navigator search URL to run it directly. Returns an empty array when nothing matches.
Search LinkedIn Posts
Search LinkedIn posts by keyword, returning up to 25 results per call with each post's ID, engagement metrics, and author. Use it to discover content and conversations around a topic so your agent can react, comment, or research engaged audiences. Returns an empty array when no posts match.
Messaging
Send and manage LinkedIn messages and conversations
Accept Suggested Label
Accept the suggested label for a conversation, such as 'sales' or 'networking', and promote that suggestion to the conversation's active category. Identify the thread by its chat_id. The call returns an error if the chat_id is not found or no suggestion exists for it.
Bulk Archive Stale Conversations
Archive conversations that have gone quiet for longer than a set number of days (default 30, minimum 7) where you were the last to message. Each archived thread automatically returns to your inbox if the other person replies, so nothing is lost. Use dry_run=true to preview the list first, and expect an empty result when no stale conversations are found.
Cancel Reminder
Cancel a pending snooze reminder or scheduled message using a reminder_id from list_reminders. Cancelling a snooze also unarchives the related conversation so it returns to your active inbox. The call fails if the reminder is not found or has already reached a terminal status.
Daily LinkedIn Recap
Get a summary of your LinkedIn activity since yesterday in one call. It reports new connections, unread messages with their chat_id values, incoming invitations, and how much of your daily action limits remains. Categories with no activity return as empty sections. Run it at the start of your day to know exactly what changed and how much headroom you have for outreach.
Delete LinkedIn Conversation
Delete an entire LinkedIn conversation, identified by its chat_id from list_conversations. This action is irreversible and removes the full thread, and it fails if the chat_id does not exist or belongs to another account. Use it to permanently clear out conversations you no longer need.
Delete LinkedIn Message
Delete a message you sent on LinkedIn, identified by its message_id from get_messages. LinkedIn only permits deletion within 60 minutes of sending, and the call fails if the message is not found or has already been deleted. Use it to retract a message sent in error before that window closes.
Download Message Attachment
Download a file attached to a LinkedIn message using its message ID and attachment ID, both available from get_messages. Returns the attachment's name, MIME type, and size. The call fails if the attachment cannot be found or belongs to another account, keeping retrieval safely scoped to your own inbox.
Edit LinkedIn Message
Edit the text of a message you previously sent on LinkedIn, replacing its content in place (up to 8000 characters). Works only for messages you authored and requires the message_id from get_messages, failing with 'not found' if the ID is invalid or does not belong to you. Edits count toward your daily edit limit. Use it to fix a typo or refine wording without deleting and resending.
Forward LinkedIn Message
Forward an existing LinkedIn message from one conversation into another. Requires the source chat_id, the message_id of the message to move (from get_messages), and the target_chat_id of the destination thread. The action shares a 100 per day limit with send_message and fails with 'not found' if the message_id or target_chat_id is invalid. Use it to relay context between conversations without retyping.
Get Comment Status
See the unanswered comments on your LinkedIn posts, ranked by value, reading straight from synced cache with zero live API calls (1 to 100, default 20). Each item returns the comment_id, author, headline, and reaction count, and you can filter to a single post or by comment type such as question, praise, or engagement. By default it excludes low-signal access-request comments so you focus on genuine conversation. Returns an empty list when every comment is already answered.
Get Inbox Status
Get an instant triage summary of your LinkedIn inbox with zero live API calls, reading from synced data. It surfaces threads that need a reply, conversations that have gone stale past a configurable threshold, and overdue commitments you made. Filter by category like sales or recruiting, or by label like 'Hot Lead', and use force_live to recompute from the latest sync and queue a fresh pull in the background. Returns an empty needs_reply list when your inbox is clear.
Get LinkedIn Messages
Fetch the messages from a single LinkedIn conversation (1 to 100, default 20), ordered so you can read the full exchange. Requires a chat_id obtained from list_conversations or a newly started conversation, and supports a pagination cursor for longer threads. Returns an empty array when the thread has no messages and fails with a 'not found' error if the chat_id is invalid. Use it to load context before composing a reply.
Get Morning Briefing
Return a consolidated morning briefing that bundles your pulse, capacity, and optionally session status into one call. Use include=['pulse','session'] to verify your LinkedIn connection, and expand flags like 'viewers', 'ssi', or 'inmail_balance' to enrich the pulse section. Sections come back empty if the underlying background jobs have not run yet.
List Chats by Attendee
Return all one-to-one chats tied to a specific attendee ID, sourced from list_conversations. Supports a limit between 1 and 100 (default 20) plus cursor pagination for longer histories. The call fails if the attendee ID is invalid or not found, so you always work from a confirmed contact.
List Conversation Labels
Return every label currently applied across your conversations along with a count of how many threads carry each one, sorted by count. Returns an empty array when no labels exist yet. Pair it with list_conversations(label=...) to build a split inbox organized by your own categories.
List LinkedIn Conversations
List your LinkedIn conversations with a preview of the most recent message in each thread (1 to 100, default 20). Each result includes a chat_id for follow-up actions and a their_turn flag that tells you when the contact sent the last message and is awaiting your reply. Filter by label like 'Hot Lead' or 'Client', and optionally include archived threads. Use it to surface what needs attention before drafting responses.
List Reminders and Scheduled Messages
Return your pending snooze reminders and scheduled messages, defaulting to 50 results sorted by remind_at. Filter by status using pending (default), fired, cancelled, sent, failed, or 'all' to inspect any part of the lifecycle. Returns an empty array when nothing matches.
List User Reactions
Return the public reactions a LinkedIn user has made, identified by their provider_id from get_profile or get_connections. Supports a limit between 1 and 100 (default 20) with cursor pagination, and returns each reaction's type, post ID, and timestamp. The call fails if the user ID is invalid or the user has no public reactions.
Mark Conversation Read
Mark a LinkedIn conversation as read using its chat_id from list_conversations, with a safety limit of 200 per day. The action is idempotent and returns {marked_read: true}, so repeating it on the same thread is harmless. It fails if the chat_id is not found or belongs to another account. Use it to clear unread badges on threads you have already handled.
Organize Conversation
Run a single organizing action on a conversation: archive, unarchive, label, unlabel, snooze, or smart_archive. Labeling needs a label value, and snooze needs a future ISO 8601 snooze_until (capped at 200 per day), with smart_archive optionally auto-returning the thread when the other person replies. The call fails if the action is unknown or the chat_id is not found.
React to LinkedIn Message
Add an emoji reaction to a specific LinkedIn message, supported on LinkedIn and WhatsApp. Pass any emoji character such as a thumbs up, heart, laugh, or party popper along with the message_id. It fails if the message_id is invalid or the message has been deleted. Use it to acknowledge a message lightly when a full reply is not needed.
Reject Suggested Label
Reject the suggested label for a conversation identified by chat_id, optionally passing a correct_label such as 'sales', 'networking', 'recruiting', 'support', 'personal', or 'other' to train the classifier. Providing the right label improves future suggestions. The call returns an error if the chat_id is not found.
Schedule LinkedIn Message
Schedule a message to send in a specific conversation at a future datetime (ISO 8601, up to 8000 characters). If the contact replies before the scheduled time, the send is automatically cancelled so you never talk over them. The call fails if send_at is not a valid future datetime, and an optional internal note can be attached for your own reference.
Search LinkedIn Messages
Search your cached LinkedIn messages by keyword across all conversations with zero live API calls (1 to 100, default 20). Each match returns the chat_id, sender, and timestamp so you can jump straight to the relevant thread, and you can narrow results to only messages you sent or only those you received. Returns an empty array when nothing matches. Use it to recall where a topic, name, or commitment was discussed.
Send LinkedIn InMail
Send an InMail to someone outside your immediate network, reaching prospects you are not yet connected to. Requires a Sales Navigator subscription, consumes InMail credits, and accepts the recipient as a provider_id, profile slug, or full LinkedIn URL. The body is capped at 1900 characters and the optional subject at 200, and you can attribute the send to a campaign. Fails if the recipient has opted out of InMail or you have no credits remaining.
Send LinkedIn Message
Send a LinkedIn message to an existing conversation using its chat_id, or start a brand new conversation using the recipient's provider_id. Supports text up to 8000 characters, file and image attachments, and native voice notes up to 5MB that render as a playable waveform in the recipient's inbox. A built-in safety limit of 150 per day protects your account, and you can attribute the action to a campaign. Fails if neither chat_id nor provider_id is supplied.
Send Voice Message
Send a voice note to a LinkedIn chat from a public audio URL in .mp3, .m4a, .ogg, or .wav format, up to 5 MB. Target an existing conversation with chat_id or start a new one with provider_id, and add an optional text caption or campaign tracking ID. The call fails if the audio URL is invalid or the format is unsupported, and each voice note counts against your daily message limit. Generate audio with any text-to-speech provider and host it using upload_media.
Content
Create, read, and engage with LinkedIn posts
Accept Content Suggestion
Accepts a suggestion from your content queue and creates a post draft from it, defaulting to one per session. It marks the suggestion as 'drafted' and returns the new draft_id ready for editing or publishing. Returns an error if the suggestion_id is not found or has already been actioned.
Batch Reply to LinkedIn Comments
Reply to multiple LinkedIn comments in a single call, up to 20 at a time with each reply capped at 1250 characters. Any replies that would exceed the 100-per-day engagement limit are automatically skipped. Use get_comment_status first to find the unanswered comments worth replying to.
Cancel Scheduled LinkedIn Post
Cancel a scheduled LinkedIn post before it is published, using its UUID from list_scheduled_posts. Only posts still in the pending state can be cancelled. The call fails if the post has already been published, failed, or was previously cancelled.
Comment on LinkedIn Post
Comment on a LinkedIn post with up to 1250 characters, either as a top-level comment or as a reply to a specific comment using a parent comment ID. A safety limit of 100 comments per day keeps your engagement looking natural. The call fails if the post ID is invalid or the post was deleted.
Delete LinkedIn Comment
Targets a LinkedIn comment for permanent deletion using its comment_id and the parent_post_id that contains it. This action is preview-required and irreversible, but it cannot be completed programmatically today and returns not_implemented, so you finish the deletion in the LinkedIn interface. Use it to locate and confirm the exact comment to remove.
Delete LinkedIn Post
Permanently deletes a LinkedIn post by its post_id, for example one returned from list_posts or get_post. This cannot be undone and requires the full_access scope, since deletion is irreversible. Fails if the post does not exist or was already deleted.
Delete LinkedIn Post Draft
Permanently deletes a LinkedIn post draft, which must be in 'draft' or 'archived' status. Drafts that are 'publishing' or 'published' cannot be deleted. This action is irreversible, so use it to clear out ideas you have decided not to pursue.
Dismiss Content Suggestion
Dismiss a single content queue suggestion so it no longer appears in your pipeline. The dismissal is recorded as a signal, which prevents the recurring suggestion cron from resurfacing the same topic. You can pass an optional reason (up to 500 characters) to sharpen future recommendations, and the tool returns an error if the suggestion ID is not found.
Engage With Latest Post
Reacts to someone's latest LinkedIn post and optionally leaves a comment, with a safety limit of 100 per day. Accepts a provider_id, a profile slug, or a full URL to identify the person, and you can choose the reaction type and attach the action to a campaign. Fails with 'no posts found' when the person has no public posts.
Get Content Context
Returns a complete content dashboard in a single call with zero live API calls, bundling your writing style, recent posts, unanswered comments, drafts, and cadence gaps. Use depth='summary' for capped payloads or depth='full' for uncapped sessions. Sections with no data yet come back as empty arrays.
Get LinkedIn Feed
Retrieve your LinkedIn feed, returning 1 to 100 items with each post's ID, engagement counts, and a sponsored flag. Use the exclude_sponsored option to filter out ads and promoted posts, and the start offset to page through results. Returns an empty array if your feed has no items.
Get LinkedIn Post
Retrieve a single LinkedIn post by its activity ID and read back its full content, author, and engagement metrics. Use it to inspect a specific post before reacting, commenting, or analyzing performance. If the post was deleted or the ID is invalid, the call returns a not-found error.
Get Writing Style
Returns your personalized writing style guides for messaging, posting, and commenting, covering tone, structure, and phrasing. These are generated once when your account connects and can be edited via set_writing_style. When analysis has not yet run, the status comes back 'not_found' and no styles are returned until it does.
List LinkedIn Post Comments
List the comments on a LinkedIn post, returning 1 to 100 at a time sorted by most relevant or most recent. Accepts a post ID, activity URN, or feed URN, and extracts the activity ID automatically. The returned total counts top-level comments only, which is usually lower than the comment count from get_cached_post_analytics since that figure includes nested replies.
List LinkedIn Post Drafts
Lists your saved LinkedIn post drafts, sorted by most recently updated, with a default filter of status 'draft'. Pass status='published' to find drafts that became live posts, each row carrying its published_post_id and published_at. Returns an empty array when no drafts match. Use it to review your content pipeline before editing or publishing.
List LinkedIn Post Reactions
List the reactions on a LinkedIn post, returning 1 to 100 at a time with pagination. Accepts a numeric post ID, activity URN, or feed URN and returns each reactor along with their reaction type. Returns an empty array when there are no reactions, and a not-found error if the post ID is invalid.
List LinkedIn Posts
List LinkedIn posts in two modes: recent posts in chronological order for a given profile or company, or your own top posts ranked by a chosen engagement metric. Recent mode requires an identifier (provider ID, slug, or URL), while top mode ranks your posts by impressions, reactions, comments, reposts, or engagement rate over a lookback window. Returns an empty array when no posts are found.
List Scheduled LinkedIn Posts
List your scheduled LinkedIn posts along with their status and scheduled times, returning 1 to 100 at a time. Filter by status to see posts that are pending, published, failed, or cancelled. Returns an empty array when no scheduled posts exist.
Publish LinkedIn Draft
Publishes a saved draft as a live LinkedIn post, with a safety limit of 10 per day shared with create_post. The call is idempotent, returning the existing post_id if the draft was already published, and rolls the draft back to 'draft' status on failure. Requires a draft_id whose status is 'draft'.
Publish LinkedIn Post
Publish a LinkedIn post immediately or schedule it for a future time, as your personal profile or a company page you administer. Supports up to 3000 characters with image and document attachments, @-mentions, and link preview cards. A built-in safety limit of 10 posts per day protects your account, and scheduled times in the past are rejected.
React to LinkedIn Post
React to a LinkedIn post with one of six reaction types: like, celebrate, support, love, insightful, or funny. Reacting again simply overwrites your existing reaction without error, so the action is safe to repeat. A safety limit of 100 reactions per day protects your account from looking automated.
Refresh Writing Style
Re-analyzes your writing style from your recent posts and messages, ideal after 30 or more days as your voice evolves. It returns 'processing' immediately, so check get_writing_style after a minute or two for the updated guides. The call fails if fewer than five posts or five messages are available to analyze.
Reply to LinkedIn Comment
Reply to a specific LinkedIn comment by its comment ID with up to 1250 characters, within a 100-per-day engagement limit. The comment must already be cached, so run get_comment_status first to confirm. For comments created in the same session (which are not cached yet), use comment_on_post with a parent_comment_id instead.
Repost LinkedIn Post
Reshares a LinkedIn post to your feed, with a safety limit of 100 per day shared with reactions. The post_id must be a URN such as 'urn:li:activity:7123456789', and you can add optional commentary when resharing. Fails if the post has been deleted or is not publicly accessible.
Research High-Engagement Feed Posts
Pull the highest-engagement posts from your LinkedIn feed, sorted by engagement rate and returning 1 to 50 results. Filter by a topic keyword to focus on a subject, and use refresh to bypass the 2-hour cache for fresh data. Returns an empty array if the feed is empty or no posts match the topic.
Save LinkedIn Post Draft
Save a LinkedIn post draft and get back a draft ID for later use with update_draft or publish_draft. Supports up to 3000 characters along with attachments, @-mentions, a link preview, and company-page targeting, plus private notes and target-audience fields that are never published. The call fails if the text exceeds 3000 characters.
Set Writing Style
Overwrites one or more of your writing-style guides (messaging, posting, or commenting) with custom prose. Any field you pass replaces the auto-generated version, omitted fields are left untouched, and an empty string clears a field. Returns the merged result so you can confirm the final guides.
Set Writing Style Examples
Provide 1 to 3 LinkedIn profiles whose posting style you want to match, identified by provider_id, slug, or full URL. Crispy analyzes their tone, structure, and patterns and returns 'processing' immediately, so check get_writing_style after a minute or two. The call fails with 'invalid' if you pass fewer than one or more than three profiles.
Update LinkedIn Post Draft
Edits a saved LinkedIn post draft, which must be in 'draft' or 'archived' status. Pass any subset of fields to change just what you need, including text, private notes, target audience, attachments, mentions, an external link preview, or the draft status. Returns an error if the draft_id is invalid or the draft has already been published.
Connections
Manage your LinkedIn network and invitations
Add Contact or Company to Blocklist
Adds a contact or an entire company to your blocklist so they are excluded from outreach. Use scope 'contact' to flag an individual via a structured lookup, or scope 'company' to flag an organization by its LinkedIn company ID. The operation is idempotent and accepts an optional reason for your records.
Add To Block List
Add a profile to your do-not-contact block list so all outreach to that person is prevented. Accepts a LinkedIn URL or slug, or a structured lookup object that resolves the highest-priority identifier (crispy_id, provider ID, external ID, URL, or email), plus an optional reason. The operation is idempotent, so re-blocking an already-blocked profile has no effect.
Cancel LinkedIn Invitation
Withdraw a pending invitation you previously sent, identified by its invitation_id from list_invitations. The action fails if the invitation has already been accepted and has no effect if it was already withdrawn. Use it to tidy up stale outbound requests and keep your pending queue under control.
Check Block List
Checks whether a specific LinkedIn profile sits on your do-not-contact block list, accepting either a full URL or a bare slug. Omit the profile to list every blocked entry instead, returning up to 100 by default and a maximum of 500. Returns an empty list when no profiles are blocked.
Endorse LinkedIn Skills
Endorse a specific skill on a LinkedIn profile identified by provider ID, slug, or URL. The skill name must match exactly what is listed on the profile (case-sensitive), so pair this with get_profile to see which skills are available. The tool enforces a 50-per-day safety limit and can be attributed to a campaign for tracking.
Follow LinkedIn User
Follow a person on LinkedIn identified by provider ID, slug, or URL, so their posts surface in your feed. Following is a lightweight signal that often warms up a relationship without requiring a connection. The tool shares a 50-per-day safety limit with unfollow_user, returns no error if you already follow the person, and fails only if the profile cannot be found.
Get Profile Followers
Lists the followers of a LinkedIn profile, returning between 1 and 100 per page (default 20) with a provider ID for each follower. Paginate through the full list using the cursor returned in each response. Returns an empty list if the profile has no followers or its followers are private.
Import Block List
Bulk imports profiles onto your do-not-contact block list from a CSV or a JSON array, accepting plain URL strings or { linkedin_url, reason } objects, up to 5000 entries per call. Invalid and duplicate URLs are skipped automatically so a partial list still loads cleanly. Returns an error if no entries are provided.
Import Contacts or Blocklist Data
Imports contacts or do-not-contact entries from a CSV, a hosted file, or an array. Set target 'contacts' to load CRM records (from raw CSV text, an HTTPS URL, a storage path, or contact objects), with control over how duplicate LinkedIn URLs are merged, replaced, or skipped. Set target 'blacklist' to add exclusion entries instead. Fails if the CSV is malformed.
LinkedIn Network Analytics
Run aggregate analytics over your locally-synced connections, with or without filters. Without filters you get a full-network view: top companies, normalized title groups, locations, skills, monthly growth velocity, recency buckets, and campaign overlap. With filters you get the same aggregates scoped to a matching slice plus the matching contact list with each person's campaign status, and group_by returns a full uncapped distribution for one dimension. This is a database-only tool that returns empty if connections have never been synced.
List Blocklisted Contacts and Companies
Lists every blocklisted contact or company in your account so you can audit your exclusions. Use scope 'contact' to return contacts that are currently blocklisted, or scope 'company' to return blocklisted companies. Results are paginated with a default of 100 entries and a maximum of 500, using a configurable offset.
List LinkedIn Connections
List your 1st-degree LinkedIn connections, returning between 1 and 100 per call (default 20) with each result's provider ID for use in downstream actions. An optional keyword filters by name or headline across up to 500 connections. For very large networks of 500 or more, use list_saved_connections instead. Returns an empty array when no connections match.
List LinkedIn Invitations
List LinkedIn connection invitations by direction, either incoming received requests (default) or sent outbound requests, and filter by status of pending, accepted, or all. Accepted results come from the invitation tracker and support a configurable look-back window and campaign filter. Returns an empty array when no invitations match.
List Saved LinkedIn Connections
Search the connections you have saved locally by name, company, title, headline, or skill, returning between 1 and 100 results (default 20). The tool makes zero API calls and returns each match's provider ID for downstream actions, or an empty array when nothing matches. Use it to instantly recall contacts from your saved library.
Remove Contact or Company From Blocklist
Removes a contact or company from your blocklist, clearing the block so outreach can resume. Use scope 'contact' to lift an individual via a structured lookup, or scope 'company' to lift an organization by its LinkedIn company ID. Returns an error if the entity is not currently blocklisted.
Remove From Block List
Removes a single LinkedIn profile from your do-not-contact block list, allowing outreach to resume for that person. Accepts a full profile URL or a bare slug like 'john-doe', auto-normalizing either format. Returns a not-found error if the profile was never on the block list.
Remove LinkedIn Connection
Permanently removes a first-degree LinkedIn connection from your network. Accepts a provider ID, a profile slug, or a full LinkedIn URL, and is capped at 10 removals per day as a safety guard. Returns { removed: true } on success and fails if you are not currently connected to that person.
Respond To LinkedIn Invitation
Accept or decline an incoming connection invitation using its invitation_urn from list_invitations with direction incoming. There is no daily limit on responses, and some invitations also require the shared_secret returned alongside the URN. The tool returns an error if the URN is invalid or the invitation has already been actioned.
Save LinkedIn Connection
Fetch a LinkedIn profile by provider ID or slug and save it to your local store, optionally with notes attached. Saving overwrites any existing entry for that profile and fails with a profile-not-found error if the identifier is invalid. Use it to build a durable local library of key contacts you can later search without spending API calls.
Search LinkedIn Connections
Search your locally-synced connections (up to 500) by keyword, title, name, company, location, skills, and connection date range. This is a database-only query that returns an empty array if connections have not been synced first, along with a total count and a base64 pagination cursor. Use it to slice your existing network precisely without any LinkedIn API calls.
Send LinkedIn Invitation
Send a LinkedIn connection invitation to a person identified by provider ID, profile slug, or full URL. You can attach a personal note of up to 300 characters, which meaningfully increases acceptance rates, and optionally attribute the action to a campaign for tracking. The tool enforces a 15-per-day safety limit and fails cleanly if you are already connected or an invitation is already pending.
Sync LinkedIn Inbox
Trigger an immediate inbox sync to pull the latest messages from LinkedIn. The job runs asynchronously and returns {queued:true}, typically completing within 30 to 60 seconds. It cannot run without a linked LinkedIn account, in which case it returns success:false. Poll get_inbox_status with force_live to confirm fresh messages have landed.
Unfollow LinkedIn User
Unfollow a person on LinkedIn identified by provider ID, slug, or URL, removing their posts from your feed. The tool shares a 50-per-day safety limit with follow_user, returns no error if you are not currently following the person, and fails only if the profile cannot be found. Use it to keep your feed focused on the relationships that matter.
Analytics
Track post performance, profile metrics, and activity
Get Activities Event Log
Provides a raw read of the activities event log, including touchpoints, sends, replies, and accepts, so you can compute your own scores, health metrics, or cohort analysis. Filter by contact, campaign, activity type, direction, and time window, with a default of 100 rows and a max of 500. Returns an empty list when nothing matches your filters.
Get Activity Analytics
Returns a daily activity breakdown over a chosen window (default 7 days), covering invitations sent, messages, and posts. By default only actions taken through Crispy are counted, but you can set tracking_mode to 'all_activity' for full coverage of everything on the account. Returns empty rows for days with no recorded activity, making it easy to spot gaps in outreach cadence.
Get Analytics
A single analytics endpoint that returns metrics by time period and dimension, covering campaigns, invitations, messages, posts, reactions, comments, profile, and content. The post, profile, and content dimensions use live sub-handlers, while aggregate dimensions like posts and campaigns serve a nightly cache that is 1 to 23 hours old. Use dimension='post' with an id for per-post metrics, or refresh to force a recompute. Returns empty slices when no data exists yet.
Get Cached Post Analytics
Returns metrics for your recent posts, including impressions, reactions, comments, reposts, and engagement rate, sortable by any of those dimensions and filterable by content type. It serves cached data with a live fallback and returns an empty array when nothing is cached. Note that the comments count reflects LinkedIn's total including replies, so it runs higher than the top-level count from list_post_comments.
Get Campaign Variant Stats
Returns per-variant statistics for a campaign, broken down by step and arm, including sent, accepted, replied, positive_replied, and positive_reply_rate. A positive reply is counted when a contact carries an auto:interested or auto:wants_meeting tag, giving you a clear read on which message variants actually convert. Returns empty when nothing is enrolled in the campaign.
Get Comment Reach
Analyze the reach and return on your commenting activity over a chosen window (default 30 days), including which posts you commented on, impression correlation, and a daily breakdown. This helps quantify whether time spent commenting is actually driving visibility. Returns empty results when no comment activity is cached for the selected period.
Get Content Patterns
Surfaces post performance patterns across hook styles, post lengths, CTA impact, and posting times, computed entirely from your history with zero additional API calls. You can scope the analysis to recent posts with an optional days parameter (minimum 7). It requires at least 10 posts to produce meaningful results and returns empty if fewer than 10 qualify.
Get InMail Balance
Returns the number of available InMail credits and plan information for the connected account. Use it before send_inmail so your agent never burns a send attempt on an empty balance. Returns null fields when the account has no Premium subscription.
Get Post Analytics
Retrieve core performance metrics for a single LinkedIn post, including impressions, reactions, comments, and reposts. Pass the post ID or activity URN to get an at-a-glance read on how that post performed. This tool is deprecated and is being replaced by get_analytics with dimension='post', so prefer that path for new work. Fails cleanly if the post was deleted or the ID is invalid.
Get Social Selling Index
Returns your LinkedIn Social Selling Index score out of 100 along with its category breakdown, giving you a benchmark for your professional brand and selling activity. This requires an active Sales Navigator subscription, and an active_seat value of false signals the subscription may have lapsed. Fails with a clear error when Sales Navigator is not active.
Mark Commitment Fulfilled
Marks a tracked commitment as fulfilled, for example a promise like 'I'll send you that document by Friday' that was surfaced in your inbox. Pass the commitment_id from the overdue_commitments list returned by get_inbox_status. Throws if the commitment_id is not found.
Save Sales Navigator Lead
Saves a profile as a Sales Navigator lead, accepting a provider ID, profile slug, or LinkedIn URL as the identifier. This keeps high-value prospects tracked inside Sales Navigator for follow-up. Requires an active Sales Navigator subscription and fails if the profile cannot be found or Sales Navigator is unavailable.
Campaigns
Create and track outbound campaign performance
Apply Sequence Template
Applies a built-in sequence template to a campaign, copying its follow_up steps as-is into the campaign's follow_up_sequence. The template's follow-ups carry no daily limit and write to the follow-up sequence rather than the main sequence. Fails if the template_name or campaign_id is invalid.
Archive Campaign
Archives a campaign so it stops accepting new actions while keeping all historical data intact. Use it to wind down outreach without losing reporting, since archiving is fully reversible. Fails with not found if the campaign_id does not exist.
Confirm Campaign Launch
Confirms and enables a campaign by flipping enabled to true, after which the daily cron sends with no further preview gates. The action is idempotent, so re-running it on an already-enabled campaign has no effect. Returns NOT_LINKED if the campaign is not bound to your account.
Create or Update Campaign
Creates a new campaign or updates an existing one in a single call. Omit campaign_id to create (requires name, kind, and either a list_id or inline contacts) or provide it to update. Choose acquisition for invite-based outreach to new first-degrees or relationship for DM-only outreach to existing connections, with a URL-safe slug auto-derived from the name.
Delete Campaign
Permanently deletes a campaign and cascades to purge all related rows, with no need to archive first. This cannot be undone, so use archive_campaign instead when you want to preserve historical data. Returns not found if the campaign_id does not exist.
Get Campaign Details
Fetches campaign data for one campaign or lists all of them. Omit campaign_id to list every campaign in your workspace, or pass one with include[] to load the health funnel, action stats, account health, and outreach config in parallel. Returns metadata only by default and supports forced recompute of included slices.
Get Enrollment Policy
Returns your enrollment policy defaults across eight toggles that decide whether a contact may enroll in outreach. Pass an optional campaign_id to also receive the effective merged policy, combining your user defaults with that campaign's tristate overrides. Read-only.
List Sequence Templates
Lists the built-in sequence templates available to apply to a campaign. Each entry returns its name, description, and step count so you can pick a proven outreach structure quickly. Returns an empty array if no templates are found.
Manage A/B Variants
Manages A/B variants for a specific campaign step. Use action='list' to see variants, 'add' to create a new arm (label plus message_template, with limits split evenly), or 'remove' to retire an arm so enrolled leads fall back to the base template. Target the pre-send sequence or the post-acceptance follow-up step array. Fails if the campaign or step is not found.
Manage Campaign Outreach
Configures or controls a campaign's outreach engine. With action='setup' you write the ordered steps (warmup actions, the auto-firing invite, then follow-up messages), daily_invites, invite_message, and list_id, while pause and resume toggle sending. Omit steps to preserve existing ones, pass [] to clear them, and note that text DM follow-ups use type='message'.
Manage Campaign Senders
Manages the pool of sender accounts on a campaign. Use action='list' to see configured senders, 'add' to bring a sender into the round-robin pool (daily limits split evenly across senders), or 'remove' to hard-delete a sender (contacts are reassigned at the next cron, not immediately). Fails if the campaign is not found, the sender is already added, or the sender to remove is not found.
Preview Campaign Launch
Renders a read-only launch preview for a campaign before any message goes out. Returns up to 10 personalized first-touch messages (configurable up to 50), a summary of the prospect list, blacklist hits, and duplicate hits. Use it to sanity-check personalization and audience quality before confirming a launch.
Set Enrollment Policy
Update the safeguards that decide which contacts are eligible to enter your outreach campaigns. Set account-wide defaults by omitting campaign_id, or apply a per-campaign override using a tristate of 'skip', 'allow', or null (inherit the default). Toggles cover pending invitations, unsubscribes, blocklist membership, recently messaged contacts, same-sender or cross-sender touches, other active acquisition campaigns, and already-connected profiles. Omit any field to leave it unchanged.
Unarchive Campaign
Restores an archived campaign back to active status so it can accept actions again. The operation is idempotent, meaning it returns no error if the campaign is already active. Fails with not found if the campaign_id does not exist.
Upload Campaign Media
Re-hosts media from a public URL into Crispy storage so it can be attached to campaign steps. Supports audio (.m4a, .mp3 up to 5MB) and images or video (.jpg, .png, .mp4 up to 10MB). Fails if the URL is unreachable, the extension is unsupported, or the file exceeds its size limit.
Account
Manage account settings, diagnostics, and capacity
Contact Support
Submits a support request with a subject (max 200 chars) and detailed message (max 5000 chars), optionally flagged urgent for blocking issues. Account diagnostics are attached automatically by default to speed up resolution. Limited to 5 requests per hour, returning a rate limit error beyond that.
Create API Key
Creates a scoped API key (up to 10 per account) for programmatic access, returning the raw key value exactly once so you must store it securely. Choose a scope of 'team', 'workspace', or 'resource', and pass granular permissions like ['campaigns:read','inbox:write'] or omit them for full access. The call fails if the 10-key limit is reached, in which case you must revoke an existing key first.
Create Event Subscription
Routes an event type to a webhook endpoint, for example event='message.received' with a webhook_id UUID taken from list_webhooks. You can scope delivery with an optional filter like {campaign_id: 'abc123'}, where all values are compared as strings. Up to 50 subscriptions are allowed, and it returns an error if the webhook_id is not found or the event type is invalid.
Create Webhook
Creates a webhook that receives POST requests at an HTTPS URL for the event types you subscribe to. Returns a signing secret you should save for verifying incoming payloads. Fails if the URL is not HTTPS, the events are invalid, or the 25-webhook account limit is reached.
Delete Event Subscription
Deletes a single event subscription, identified by its UUID from list_subscriptions, and stops delivery for that subscription only. Your other subscriptions and the underlying webhook remain untouched. It returns an error if the subscription is not found or is not owned by you.
Delete Webhook
Deletes a webhook by its webhook_id, immediately stopping all deliveries and removing any attached subscriptions. The operation has no effect if the webhook_id is not found or belongs to another user. This action is destructive and cannot be undone.
Edit LinkedIn Profile
Edits your own LinkedIn profile by updating the headline (up to 220 characters) and the summary or about section (up to 2600 characters). A safety limit of 10 edits per day applies, and the call returns {updated: true} on success. It fails if all fields are empty or the account lacks permission, so provide at least one field to change.
Get Account Status
Returns a unified account view aggregating daily limits, limit ranges per category, warm-up status, message format preference, and session health for every connected LinkedIn account. Pass verify_session=true to run a live LinkedIn session check (adds latency). The session block always exposes session.valid and session.name for quick triage.
Manage Outreach Settings
Single tool for all outreach configuration. Route with action: 'limits' sets min/max daily range per category; 'business_hours' sets the send window; 'message_format' sets split/single/ask; 'auto_withdraw' (Pro) sets auto-withdraw days (60-90 or 0 to disable); 'warm_up' (Pro) starts or stops the warm-up ramp.
Get LinkedIn Profile
Retrieve a LinkedIn profile by provider_id, public slug, or full URL, or omit the identifier to fetch your own profile. Auto-selects Sales Navigator when available, lets you request only the sections you need for lighter responses, and can optionally trigger a profile-view notification to the person. Subject to a 250-per-day view limit.
Get Profile Viewers
Returns the people who recently viewed your LinkedIn profile, from 1 to 100 viewers (default 20), each with a provider_id you can act on. Returns an empty array when there are no viewers or when the account is not Premium, since the full viewer list requires a Premium subscription.
Get Webhook Deliveries
Returns recent delivery attempts for a specific webhook (1 to 50, default 20), showing delivery status, response codes, errors, and retry schedule. Filter by status to focus on delivered, pending, or failed attempts. Fails with 'not found' if the webhook_id is invalid or belongs to another user.
List API Keys
Lists your API keys as metadata only, including the prefix (for example, 'ws_abcdefghij'), scope, permissions, and usage_count. Raw key values are never returned, and an empty list comes back if you have none. Expired-and-never-used keys are hidden by default; pass include_expired=true to see them, while expired keys that were used remain visible regardless.
List Event Subscriptions
Lists your event subscriptions, such as 'message.received', returning each subscription's UUID, event type, filter, enabled state, and the linked webhook_id. If no subscriptions exist, it returns an empty array. Use this to audit which events are being routed to which webhook endpoints.
List Webhooks
Lists all webhooks configured for your account, each with its webhook_id, target URL, subscribed event types, and enabled status. Returns an empty array when no webhooks exist. Pair it with get_webhook_deliveries to inspect the delivery history of any specific webhook.
Revoke API Key
Permanently revokes an API key, identified by its UUID or prefix (for example, 'ws_abcdefghij'). Revocation is immediate and cannot be undone, and it frees one slot toward the 10-key-per-account limit. It returns a not found error if the key_id does not belong to the current user.
Test Webhook
Sends a test payload to a webhook identified by its webhook_id and returns the delivery status code. Use it to confirm your endpoint is reachable and handling payloads correctly before depending on live events. Fails with 'not found' if the webhook_id is invalid.
Trigger Contact or Company Sync
Nudges a sync for a specific contact or company record (target='contact' or 'company', id=UUID), firing a sync_requested webhook that carries the full record. An optional sync_type label routes the payload downstream (for example, 'enrichment') for further sequencing. The call is workspace-scoped and fails if the id is not a valid UUID.
Update Account Settings
Updates account-level settings including activity tracking mode (mcp_only or all_activity), the tool surface permission scope (core or full_access), and optional voice integration credentials stored securely for your TTS provider. Changing the permission scope requires reconnecting the MCP connection for the new tool list to take effect. Fails if the account is not owned by you.
Update Webhook
Updates an existing webhook's URL, subscribed event types, enabled status, or description, identified by its webhook_id from list_webhooks. Lets you reconfigure integrations in place rather than deleting and recreating them. Fails with 'not found' if the webhook_id does not exist.
Lead Management
Track leads, outreach history, and contact interactions
Add Contact Note
Adds a free-form note to a contact, capturing context like call summaries or deal details. Notes are user-scoped and timestamped, and they surface again through get_contact and list_notes. The call fails if the contact cannot be found.
Add Or Update Lead
Add or update a lead keyed by LinkedIn URL, accepting either a slug like 'john-doe' or a full profile URL. It creates the contact when not found and updates status, notes, tags, and custom attributes when it already exists. Returns an error if the account storage_mode is not 'managed'.
Bulk Import Contacts
Bulk-import contacts from a JSON array, raw CSV, a public CSV URL, or a storage path, with each record requiring a LinkedIn URL. Choose a merge_strategy of merge (tags union and attributes deep-merge), replace (overwrite), or skip (no-op duplicates), and read per-record skip reasons in skipped[]. Set preview=true to project the import without persisting, then commit it with the returned confirm_token.
Check Lead Collision Status
Return the pre-computed collision status for a lead by provider id, showing which lists and campaigns they belong to, whether they are blacklisted, and whether they are already connected. The data is refreshed nightly, with an optional refresh flag to synchronously recompute for a guaranteed-fresh result. Returns null data when the status has not yet been computed.
Create Contact Tag
Create a named tag such as 'vip' or 'warm-lead', with an optional hex color, to organize your contacts. Tags are user-scoped, and the call is idempotent, returning the existing tag if the name already exists. Use it to set up labels before tagging or filtering contacts.
Create Custom Field Definition
Define a typed custom field for your contacts, such as a numeric lead score, a tier select, or a renewal date. Choose from text, number, date, url, select, or multi_select kinds, supplying allowed options for the select types. Each account supports up to 200 field definitions, and an unknown kind returns an invalid_kind error.
Delete Contact Note
Deletes a note by its ID, but only when the note exists and is owned by the requesting user. It fails with note_not_found otherwise and requires a confirmation token before removing the note. Use it to clear outdated or mistaken entries from a contact's history.
Delete Contact Tag
Permanently deletes a tag by its ID and unlinks it from all contacts it was applied to. This action cannot be undone, fails silently if the tag is not found, and requires a confirmation token to proceed. Use it to retire obsolete labels and keep your contact taxonomy clean.
Delete Custom Field Definition
Delete a custom field definition by its id and remove every value stored under it across your contacts. This action is irreversible, so it is best reserved for retiring fields you no longer use. An invalid id returns a not found response.
Enroll Lead In Campaign
Enroll a contact in a campaign by its slug, creating the contact if it is new. Every call returns a complete verdict: added, already enrolled, or skipped with a reason. The operation is idempotent, so calling it repeatedly with the same input is always safe.
Get Custom Field Values
Get all typed custom field values currently set on a contact, such as score=90 and tier=gold. Accepts any lookup identifier to resolve the contact. Returns an empty custom_fields array when no values have been set.
Get Full Contact Picture
Get the complete picture for a contact in a single call: identifiers, campaign enrollments, messages, connection events, company link, lead score, and next-best-action. Accepts any lookup identifier to resolve the contact. It replaces chaining get_lead, list_messages, and get_company into separate requests.
Get Outreach History
Get the outreach and activity history for a specific contact or across all recent activity. Returns send_invitation, send_message, and profile_view events, filterable by contact identifier or activity type. Returns an empty list when no matching activities are found.
List And Export Contacts
Query your contact database with rich filtering by connection status, response status, campaign membership, custom attributes, or tags. Returns results as JSON by default or as CSV when format='csv' for bulk export, with cursor-based pagination for large lists. Use it to segment your audience, build export files, or pull a precise slice of contacts for downstream work.
List Contact Notes
Lists the notes attached to a contact, most recent first, returning up to 50 entries. It returns an empty array when the contact has no notes and fails if the contact cannot be found. Use it to review the full history of context you have logged before reaching out.
List Contact Tags
Lists all tags defined for the account, returning each tag's id, name, and color. Returns an empty array when no tags exist yet. The returned tag_id is what you pass to add_contact_tag to apply a tag to a contact.
List Custom Field Definitions
List every typed custom field definition on your account. Each entry returns its id, name, kind (such as number or date), allowed options, and the template_variable token you can drop into campaign messages. Returns an empty array when no fields have been defined.
Remove Tag From Contact
Removes a tag from a single contact by unlinking it, leaving the tag definition itself intact for other contacts. This is a targeted unlink, not a tag deletion, and requires a confirmation token to proceed. Use it to correct mislabeled contacts or move a contact out of a segment.
Search Saved Leads
Search your saved leads and contacts by name, status, tags, or company. Filter status to new, contacted, replied, or qualified, and return up to 50 results by default (max 500). Returns an empty list when no contacts match the filters.
Set Custom Field Value
Set a typed custom field value on a specific contact, for example score=90 or tier=gold. The value is validated against the field's kind, so a non-numeric value for a number field returns a validation_error. Repeat calls upsert, so writing the same field again simply updates it.
Tag a Contact
Applies a tag to a contact by name, creating the tag automatically if it does not already exist. A single call upserts the tag and links it to the contact, so you never need a separate create step. Accepts an optional hex color for new tags and returns the resulting tag_id and contact_id.
Lists
Create and manage named contact collections for campaigns
List Contact Lists
Returns all of your contact lists along with member counts, optionally including archived lists. This tool is deprecated and scheduled for removal in v6.2; use manage_lists with action='list' instead for the full list-management surface. Useful as a quick read-only snapshot of how your contacts are currently organized.
Manage Outreach Lists
Create, delete, or list outreach lists with a single action parameter. Use action='create' to spin up a new contacts, companies, or blocklist roster, action='delete' to remove one by slug, and action='list' to return every list with pagination support. Blocklist lists create a managed do-not-contact roster, keeping your segmentation and suppression organized in one place.
Update List Details
Update a list's name, description, or archived status by list ID. Set archived to true to retire a finished list or false to bring it back into rotation, and pass a new name or description to keep it current. Returns a not found error if the supplied list ID does not exist.
Update List Membership
Add or remove members from a list in bulk. For contact lists, pass contact_ids or linkedin_urls (resolved to existing contacts in your CRM); for company lists, pass company_ids or linkedin_company_ids. Cross-kind mismatches, such as adding companies to a contacts list, return a clear error so you always target the right roster.
The complete LinkedIn API. Ready when you are.
Connect your first LinkedIn profile in under 5 minutes. Every tool, every seat, no feature gates. Safe limits, warm-up, and full permission control built in.