linkedin-mcp
CClarity remote MCP: LinkedIn-aligned data for AI assistants — tenant profile, ICP, writing style, post performance, profile viewers, outbound engagements…
Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeCan modify data
What it can do
- Get User Context: Load the user's stored CClarity context: Profile (who they are, company, about), Writing Style (voice, phrases, guidelines), ICP (target industries, countries, departments, senioriti
- Billing: Returns the authenticated user's CClarity subscription plan and a live Stripe URL in billingActionUrl. If not subscribed, billingActionUrl is a Stripe Checkout link (promotion codes on the pa
- Update Profile: Update the user's CClarity context fields that persist across all AI sessions. Use for mid-chat updates like "add logistics to my target industries", "update my voice to be more casual
What data it sees
Do you need an account
No: the server works without sign-in
CClarity remote MCP: LinkedIn-aligned data for AI assistants — tenant profile, ICP, writing style, post performance, profile viewers, outbound engagements (reactions/comments), who engaged on your posts, connection invitations (in/out), and followers. Authenticated via OAuth 2.1; active paid subscription and LinkedIn (Unipile) connection are required before gated tools return data.
Server tool list (12)
Raw names from tools/list. Only developers need these.
| get_user_context | Load the user's stored CClarity context: Profile (who they are, company, about), Writing Style (voice, phrases, guidelines), ICP (target industries, countries, departments, seniorities, excluded companies), and Content Preferences. Call this at the start of a session when you need to answer questions like "what do you know about me?" or "who is my ideal customer?". The data comes from MongoDB (users, mossOwlUserSettings, companyExclusion). No arguments required. |
| billing | Returns the authenticated user's CClarity subscription plan and a live Stripe URL in billingActionUrl. If not subscribed, billingActionUrl is a Stripe Checkout link (promotion codes on the payment page). If subscribed, billingActionUrl is a Stripe Billing Portal link to change plan, payment method, or cancel. Use when the user asks about their plan, pricing, subscription, upgrade, downgrade, or billing. IMPORTANT: Always paste the full billingActionUrl from the tool result into your reply so the user can open it in a browser. Never refer to a link "above" or "in the portal" without including the exact URL string. |
| update_profile | Update the user's CClarity context fields that persist across all AI sessions. Use for mid-chat updates like "add logistics to my target industries", "update my voice to be more casual", or "my company is now Acme". All fields are optional — only provided fields are written. After updating, call get_user_context to see the changes. |
| get_post_performance | Return the authenticated user's own LinkedIn posts with engagement metrics (impressions, reactions, comments, shares, engagement rate) and media attachments (images, videos, documents). Use for queries like "show me my post performance this month" or "which of my posts performed best?". Posts are returned newest first. RETURN SHAPE — structuredContent.items[] rows: { id, linkedInPostId, text, postedAt (ISO), postUrl, impressions, reactions, comments, shares, views, engagementRate, attachments[], isRepost, repostedContent, originalAuthorVanityName; canonical aliases: displayName=text[:60], profileUrl=postUrl, secondaryLabel="N reactions · N comments", occurredAt=postedAt, occurredAtIsExact }. Top-level: total, vanityName, lastSyncedAt, emptyReason ("NO_DATA"|"NO_VANITY"), schemaVersion=2. |
| get_viral_post_predictor | Analyse the authenticated user's past LinkedIn posts and return user-relative performance benchmarks, viral tier classification, and content patterns for AI-driven viral prediction. Use for queries like "predict if my draft will go viral", "what makes my posts perform well", "what content patterns drive engagement for me?", or "score my draft against my history". INPUTS: draftText (optional post text to score), limit (1–50, default 30), since (ISO date for window start, default 90 days). RETURN SHAPE — structuredContent fields: baseline { medianEngagementRate, medianImpressions, analyzablePostCount, windowDays }; patterns { avgTextLengthTopQuartile, avgTextLengthAll, attachmentShare, repostWithTextShare, topWeekday }; topPerformers[] { id, linkedInPostId, textPreview, postedAt, postUrl, impressions, reactions, comments, engagementRate }; items[] { id, linkedInPostId, text, textPreview, postedAt, postUrl, impressions, reactions, comments, shares, engagementRate, isRepost, hasAttachments, viralTier (high|typical|low), vsBaselineImpressions, vsBaselineEngagementRate; canonical aliases: displayName, profileUrl, occurredAt, secondaryLabel }; analyzablePostCount, excludedRepostCount (bare reposts without any text), totalPostsInWindow, lastSyncedAt, emptyReason, predictionGuidance; draftContext { charCount, wordCount, text } — populated when draftText provided. Minimum 3 analyzable posts required for full insights. IMPORTANT: Always present baseline metrics + top performers + patterns to the user and use them to reason about whether a provided draft text is likely to be viral. |
| get_profile_viewers | Return people who recently viewed the authenticated user's LinkedIn profile. Use for queries like "who's been looking at my profile?" or "any good leads checked my profile this week?". Viewer identity only — no post info from the viewer. Cross-reference with ICP for targeting. RETURN SHAPE — structuredContent.items[] rows: { id, name, headline, vanityName, profileUrl, connectionDegree, viewedAt (ISO or null), occurredAt (ISO, coalesced), occurredAtIsExact, viewedAgo; deprecated: fullName, linkedInUrl (one-release aliases); canonical aliases: displayName=name, profileUrl=profileUrl, occurredAt=coalesced viewedAt, secondaryLabel=headline }. Top-level: total, emptyReason, schemaVersion=2. |
| get_my_activity_engagements | Return people the authenticated user has been reacting to or commenting on — i.e., warm contacts from outbound engagement. Use for queries like "who did I engage with this week?", "show me my recent reactions", or "people I've been commenting on lately". Results are grouped by person. RETURN SHAPE — structuredContent.items[] rows: { postAuthorVanityName, postAuthorName, name, profileUrl, lastInteractionAt (ISO or null), occurredAt (ISO, coalesced), occurredAtIsExact, reactionCount, commentCount, totalInteractions; deprecated: linkedInUrl (one-release alias); canonical aliases: displayName=name, profileUrl=profileUrl, occurredAt=coalesced lastInteractionAt, secondaryLabel=headline }. Top-level: total, lastSyncedAt, emptyReason, schemaVersion=2. |
| get_who_engaged | Return people who engaged with your recent LinkedIn post(s): reactions, comments, and replies. Use for questions like "who engaged?", "who commented on my latest post?", or "show warm inbound engagers this week". Results are grouped by engager and include full profile context when a Unipile profile snapshot is available (synced nightly). RETURN SHAPE — structuredContent.items[] rows: { engagerKey, name, fullName, vanityName, linkedInId, linkedInUrl, profileUrl, avatarUrl, headline, location, currentCompany, currentTitle, workExperience[] (title/company/startDate/endDate/current/location/description), profileSyncedAt (ISO or null), profileFetchError (null if ok), lastEngagedAt (ISO or null), occurredAt (ISO, coalesced), occurredAtIsExact, reactionCount, commentCount, replyCount, totalEngagements, recentActivity[]; canonical aliases: displayName=name, profileUrl=profileUrl, occurredAt=coalesced lastEngagedAt, secondaryLabel=headline }. Top-level: total (=totalEngagers), totalEngagers, totalEngagementEvents, hasMore, lastSyncedAt, emptyReason, schemaVersion=2. |
| get_my_received_invitations | Return LinkedIn connection invitations received by the authenticated user. Use for queries like "who sent me a connection request?", "any new invites this week?", "show me pending invitations". Results are ordered newest first. RETURN SHAPE — structuredContent.items[] rows: { invitationId, receivedAt (ISO), dateLabel, invitationText, inviterName, inviterPublicIdentifier, inviterDescription, inviterProfileUrl, invitedUserName; canonical aliases: displayName=inviterName, profileUrl=inviterProfileUrl, occurredAt=receivedAt, secondaryLabel=inviterDescription }. Top-level: total, hasMore, lastSyncedAt, emptyReason, schemaVersion=2. |
| get_my_sent_invitations | Return LinkedIn connection invitations sent by the authenticated user. Use for queries like "who did I invite?", "show my outgoing connection requests", "did I send a request to John?", "list my pending outbound invitations". Results are ordered newest first. RETURN SHAPE — structuredContent.items[] rows: { invitationId, sentAt (ISO), dateLabel, invitationText, inviteeName, inviteePublicIdentifier, inviteeDescription, inviteeProfileUrl; canonical aliases: displayName=inviteeName, profileUrl=inviteeProfileUrl, occurredAt=sentAt, secondaryLabel=inviteeDescription }. Top-level: total, hasMore, lastSyncedAt, emptyReason, schemaVersion=2. |
| get_my_followers | Return people who follow the authenticated user on LinkedIn. Use for queries like "who are my recent followers?", "how many new followers did I get this week?", "show me followers I gained this month", or "list my latest followers". Supports filtering by a date range to surface only newly-detected followers. Note: LinkedIn provides no per-follower timestamp — "new" means first observed by CClarity. RETURN SHAPE — structuredContent.items[] rows: { followerId, name, headline, profileUrl, username, firstSeenAt (ISO or null), occurredAt (ISO, coalesced), occurredAtIsExact, firstSeenAgo; canonical aliases: displayName=name, profileUrl=profileUrl, occurredAt=coalesced firstSeenAt, secondaryLabel=headline }. Top-level: total, totalKnown, hasMore, syncPending (bool), rangeFilter, emptyReason ("NOT_SYNCED"|"NO_DATA"), schemaVersion=2. |
| linkedin_post_publish | Publish a text post to the authenticated user's LinkedIn profile. Use when the user explicitly asks to post, publish, or share content on LinkedIn. IMPORTANT: You MUST ask the user to confirm before calling this tool — pass confirm: true only after the user has reviewed the draft and agreed to publish. Text-only posts are supported (no images/video in this version). Plain text with line breaks is accepted; max 3000 characters. A daily limit of 5 successful publishes applies. Requires an active paid CClarity subscription and a connected LinkedIn account. |