Interact with LinkedIn — view your profile, browse other profiles, read the feed, search jobs/posts/people, get job details, create posts, like/unlike posts, comment, send connection requests, and follow/unfollow users. Use this skill whenever the user mentions LinkedIn, wants to search for jobs or people, read their LinkedIn feed, view a profile, get job details, create a post, like or comment on content, send a connection request, or follow someone. Also trigger when the user pastes a LinkedIn URL (e.g. linkedin.com/in/..., linkedin.com/jobs/view/...) or mentions LinkedIn networking.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the LinkedIn skill
What this skill tells your AI
The instructions your AI receives, as published by sigcli/sigcli in skills/linkedin/SKILL.md and read by ahel’s review.
View profiles, browse the feed, search jobs/posts/people, get job details, create posts, like/unlike, comment, send connections, and follow/unfollow on LinkedIn.
Skill Directory
<SKILL_DIR> is the directory containing this SKILL.md file. Determine it ONCE at the start and reuse it.
Setup (run FIRST — every time, before any operation)
You MUST complete this setup before running any script. Do NOT skip this step.
sig status linkedin 2>&1
Check the JSON output fields configured and valid:
configured: false→ run Provider Setup below. Do NOT proceed without completing it.valid: false(but configured: true) → runsig login linkedin, then re-check.valid: true→ detect proxy (see below), then execute the user's request.
Provider Setup
- Read
<SKILL_DIR>/references/provider-config.yaml - Append the provider block to
~/.sig/config.yamlunderproviders: - Ask the user: "Do you need a proxy to access this site?" — if yes, add
networkProxy: <url>under the provider in config.yaml - Run
sig login linkedin(with--network-proxy <url>if proxy was specified) - Verify: run
sig status linkedinagain — must showvalid: truebefore proceeding
Proxy Detection (after provider is valid)
grep -A15 "^\s*linkedin:" ~/.sig/config.yaml | grep networkProxy | awk '{print $2}'
If this outputs a URL, prefix ALL python3 commands with HTTPS_PROXY=<url> HTTP_PROXY=<url>.
If using socks5, convert to socks5h for python (e.g. socks5://... → socks5h://...).
If empty, no proxy needed.
Running Scripts
All scripts require setup to be completed first (see above).
Scripts Reference
All scripts are in this skill's scripts/ directory. Run via Bash tool.
Read Operations
| Script | Purpose | Auth |
|---|---|---|
linkedin_me.py | Current user profile | Required |
linkedin_profile.py | User profile by name | Required |
linkedin_feed.py | Home feed posts | Required |
linkedin_search_jobs.py | Search job listings | Required |
linkedin_search_posts.py | Search posts | Required |
linkedin_search_people.py | Search people | Required |
linkedin_job.py | Job posting details | Required |
Write Operations
| Script | Purpose | Auth |
|---|---|---|
linkedin_post.py | Create a post | Required |
linkedin_like.py | Like/unlike a post | Required |
linkedin_comment.py | Comment on a post | Required |
linkedin_connect.py | Send connection request | Required |
linkedin_follow.py | Follow/unfollow a user | Required |
linkedin_me.py
--cookie COOKIE LinkedIn session cookie (optional, uses SIG_LINKEDIN_COOKIE)
linkedin_profile.py
--username TEXT LinkedIn username or profile URL (required)
--cookie COOKIE LinkedIn session cookie (optional)
linkedin_feed.py
--limit N Max posts (default: 10)
--cookie COOKIE LinkedIn session cookie (optional)
linkedin_search_jobs.py
--query TEXT Job search keywords (required)
--location TEXT Location filter (optional)
--limit N Max results (default: 10)
--start N Offset for pagination (default: 0)
--experience TEXT Experience level codes (comma-sep: 1=intern,2=entry,3=assoc,4=mid,5=dir,6=exec)
--job-type TEXT Job type codes (F=full,P=part,C=contract,T=temp,V=volunteer,I=intern)
--date-posted TEXT Date filter (r86400=24h, r604800=week, r2592000=month)
--remote TEXT Workplace type (1=onsite, 2=remote, 3=hybrid)
--cookie COOKIE LinkedIn session cookie (optional)
linkedin_search_posts.py
--query TEXT Search keywords (required)
--limit N Max results (default: 10)
--cookie COOKIE LinkedIn session cookie (optional)
linkedin_search_people.py
--query TEXT Search keywords (required)
--limit N Max results (default: 10)
--start N Offset for pagination (default: 0)
--cookie COOKIE LinkedIn session cookie (optional)
linkedin_job.py
--id TEXT Job ID or LinkedIn job URL (required)
--cookie COOKIE LinkedIn session cookie (optional)
linkedin_post.py
--cookie COOKIE LinkedIn session cookie (required)
--text TEXT Post text content (required)
linkedin_like.py
--cookie COOKIE LinkedIn session cookie (required)
--urn TEXT Post URN, e.g. urn:li:activity:1234567890 (required)
--undo Unlike instead of like
linkedin_comment.py
--cookie COOKIE LinkedIn session cookie (required)
--urn TEXT Post URN to comment on (required)
--text TEXT Comment text (required)
linkedin_connect.py
--cookie COOKIE LinkedIn session cookie (required)
--urn TEXT Profile URN, e.g. urn:li:fsd_profile:ACoAA... (required)
--message TEXT Custom connection message (optional)
linkedin_follow.py
--cookie COOKIE LinkedIn session cookie (required)
--urn TEXT User URN, e.g. urn:li:fsd_profile:ACoAA... (required)
--undo Unfollow instead of follow
Safety
LinkedIn is a professional network. Actions taken here are visible to your professional contacts and can affect your reputation. Always confirm with the user before executing write operations:
- Creating posts — confirm the text content before publishing
- Sending connection requests — confirm the target person and optional message
- Commenting on posts — confirm the comment text before posting
- Liking/unliking — these are reversible (
--undo), but still confirm first - Following/unfollowing — these are reversible (
--undo), but still confirm first
Key Concepts
Profile identifiers — linkedin_profile.py accepts a LinkedIn username (janedoe), a full profile URL (https://www.linkedin.com/in/janedoe), or an @-prefixed handle. URLs are resolved automatically.
Job identifiers — linkedin_job.py accepts a numeric job ID (12345678) or a full LinkedIn job URL (https://www.linkedin.com/jobs/view/12345678). The ID is extracted automatically.
URNs — Write operations (like, comment, connect, follow) use LinkedIn URN identifiers. Post URNs look like urn:li:activity:7100000000000000001. Profile URNs look like urn:li:fsd_profile:ACoAAA123456. You can find these in the output of read operations.
Voyager API — All operations use LinkedIn's internal Voyager API (/voyager/api/), which is the same API the LinkedIn website uses. Authentication is via JSESSIONID CSRF token and li_at session cookie.
Post search — linkedin_search_posts.py parses RSC-embedded HTML from the search results page rather than a JSON API. Results may be less structured than other endpoints.
Known Limitations
- Rate limiting — LinkedIn aggressively rate-limits API calls. The client retries once on HTTP 429 with the
Retry-Afterdelay, but sustained heavy usage may result in temporary blocks. - Search post parsing — Post search relies on HTML scraping of RSC payloads, which may break if LinkedIn changes their frontend markup.
- No pagination for feed — The feed endpoint returns a single page of results up to the limit.
- Connection requests — Require the target's profile URN, not their username. Use
linkedin_search_people.pyorlinkedin_profile.pyto find URNs first. - Session expiry — LinkedIn sessions typically last 30 days but may expire sooner if LinkedIn detects unusual activity.
- No media uploads —
linkedin_post.pycreates text-only posts. Image/video posts are not supported.
Error Handling
| Error | Cause | Fix |
|---|---|---|
| AUTH_REQUIRED | No cookie or missing JSESSIONID | Auto-run sig login (no user prompt needed), retry |
| AUTH_EXPIRED | Session cookie expired (401) | Auto-run sig login (no user prompt needed), retry |
| NOT_FOUND | Profile or resource not found | Check the username or ID is correct |
| HTTP_429 | Rate limited by LinkedIn | Wait and retry; reduce request frequency |
| HTTP_403 | Forbidden or restricted | Check account status; may need re-login |
Workflow Examples
View your own profile
sig run linkedin -- bash -c 'python3 scripts/linkedin_me.py --cookie "$SIG_LINKEDIN_COOKIE"'
Look up someone's profile
sig run linkedin -- bash -c 'python3 scripts/linkedin_profile.py --cookie "$SIG_LINKEDIN_COOKIE" --username janedoe'- Or with URL:
sig run linkedin -- bash -c 'python3 scripts/linkedin_profile.py --cookie "$SIG_LINKEDIN_COOKIE" --username "https://www.linkedin.com/in/janedoe"'
Browse your feed
sig run linkedin -- bash -c 'python3 scripts/linkedin_feed.py --cookie "$SIG_LINKEDIN_COOKIE" --limit 5'
Search for jobs
sig run linkedin -- bash -c 'python3 scripts/linkedin_search_jobs.py --cookie "$SIG_LINKEDIN_COOKIE" --query "python developer" --location "San Francisco" --limit 10'- With filters:
sig run linkedin -- bash -c 'python3 scripts/linkedin_search_jobs.py --cookie "$SIG_LINKEDIN_COOKIE" --query "data engineer" --remote 2 --experience 4'
Search for posts
sig run linkedin -- bash -c 'python3 scripts/linkedin_search_posts.py --cookie "$SIG_LINKEDIN_COOKIE" --query "machine learning" --limit 5'
Search for people
sig run linkedin -- bash -c 'python3 scripts/linkedin_search_people.py --cookie "$SIG_LINKEDIN_COOKIE" --query "software engineer at google" --limit 10'
Get job details
sig run linkedin -- bash -c 'python3 scripts/linkedin_job.py --cookie "$SIG_LINKEDIN_COOKIE" --id 12345678'- Or with URL:
sig run linkedin -- bash -c 'python3 scripts/linkedin_job.py --cookie "$SIG_LINKEDIN_COOKIE" --id "https://www.linkedin.com/jobs/view/12345678"'
Create a post
sig run linkedin -- bash -c 'python3 scripts/linkedin_post.py --cookie "$SIG_LINKEDIN_COOKIE" --text "Excited to share my latest project!"'
Like a post
sig run linkedin -- bash -c 'python3 scripts/linkedin_like.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:activity:7100000000000000001"'
Unlike a post
sig run linkedin -- bash -c 'python3 scripts/linkedin_like.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:activity:7100000000000000001" --undo'
Comment on a post
sig run linkedin -- bash -c 'python3 scripts/linkedin_comment.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:activity:7100000000000000001" --text "Great insight!"'
Send a connection request
sig run linkedin -- bash -c 'python3 scripts/linkedin_connect.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:fsd_profile:ACoAAA123456"'- With message:
sig run linkedin -- bash -c 'python3 scripts/linkedin_connect.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:fsd_profile:ACoAAA123456" --message "Hi, I enjoyed your talk!"'
Follow a user
sig run linkedin -- bash -c 'python3 scripts/linkedin_follow.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:fsd_profile:ACoAAA123456"'
Unfollow a user
sig run linkedin -- bash -c 'python3 scripts/linkedin_follow.py --cookie "$SIG_LINKEDIN_COOKIE" --urn "urn:li:fsd_profile:ACoAAA123456" --undo'
Signals
- GitHub stars
- 290
- Forks
- 24
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
linkedin-sigcli- Source
- github.com/sigcli/sigcli