Awesome-omni-skills linkedin-cli
LinkedIn Skill workflow skill. Use this skill when the user needs automating LinkedIn via CLI: fetch profiles, search people/companies, send messages, manage connections, create posts, and Sales Navigator and the operator should preserve the upstream workflow, copied support files, and provenance before merging or handing off.
git clone https://github.com/diegosouzapw/awesome-omni-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/linkedin-cli" ~/.claude/skills/diegosouzapw-awesome-omni-skills-linkedin-cli && rm -rf "$T"
skills/linkedin-cli/SKILL.mdLinkedIn Skill
Overview
This public intake copy packages
plugins/antigravity-awesome-skills-claude/skills/linkedin-cli from https://github.com/sickn33/antigravity-awesome-skills into the native Omni Skills editorial shape without hiding its origin.
Use it when the operator needs the upstream workflow, support files, and repository context to stay intact while the public validator and private enhancer continue their normal downstream flow.
This intake keeps the copied upstream files intact and uses
metadata.json plus ORIGIN.md as the provenance anchor for review.
Imported source sections that did not map cleanly to the public headings are still preserved below or in the support files. Notable imported sections: Authentication, Global Flags, Output Format, Important Behavior, Limitations.
When to Use This Skill
Use this section as the trigger filter. It should make the activation boundary explicit before the operator loads files, runs commands, or opens a pull request.
- Building outreach, research, or recruiting workflows that rely on LinkedIn data and messaging.
- Enriching leads or accounts by fetching people and company profiles in bulk.
- Coordinating multi-step Sales Navigator or workflow runs where JSON output and exit codes are required.
- Use when provenance needs to stay visible in the answer, PR, or review packet.
- Use when copied upstream references, examples, or scripts materially improve the answer.
- Use when the workflow should remain reviewable in the public intake repo before the private enhancer takes over.
Operating Table
| Situation | Start here | Why it matters |
|---|---|---|
| First-time use | | Confirms repository, branch, commit, and imported path before touching the copied workflow |
| Provenance review | | Gives reviewers a plain-language audit trail for the imported source |
| Workflow execution | | Starts with the smallest copied file that materially changes execution |
| Supporting context | | Adds the next most relevant copied source file without loading the entire package |
| Handoff decision | | Helps the operator switch to a stronger native skill when the task drifts |
Workflow
This workflow is intentionally editorial and operational at the same time. It keeps the imported source useful to the operator while still satisfying the public intake standards that feed the downstream enhancer flow.
- Confirm the user goal, the scope of the imported workflow, and whether this skill is still the right router for the task.
- Read the overview and provenance files before loading any copied upstream support files.
- Load only the references, examples, prompts, or scripts that materially change the outcome for the current request.
- Execute the upstream workflow while keeping provenance and source boundaries explicit in the working notes.
- Validate the result against the upstream expectations and the evidence you can point to in the copied files.
- Escalate or hand off to a related skill when the work moves out of this imported workflow's center of gravity.
- Before merge or closure, record what was used, what changed, and what the reviewer still needs to verify.
Imported Workflow Notes
Imported: Authentication
If a command fails with exit code 2 (authentication error), ask the user to set up their account:
- Go to app.linkedapi.io and sign up or log in
- Connect their LinkedIn account
- Copy the Linked API Token and Identification Token from the dashboard
Once the user provides the tokens, run:
linkedin setup --linked-api-token=TOKEN --identification-token=TOKEN
Examples
Example 1: Ask for the upstream workflow directly
Use @linkedin-cli to handle <task>. Start from the copied upstream workflow, load only the files that change the outcome, and keep provenance visible in the answer.
Explanation: This is the safest starting point when the operator needs the imported workflow, but not the entire repository.
Example 2: Ask for a provenance-grounded review
Review @linkedin-cli against metadata.json and ORIGIN.md, then explain which copied upstream files you would load first and why.
Explanation: Use this before review or troubleshooting when you need a precise, auditable explanation of origin and file selection.
Example 3: Narrow the copied support files before execution
Use @linkedin-cli for <task>. Load only the copied references, examples, or scripts that change the outcome, and name the files explicitly before proceeding.
Explanation: This keeps the skill aligned with progressive disclosure instead of loading the whole copied package by default.
Example 4: Build a reviewer packet
Review @linkedin-cli using the copied upstream files plus provenance, then summarize any gaps before merge.
Explanation: This is useful when the PR is waiting for human review and you want a repeatable audit packet.
Imported Usage Notes
Imported: Commands
Fetch a Person Profile
linkedin person fetch <url> [flags] --json -q
Optional flags to include additional data:
– work history--experience
– education history--education
– skills list--skills
– languages--languages
– recent posts (with--posts
,--posts-limit N
)--posts-since TIMESTAMP
– recent comments (with--comments
,--comments-limit N
)--comments-since TIMESTAMP
– recent reactions (with--reactions
,--reactions-limit N
)--reactions-since TIMESTAMP
Only request additional data when needed – each flag increases execution time.
# Basic profile linkedin person fetch https://www.linkedin.com/in/username --json -q # With experience and education linkedin person fetch https://www.linkedin.com/in/username --experience --education --json -q # With last 5 posts linkedin person fetch https://www.linkedin.com/in/username --posts --posts-limit 5 --json -q
Search People
linkedin person search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword or phrase |
| Max results |
| Filter by first name |
| Filter by last name |
| Filter by job position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated current company names |
| Comma-separated previous company names |
| Comma-separated school names |
linkedin person search --term "product manager" --locations "San Francisco" --json -q linkedin person search --current-companies "Google" --position "Engineer" --limit 20 --json -q
Fetch a Company
linkedin company fetch <url> [flags] --json -q
Optional flags:
– include employees--employees
– include decision makers--dms
– include company posts--posts
Employee filters (require
--employees):
| Flag | Description |
|---|---|
| Max employees to retrieve |
| Filter by first name |
| Filter by last name |
| Filter by position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated school names |
| Flag | Description |
|---|---|
| Max decision makers to retrieve (requires ) |
| Max posts to retrieve (requires ) |
| Posts since ISO timestamp (requires ) |
# Basic company info linkedin company fetch https://www.linkedin.com/company/name --json -q # With employees filtered by position linkedin company fetch https://www.linkedin.com/company/name --employees --employees-position "Engineer" --json -q # With decision makers and posts linkedin company fetch https://www.linkedin.com/company/name --dms --posts --posts-limit 10 --json -q
Search Companies
linkedin company search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword |
| Max results |
| Comma-separated sizes: , , , , , , , |
| Comma-separated locations |
| Comma-separated industries |
linkedin company search --term "fintech" --sizes "11-50,51-200" --json -q
Send a Message
linkedin message send <person-url> '<text>' --json -q
Text up to 1900 characters. Wrap the message in single quotes to avoid shell interpretation issues.
linkedin message send https://www.linkedin.com/in/username 'Hey, loved your latest post!' --json -q
Get Conversation
linkedin message get <person-url> [--since TIMESTAMP] --json -q
The first call for a conversation triggers a background sync and may take longer. Subsequent calls are faster.
linkedin message get https://www.linkedin.com/in/username --json -q linkedin message get https://www.linkedin.com/in/username --since 2024-01-15T10:30:00Z --json -q
Connection Management
Check connection status
linkedin connection status <url> --json -q
Send connection request
linkedin connection send <url> [--note 'text'] [--email user@example.com] --json -q
List connections
linkedin connection list [flags] --json -q
| Flag | Description |
|---|---|
| Max connections to return |
| Only connections made since ISO timestamp (only works when no filter flags are used) |
| Filter by first name |
| Filter by last name |
| Filter by job position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated current company names |
| Comma-separated previous company names |
| Comma-separated school names |
linkedin connection list --limit 50 --json -q linkedin connection list --current-companies "Google" --position "Engineer" --json -q linkedin connection list --since 2024-01-01T00:00:00Z --json -q
List pending outgoing requests
linkedin connection pending --json -q
Withdraw a pending request
linkedin connection withdraw <url> [--no-unfollow] --json -q
By default, withdrawing also unfollows the person. Use
--no-unfollow to keep following.
Remove a connection
linkedin connection remove <url> --json -q
Posts
Fetch a post
linkedin post fetch <url> [flags] --json -q
| Flag | Description |
|---|---|
| Include comments |
| Include reactions |
| Max comments to retrieve (requires ) |
| Sort order: or (requires ) |
| Include replies to comments (requires ) |
| Max reactions to retrieve (requires ) |
linkedin post fetch https://www.linkedin.com/posts/username_activity-123 --json -q # With comments sorted by most recent, including replies linkedin post fetch https://www.linkedin.com/posts/username_activity-123 \ --comments --comments-sort mostRecent --comments-replies --json -q
Create a post
linkedin post create '<text>' [flags] --json -q
| Flag | Description |
|---|---|
| Post on behalf of a company page (requires admin access) |
| Attachment as or . Types: , , . Can be specified multiple times. |
Attachment limits: up to 9 images, or 1 video, or 1 document. Cannot mix types.
linkedin post create 'Excited to share our latest update!' --json -q # With a document linkedin post create 'Our Q4 report' \ --attachments "https://example.com/report.pdf:document:Q4 Report" --json -q # Post as a company linkedin post create 'Company announcement' \ --company-url https://www.linkedin.com/company/name --json -q
React to a post
linkedin post react <url> --type <reaction> [--company-url <url>] --json -q
Reaction types:
like, love, support, celebrate, insightful, funny.
linkedin post react https://www.linkedin.com/posts/username_activity-123 --type like --json -q # React on behalf of a company linkedin post react https://www.linkedin.com/posts/username_activity-123 --type celebrate \ --company-url https://www.linkedin.com/company/name --json -q
Comment on a post
linkedin post comment <url> '<text>' [--company-url <url>] --json -q
Text up to 1000 characters.
linkedin post comment https://www.linkedin.com/posts/username_activity-123 'Great insights!' --json -q # Comment on behalf of a company linkedin post comment https://www.linkedin.com/posts/username_activity-123 'Well said!' \ --company-url https://www.linkedin.com/company/name --json -q
Statistics
# Social Selling Index linkedin stats ssi --json -q # Performance analytics (profile views, post impressions, search appearances) linkedin stats performance --json -q # API usage for a date range linkedin stats usage --start 2024-01-01T00:00:00Z --end 2024-01-31T00:00:00Z --json -q
Sales Navigator
Requires a LinkedIn Sales Navigator subscription. Uses hashed URLs for person/company lookups.
Fetch person
linkedin navigator person fetch <hashed-url> --json -q
Search people
linkedin navigator person search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword or phrase |
| Max results |
| Filter by first name |
| Filter by last name |
| Filter by job position |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated current company names |
| Comma-separated previous company names |
| Comma-separated school names |
| Comma-separated ranges: , , , , |
linkedin navigator person search --term "VP Marketing" --locations "United States" --json -q linkedin navigator person search --years-of-experience "moreThanTen" --position "CEO" --json -q
Fetch company
linkedin navigator company fetch <hashed-url> [flags] --json -q
Optional flags:
– include employees--employees
– include decision makers--dms
Employee filters (require
--employees):
| Flag | Description |
|---|---|
| Max employees to retrieve |
| Filter by first name |
| Filter by last name |
| Comma-separated positions |
| Comma-separated locations |
| Comma-separated industries |
| Comma-separated school names |
| Comma-separated experience ranges |
| Max decision makers to retrieve (requires ) |
linkedin navigator company fetch https://www.linkedin.com/sales/company/97ural --employees --dms --json -q linkedin navigator company fetch https://www.linkedin.com/sales/company/97ural \ --employees --employees-positions "Engineer,Designer" --employees-locations "Europe" --json -q
Search companies
linkedin navigator company search [flags] --json -q
| Flag | Description |
|---|---|
| Search keyword |
| Max results |
| Comma-separated sizes: , , , , , , , |
| Comma-separated locations |
| Comma-separated industries |
| Min annual revenue in M USD: , , , , , , , , , , |
| Max annual revenue in M USD: , , , , , , , , , , |
linkedin navigator company search --term "fintech" --sizes "11-50,51-200" --json -q linkedin navigator company search --revenue-min 10 --revenue-max 100 --locations "United States" --json -q
Send InMail
linkedin navigator message send <person-url> '<text>' --subject '<subject>' --json -q
Text up to 1900 characters. Subject up to 80 characters.
linkedin navigator message send https://www.linkedin.com/in/username \ 'Would love to chat about API integrations' --subject 'Partnership Opportunity' --json -q
Get Sales Navigator conversation
linkedin navigator message get <person-url> [--since TIMESTAMP] --json -q
Custom Workflows
Execute a custom workflow definition from a file, stdin, or inline:
# From file linkedin workflow run --file workflow.json --json -q # From stdin cat workflow.json | linkedin workflow run --json -q # Inline echo '{"actions":[...]}' | linkedin workflow run --json -q
Check workflow status or wait for completion:
linkedin workflow status <id> --json -q linkedin workflow status <id> --wait --json -q
See Building Workflows for the workflow JSON schema.
Account Management
linkedin account list # List accounts (* = active) linkedin account switch "Name" # Switch active account linkedin account rename "Name" --name "New Name" # Rename account linkedin reset # Remove active account linkedin reset --all # Remove all accounts
Best Practices
Treat the generated public skill as a reviewable packaging layer around the upstream repository. The goal is to keep provenance explicit and load only the copied source material that materially improves execution.
- Keep the imported skill grounded in the upstream repository; do not invent steps that the source material cannot support.
- Prefer the smallest useful set of support files so the workflow stays auditable and fast to review.
- Keep provenance, source commit, and imported file paths visible in notes and PR descriptions.
- Point directly at the copied upstream files that justify the workflow instead of relying on generic review boilerplate.
- Treat generated examples as scaffolding; adapt them to the concrete task before execution.
- Route to a stronger native skill when architecture, debugging, design, or security concerns become dominant.
Troubleshooting
Problem: The operator skipped the imported context and answered too generically
Symptoms: The result ignores the upstream workflow in
plugins/antigravity-awesome-skills-claude/skills/linkedin-cli, fails to mention provenance, or does not use any copied source files at all.
Solution: Re-open metadata.json, ORIGIN.md, and the most relevant copied upstream files. Load only the files that materially change the answer, then restate the provenance before continuing.
Problem: The imported workflow feels incomplete during review
Symptoms: Reviewers can see the generated
SKILL.md, but they cannot quickly tell which references, examples, or scripts matter for the current task.
Solution: Point at the exact copied references, examples, scripts, or assets that justify the path you took. If the gap is still real, record it in the PR instead of hiding it.
Problem: The task drifted into a different specialization
Symptoms: The imported skill starts in the right place, but the work turns into debugging, architecture, design, security, or release orchestration that a native skill handles better. Solution: Use the related skills section to hand off deliberately. Keep the imported provenance visible so the next skill inherits the right context instead of starting blind.
Related Skills
- Use when the work is better handled by that native specialization after this imported skill establishes context.@linear-claude-skill
- Use when the work is better handled by that native specialization after this imported skill establishes context.@linkedin-automation
- Use when the work is better handled by that native specialization after this imported skill establishes context.@linkedin-profile-optimizer
- Use when the work is better handled by that native specialization after this imported skill establishes context.@lint-and-validate
Additional Resources
Use this support matrix and the linked files below as the operator packet for this imported skill. They should reflect real copied source material, not generic scaffolding.
| Resource family | What it gives the reviewer | Example path |
|---|---|---|
| copied reference notes, guides, or background material from upstream | |
| worked examples or reusable prompts copied from upstream | |
| upstream helper scripts that change execution or validation | |
| routing or delegation notes that are genuinely part of the imported package | |
| supporting assets or schemas copied from the source package | |
Imported Reference Notes
Imported: Global Flags
Always use
--json and -q for machine-readable output:
linkedin <command> --json -q
| Flag | Description |
|---|---|
| Structured JSON output |
/ | Suppress stderr progress messages |
| Select specific fields in output |
| Disable colors |
| Use a specific account for this command |
Imported: Output Format
Success:
{ "success": true, "data": { "name": "John Doe", "headline": "Engineer" } }
Error:
{ "success": false, "error": { "type": "personNotFound", "message": "Person not found" } }
Exit code 0 means the API call succeeded – always check the
success field for the action outcome. Non-zero exit codes indicate infrastructure errors:
| Exit Code | Meaning |
|---|---|
| 0 | Success (check field – action may have returned an error like "person not found") |
| 1 | General/unexpected error |
| 2 | Missing or invalid tokens |
| 3 | Subscription/plan required |
| 4 | LinkedIn account issue |
| 5 | Invalid arguments |
| 6 | Rate limited |
| 7 | Network error |
| 8 | Workflow timeout (workflowId returned for recovery) |
Imported: Important Behavior
- Sequential execution. All operations for an account run one at a time. Multiple requests queue up.
- Not instant. A real browser navigates LinkedIn – expect 30 seconds to several minutes per operation.
- Timestamps in UTC. All dates and times are in UTC.
- Single quotes for text arguments. Use single quotes around message text, post text, and comments to avoid shell interpretation issues with special characters.
- Action limits. Per-account limits are configurable on the platform. A
error means the limit was reached.limitExceeded - URL normalization. All LinkedIn URLs in responses are normalized to
format without trailing slashes.https://www.linkedin.com/... - Null fields. Fields that are unavailable are returned as
ornull
, not omitted.[]
Imported: Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.