| name | linkedin-cli |
| description | Use cli-web-linkedin to interact with LinkedIn — search people/jobs/companies, view profiles and feed, post/edit/delete updates, react/unreact, comment/edit/delete comments, view notifications, manage network connections and invitations (accept/decline), read and send messages, follow/unfollow companies. Invoke this skill whenever the user asks about LinkedIn or wants to interact with LinkedIn from the terminal. Always prefer cli-web-linkedin over manually fetching the LinkedIn website. |
cli-web-linkedin
LinkedIn CLI — 26 commands across 10 groups: auth, feed, search, profile, company, jobs, post, notifications, network, messaging.
Quick Start
pip install -e linkedin/agent-harness
cli-web-linkedin auth login
cli-web-linkedin feed --json
cli-web-linkedin search people "python developer" --json
cli-web-linkedin profile me --json
Commands (26 total)
Auth (3 commands)
cli-web-linkedin auth login
cli-web-linkedin auth status --json
cli-web-linkedin auth logout
Feed (1 command)
cli-web-linkedin feed [--count N] --json
Search (4 commands)
cli-web-linkedin search all QUERY [--limit N] --json
cli-web-linkedin search people QUERY [--limit N] --json
cli-web-linkedin search jobs QUERY [--limit N] --json
cli-web-linkedin search companies QUERY [--limit N] --json
All search uses the Voyager GraphQL API directly (no browser needed).
Profile (2 commands)
cli-web-linkedin profile me --json
cli-web-linkedin profile get USERNAME --json
Company (3 commands)
cli-web-linkedin company NAME --json
cli-web-linkedin company follow COMPANY_URN --json
cli-web-linkedin company unfollow COMPANY_URN --json
Jobs (2 commands)
cli-web-linkedin jobs search QUERY [--limit N] --json
cli-web-linkedin jobs get JOB_ID --json
Post (7 commands)
cli-web-linkedin post create TEXT --json
cli-web-linkedin post edit POST_URN TEXT --json
cli-web-linkedin post delete POST_URN --json
cli-web-linkedin post react POST_URN [--type LIKE|PRAISE|EMPATHY|INTEREST|APPRECIATION|ENTERTAINMENT] --json
cli-web-linkedin post unreact POST_URN --json
cli-web-linkedin post comment POST_URN TEXT --json
cli-web-linkedin post edit-comment COMMENT_URN TEXT --json
cli-web-linkedin post delete-comment COMMENT_URN --json
Notifications (1 command)
cli-web-linkedin notifications [--limit N] --json
Network (5 commands)
cli-web-linkedin network connections [--limit N] --json
cli-web-linkedin network invitations [--limit N] --json
cli-web-linkedin network accept INVITATION_URN --json
cli-web-linkedin network decline INVITATION_URN --json
cli-web-linkedin network connect PROFILE_URN [-m MESSAGE] --json
Messaging (3 commands)
cli-web-linkedin messaging list [--limit N] --json
cli-web-linkedin messaging read CONVERSATION_URN [--limit N] --json
cli-web-linkedin messaging send RECIPIENT_URN TEXT --json
Agent Patterns
cli-web-linkedin search people "python developer" --limit 10 --json | jq '.results[].title.text'
cli-web-linkedin jobs search "software engineer" --limit 5 --json | jq '.jobs[] | {title, company}'
cli-web-linkedin jobs get 4388202530 --json | jq '{title: .data.title, desc: .data.description[:200]}'
cli-web-linkedin feed --count 5 --json
cli-web-linkedin company anthropic --json
cli-web-linkedin network connections --limit 10 --json
cli-web-linkedin network invitations --json
cli-web-linkedin network accept "urn:li:invitation:123" --json
cli-web-linkedin messaging list --json
cli-web-linkedin messaging read "urn:li:msg_conversation:123" --json
Rate Limit Warning
LinkedIn aggressively rate-limits and flags automated access. To avoid
account restrictions:
- Do NOT batch commands in tight loops (e.g.,
for user in list; do cli-web-linkedin profile get $user; done). Each subprocess invocation bypasses the built-in inter-request delay.
- Space out requests — add
sleep 3 between commands if scripting
- Limit volume — stay under ~50 profile views/day, ~150 searches/day
- Use the REPL for interactive sessions — it enforces inter-command delays automatically
- The CLI has built-in Gaussian random delays between API calls within a single session, but this does NOT protect across separate process invocations
Notes
- Auth required — run
cli-web-linkedin auth login first (browser-based LinkedIn SSO)
- Session cookie (
li_at) stored at ~/.config/cli-web-linkedin/auth.json
- Token auto-refresh: on 401/403, reloads cookies from disk, then silently refreshes via headless browser
- CSRF token derived from
JSESSIONID cookie
- PerimeterX bypassed via curl_cffi Chrome TLS impersonation (no custom User-Agent)
- Gaussian random delay between API calls within a session
- All search uses GraphQL API (no browser needed)
- All commands support
--json for structured output