New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

@egistr/linkedin-mcp

Package Overview
Dependencies
Maintainers
1
Versions
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@egistr/linkedin-mcp

Open-source LinkedIn MCP server for AI agents (Claude Code, OpenCode, Cursor). TypeScript, official LinkedIn API, OAuth PKCE, image upload.

latest
Source
npmnpm
Version
1.0.0
Version published
Maintainers
1
Created
Source

LinkedIn MCP Server

npm version License CI Node

MCP server for LinkedIn API integration — profiles, posts, feed, and connections.

Works with Claude Desktop, Cursor, Windsurf, Claude Code, OpenCode, and any MCP-compatible client.

Features

ToolDescriptionScope Required
linkedin_get_user_infoGet OpenID Connect user infoopenid
linkedin_get_my_profileGet full LinkedIn profileopenid + r_liteprofile
linkedin_create_postPublish a LinkedIn postw_member_social
linkedin_list_postsList your/others' postsr_member_social
linkedin_delete_postDelete a LinkedIn postw_member_social
linkedin_get_feedGet your feed activityr_member_social
linkedin_get_connectionsGet your connectionsPartner API
linkedin_send_messageSend a direct messagePartner API
linkedin_search_peopleSearch LinkedIn membersPartner API
linkedin_oauth_loginOAuth PKCE login flow—

Quick Start

# Install from npm (recommended)
npx @eggisatriadev/linkedin-mcp

# Or install locally
npm install @eggisatriadev/linkedin-mcp

# Set your access token
export LINKEDIN_ACCESS_TOKEN=AQX_your_token_here

# Run the server
npx @eggisatriadev/linkedin-mcp

For Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "npx",
      "args": ["-y", "@eggisatriadev/linkedin-mcp"],
      "env": {
        "LINKEDIN_ACCESS_TOKEN": "AQX_your_token_here"
      }
    }
  }
}

For OpenCode

Add to your opencode.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "npx",
      "args": ["-y", "@eggisatriadev/linkedin-mcp"],
      "env": {
        "LINKEDIN_ACCESS_TOKEN": "AQX_your_token_here"
      }
    }
  }
}

Setup

1. Create a LinkedIn Developer App

  • Go to https://www.linkedin.com/developers/apps
  • Create a new app
  • Add products:
    • Sign In with LinkedIn using OpenID Connect (auto-approved)
    • Share on LinkedIn (for posting capabilities)
  • Note your Client ID and Client Secret
  • Add http://localhost:8080 as an OAuth redirect URL

2. Generate Access Token

The easiest way is to use the OAuth 2.0 token generator in the LinkedIn Developer Portal:

  • Go to your app → Auth tab
  • In OAuth 2.0 settings, find the access token section
  • Select scopes: openid, profile, email, w_member_social
  • Generate and copy the token

3. Run the Server

# Install dependencies
npm install

# Set your token
export LINKEDIN_ACCESS_TOKEN=AQX_your_token_here

# Build and run
npm run build
npm start

4. Connect to Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/linkedin-mcp-server/dist/index.js"],
      "env": {
        "LINKEDIN_ACCESS_TOKEN": "AQX_your_token_here"
      }
    }
  }
}

5. Connect to OpenCode

Add to your opencode.json (or use the MCP config):

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/linkedin-mcp-server/dist/index.js"],
      "env": {
        "LINKEDIN_ACCESS_TOKEN": "AQX_your_token_here"
      }
    }
  }
}

OAuth PKCE Login (No Token Required)

Skip step 2 — let the server handle authentication interactively:

# Required: set your LinkedIn app credentials
export LINKEDIN_CLIENT_ID=your_client_id
export LINKEDIN_CLIENT_SECRET=your_client_secret

# Run the server (it will detect no token and guide you)
npm run build
npm start

# Or from npm package:
npx @eggisatriadev/linkedin-mcp

Then call the linkedin_oauth_login tool from your MCP client:

  • port (optional): Callback server port (default: 8080)
  • open_browser (optional): Auto-open browser (default: true)
  • timeout (optional): Max wait in ms (default: 120000)

The flow:

  • Server starts a local HTTP server on port 8080
  • Opens your browser to LinkedIn's authorization page
  • You approve the request
  • LinkedIn redirects to localhost — server captures the code
  • Server exchanges the code for an access token via PKCE S256
  • Token is saved to ~/.config/linkedin-mcp/config.json
  • All tools immediately work without further setup

Media Upload

LinkedIn supports image upload via a 3-step /rest/images flow:

  • Initialize: POST /rest/images?action=initializeUpload → returns uploadUrl + image URN
  • Upload binary: PUT {uploadUrl} with image data
  • Attach to post: Use the image URN as media.id in createPost()

Supported formats: JPEG, PNG, GIF (static) Max file size: 10 MB Recommended dimensions: 2048×2048px

Image upload happens automatically when you pass a media_url parameter to linkedin_create_post. The MediaUploader handles retries on expired upload URLs and validates format/size before uploading.

Development

# Watch mode (auto-reload)
npm run dev

# Build
npm run build

# Test with MCP Inspector
npm run inspector

Architecture

The server follows a layered architecture with four bounded contexts:

linkedin-mcp-server/
├── src/
│   ├── index.ts                 # Entry point: server init, tool registration, health check
│   ├── types.ts                 # Shared types and enums
│   ├── services/
│   │   └── linkedin-client.ts   # LinkedIn API client (14+ methods, error classification)
│   ├── tools/
│   │   ├── profile.ts           # Profile tools: getMyProfile, getUserInfo
│   │   ├── posts.ts             # Posts tools: createPost, listPosts, deletePost
│   │   ├── network.ts           # Network tools: getFeed, getConnections, sendMessage, searchPeople
│   │   └── auth.ts              # Auth tool: oauthLogin
│   ├── auth/
│   │   ├── oauth.ts             # PKCE OAuth 2.0 flow (RFC 7636)
│   │   ├── config.ts            # Config file management
│   │   └── token-store.ts       # Token persistence (env var → config file fallback)
│   └── media/
│       └── uploader.ts          # 3-step image upload: init → binary → URN
├── tests/
│   ├── linkedin-client.test.ts
│   ├── tools/
│   ├── auth/
│   └── media/
├── docs/
│   └── pocket/arch/*/tech-design.md   # Full technical design document
├── package.json
├── tsconfig.json
└── README.md

Token Resolution Chain

  • LINKEDIN_ACCESS_TOKEN env var (highest priority)
  • ~/.config/linkedin-mcp/config.json (persistent local token)
  • OAuth PKCE flow (if LINKEDIN_CLIENT_ID + LINKEDIN_CLIENT_SECRET are set)

See tech-design.md for the full architecture, API contracts, data flow diagrams, and ADRs.

Contributing

We welcome contributions! See CONTRIBUTING.md for:

  • Bug reports & feature requests (GitHub Issues)
  • Development setup guide
  • Coding standards & test requirements
  • Pull request guidelines

This project adheres to a Code of Conduct.

Limitations

  • Connections API: Requires LinkedIn Partner Program (not available on free tier)
  • People Search: Not available via public API (needs Sales Navigator)
  • Messaging API: Requires LinkedIn Messaging API (partner program)
  • Feed: Limited by API restrictions
  • Rate Limits: 100-500 requests/day per app on free tier

License

MIT — see LICENSE for details.

Keywords

linkedin

FAQs

Package last updated on 13 Jul 2026

Related posts