Skip to main content
Glama
unipile-linkedin-mcp

unipile-linkedin-mcp

Unipile LinkedIn MCP Server

A fully-featured Model Context Protocol (MCP) server for the Unipile LinkedIn API. Enables AI assistants to interact with LinkedIn for search, messaging, connections, and Sales Navigator features.

Features

  • LinkedIn Search - People, companies, and posts search with Classic and Sales Navigator filters

  • Profile Management - View profiles, company pages, and your own profile

  • Connections - Send/accept/decline invitations, list connections

  • Messaging - List chats, send messages, start conversations

  • InMail - Send InMail to non-connections (Premium/Sales Navigator)

  • Sales Navigator - Advanced filters like tenure, seniority, company headcount

Related MCP server: MCP LinkedIn Sales Navigator

Installation

uvx unipile-linkedin-mcp

Using pip

pip install unipile-linkedin-mcp

Configuration

Environment Variables

Set these environment variables before running:

export UNIPILE_API_KEY="your-api-key"
export UNIPILE_BASE_URL="https://api13.unipile.com:14376/api/v1"
export UNIPILE_ACCOUNT_ID="your-account-id"

Or create a .env file in your working directory.

Claude Desktop Configuration

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "unipile-linkedin": {
      "command": "uvx",
      "args": ["unipile-linkedin-mcp"],
      "env": {
        "UNIPILE_API_KEY": "your-api-key",
        "UNIPILE_BASE_URL": "https://api13.unipile.com:14376/api/v1",
        "UNIPILE_ACCOUNT_ID": "your-account-id"
      }
    }
  }
}

Available Tools (22 total)

Tool

Description

search_people

Search people with Classic LinkedIn filters

search_people_sales_nav

Search with Sales Navigator advanced filters

search_companies

Search for companies

search_posts

Search LinkedIn posts/content

get_search_params

Get valid filter IDs (locations, industries, etc.)

Profiles

Tool

Description

list_accounts

List all connected LinkedIn accounts

get_my_profile

Get authenticated user's profile

get_profile

Get any user's full profile

get_company_profile

Get company page details

Connections

Tool

Description

send_invitation

Send connection request (max 300 char message)

list_invitations_sent

View pending outbound invites

list_invitations_received

View inbound connection requests

accept_invitation

Accept a connection request

decline_invitation

Decline a connection request

cancel_invitation

Withdraw a sent invitation

list_relations

List 1st degree connections

Messaging

Tool

Description

list_chats

List message conversations

get_chat_messages

Get messages from a chat

send_message

Send message in existing chat

start_chat

Start new conversation with connections

InMail (Premium)

Tool

Description

send_inmail

Send InMail to non-connections

get_inmail_credits

Check remaining InMail credits

Usage Examples

Search for People

# Classic LinkedIn search
search_people(keywords="software engineer", location=["103644278"], limit=10)

# Sales Navigator search with advanced filters
search_people_sales_nav(
    keywords="CTO",
    company_headcount=[{"min": 51, "max": 200}],
    changed_jobs=True,
    seniority_level=["Director", "VP"]
)

Get Search Parameter IDs

# Find location IDs
get_search_params(param_type="LOCATION", query="San Francisco")

# Find industry IDs
get_search_params(param_type="INDUSTRY", query="Software")

Send a Connection Request

send_invitation(
    provider_id="ACoAAB...",
    message="Hi! I'd love to connect."
)

Start a Conversation

# With 1st degree connection
start_chat(
    attendees_ids=["ACoAAB..."],
    text="Hello! Great connecting with you."
)

# InMail to non-connection (requires credits)
send_inmail(
    attendees_ids=["ACoAAB..."],
    subject="Quick question",
    text="Hi, I noticed your work at..."
)

Getting Unipile Credentials

  1. Sign up at Unipile

  2. Connect your LinkedIn account

  3. Get your API key and account ID from the dashboard

  4. Note your base URL (varies by region)

Rate Limits

Unipile recommends these daily limits:

  • Profile views: 80-100/day (Classic), 150/day (Sales Nav)

  • Invitations: 80-100/day (paid), 15/week (free)

  • Messages: 100-150/day

License

MIT License - see LICENSE for details.

Contributing

Contributions welcome! Please open an issue or PR on GitHub.

Available Tools

22 tools
accept_invitationA

Accept a received connection request.

Args: invitation_id: The ID of the invitation to accept (from list_invitations_received)

Returns: Confirmation of acceptance

Inputs: invitation_id (required).

cancel_invitationA

Withdraw a sent connection request that hasn't been accepted yet.

Args: invitation_id: The ID of the sent invitation to cancel (from list_invitations_sent)

Returns: Confirmation of cancellation

Inputs: invitation_id (required).

decline_invitationA

Decline a received connection request.

Args: invitation_id: The ID of the invitation to decline (from list_invitations_received)

Returns: Confirmation of decline

Inputs: invitation_id (required).

get_chat_messagesA

Get messages from a specific chat conversation.

Args: chat_id: The chat/conversation ID (from list_chats) limit: Max messages per page (default 50) cursor: Pagination cursor from previous response

Returns: List of messages in the chat with sender info and timestamps

Inputs: chat_id (required), limit, cursor.

get_company_profileA

Get a company's LinkedIn profile/page details.

Args: company_id: The LinkedIn company ID or vanity URL name

Returns: Company profile data including description, industry, size, specialties, etc.

Inputs: company_id (required).

get_inmail_creditsA

Check remaining InMail credits for the connected LinkedIn account.

InMail credits are used when messaging non-connections. Premium users get a monthly allocation that varies by subscription tier.

Returns: Current InMail credit balance and any additional quota info

Inputs: no named parameters.

get_my_profileA

Get the authenticated user's full LinkedIn profile.

Returns comprehensive profile data including name, headline, summary, experience, education, skills, and more for the currently connected account.

Inputs: no named parameters.

get_profileA

Get a LinkedIn user's full profile by their provider ID.

Args: provider_id: The LinkedIn provider ID (from search results or profile URL) sections: Optional list of sections to include. Available sections: - about - experience - education - skills - certifications - languages - volunteering_experience - projects - recommendations_received - recommendations_given If not specified, returns all available sections.

Returns: Full profile data including requested sections

Inputs: provider_id (required), sections.

get_search_paramsA

Get valid parameter IDs for search filters.

LinkedIn search filters require specific IDs (not names). Use this tool to look up the IDs for locations, industries, companies, etc.

Args: param_type: Parameter type (case-insensitive) - one of: Common parameters: - "LOCATION" - Geographic locations - "INDUSTRY" - Industry categories - "COMPANY" - Companies - "SCHOOL" - Educational institutions - "PEOPLE" - People - "CONNECTIONS" - Connections - "SERVICE" - Services - "JOB_FUNCTION" - Job functions - "JOB_TITLE" - Job titles - "EMPLOYMENT_TYPE" - Employment types - "SKILL" - Skills

    Sales Navigator specific:
    - "REGION" - Regions
    - "DEPARTMENT" - Departments
    - "PERSONA" - Personas

query: Optional search string to filter results (e.g., "San Francisco")

Returns: List of valid parameter IDs and names for the specified type

Inputs: param_type (required), query.

list_accountsA

List all connected LinkedIn accounts.

Returns information about all accounts linked to your Unipile integration, including account IDs, status, and provider information.

Inputs: no named parameters.

list_chatsA

List LinkedIn message conversations.

Args: limit: Max results per page (default 50) cursor: Pagination cursor from previous response unread_only: If True, only return chats with unread messages

Returns: List of chat conversations with latest message preview

Inputs: limit, cursor, unread_only.

list_invitations_receivedA

List inbound connection requests awaiting response.

Args: limit: Max results per page (default 50) cursor: Pagination cursor from previous response

Returns: List of pending received invitations with sender details

Inputs: limit, cursor.

list_invitations_sentA

List pending outbound connection requests.

Args: limit: Max results per page (default 50) cursor: Pagination cursor from previous response

Returns: List of pending sent invitations with recipient details

Inputs: limit, cursor.

list_relationsA

List your 1st degree connections on LinkedIn.

Args: limit: Max results per page (default 50) cursor: Pagination cursor from previous response

Returns: List of connections with profile summaries

Inputs: limit, cursor.

search_companiesA

Search for companies on LinkedIn.

Use get_search_params() to find valid IDs for industry and location filters.

Args: keywords: Company name or description keywords industry: List of industry IDs location: List of location IDs (headquarters) headcount_min: Minimum employee count headcount_max: Maximum employee count has_job_offers: True to find companies currently hiring limit: Max results per page (1-50, default 25) cursor: Pagination cursor from previous response

Returns: Search results with company profiles and pagination cursor

Inputs: keywords, industry, location, headcount_min, +4 more.

search_peopleA

Search for people on LinkedIn using Classic LinkedIn filters.

This is the standard LinkedIn search available to all users. Use get_search_params() to find valid IDs for location, industry, and company filters.

Args: keywords: Free text search (name, title, company, etc.) location: List of location IDs (use get_search_params to find IDs) industry: List of industry IDs company: List of current company IDs past_company: List of past company IDs network_distance: Connection degree [1, 2, 3] - 1=1st degree, 2=2nd degree, 3=3rd+ profile_language: ISO language codes (e.g., ["en", "fr"]) limit: Max results per page (1-50, default 25) cursor: Pagination cursor from previous response

Returns: Search results with profiles and pagination cursor

Inputs: keywords, location, industry, company, +5 more.

search_people_sales_navA

Search for people using LinkedIn Sales Navigator (requires Sales Nav subscription).

Sales Navigator provides advanced filters not available in Classic LinkedIn. Use get_search_params() to find valid IDs for filters.

Args: keywords: Free text search location: List of location IDs industry: List of industry IDs company: List of current company IDs past_company: List of past company IDs network_distance: Connection degree [1, 2, 3] profile_language: ISO language codes tenure: Years at current company, e.g., {"min": 1, "max": 5} seniority_level: Job levels (e.g., ["Director", "VP", "CXO"]) function: Job functions (e.g., ["Engineering", "Sales"]) company_headcount: Company size ranges, e.g., [{"min": 51, "max": 200}] changed_jobs: True to find people who recently changed jobs posted_on_linkedin: True to find active LinkedIn posters limit: Max results per page (1-100, default 25) cursor: Pagination cursor from previous response

Returns: Search results with profiles and pagination cursor

Inputs: keywords, location, industry, company, +11 more.

search_postsA

Search for LinkedIn posts/content.

Args: keywords: Content keywords to search for (required) sort_by: "relevance" or "date" (default: relevance) date_posted: "past_day", "past_week", or "past_month" content_type: "videos", "images", or "documents" limit: Max results per page (1-50, default 25) cursor: Pagination cursor from previous response

Returns: Search results with posts and pagination cursor

Inputs: keywords (required), sort_by, date_posted, content_type, +2 more.

send_inmailA

Send an InMail message to non-connections (requires LinkedIn Premium or Sales Navigator).

InMail allows you to message 2nd and 3rd degree connections without connecting first. Uses InMail credits - check get_inmail_credits() first.

Args: attendees_ids: List of LinkedIn provider IDs to message subject: InMail subject line (required for InMail) text: The message body content

Returns: Confirmation with sent InMail details

Inputs: attendees_ids (required), subject (required), text (required).

send_invitationA

Send a connection request to a LinkedIn user.

Note: LinkedIn limits invitation messages to 300 characters. Daily limits apply: ~80-100/day for paid accounts, ~15/week for free.

Args: provider_id: The LinkedIn provider ID of the person to connect with message: Optional personalized message (max 300 characters)

Returns: Confirmation of invitation sent or error

Inputs: provider_id (required), message.

send_messageA

Send a message in an existing chat conversation.

Use this for ongoing conversations with existing connections. For new conversations, use start_chat instead.

Args: chat_id: The chat/conversation ID (from list_chats) text: The message content to send

Returns: Confirmation with sent message details

Inputs: chat_id (required), text (required).

start_chatA

Start a new conversation with one or more LinkedIn users.

Use this to initiate messaging with 1st degree connections. For non-connections (2nd/3rd degree), use send_inmail instead.

Args: attendees_ids: List of LinkedIn provider IDs to message text: The initial message content

Returns: New chat details including chat_id for follow-up messages

Inputs: attendees_ids (required), text (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 22 tools

    Disambiguation4/5

    Most tools have distinct purposes, but there is some overlap between start_chat, send_inmail, and send_message which could cause confusion. The descriptions help differentiate them, but the boundaries between initiating a chat vs sending an InMail vs sending a message in an existing chat are not immediately clear. Similarly, search_people and search_people_sales_nav are similar but separate. Overall, good disambiguation with minor issues.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case. Names clearly indicate the action and target resource (e.g., get_profile, send_invitation, search_companies). There are no mixed conventions or ambiguous naming styles.

    Tool Count4/5

    With 22 tools, the set is comprehensive but slightly high. However, each tool serves a distinct function covering multiple areas (profiles, search, messaging, invitations, accounts). The count is appropriate for the broad scope of LinkedIn automation, though it could be trimmed slightly.

    Completeness4/5

    The tool set covers core LinkedIn workflows: profile retrieval, searching (people, companies, posts), messaging (chats, InMail, invitations), and account management. Missing features like profile updates, message deletion, or advanced filtering are minor gaps. Overall, it's sufficiently complete for common use cases.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to connect to LinkedIn, accessing profiles and companies, searching for jobs and people, managing saved jobs, updating job-search profile settings, and inspecting analytics.
      1
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to interact with LinkedIn using the official API for profile access, company management, and job postings.
      Apache 2.0