| name | linkedin |
| description | Manage a LinkedIn company page — publish posts with consistent brand voice, grow engagement, respond to comments, analyze performance, preview profiles, and aggregate engagement for the monday dispatcher. Maintains a knowledge base of content ideas, audience insights, and brand guidelines. Use when the user wants to publish a LinkedIn post, draft LinkedIn content, check LinkedIn comments, respond to engagement, plan content strategy, review brand voice, view a LinkedIn profile, or manage a company page. Activate on mentions of LinkedIn, LinkedIn post, company page, social media, content calendar, engagement, brand voice, or audience growth. |
| allowed-tools | bash |
LinkedIn Company Page Management
Complete LinkedIn presence management for any company page.
Combines API automation with content strategy, brand voice, and engagement growth.
Configure your page with linkedin setup <companyId> --name="Your Company".
Quick start
linkedin post "Excited to announce our latest open source contribution! #AIEcoverse"
linkedin list --limit 5
linkedin comments 7463311119181312000
linkedin comment 7463311119181312000 "Thanks for the feedback!"
linkedin profile klimetschek
linkedin watch --scoop=linkedin-responder
linkedin monday --limit 20 --date 3d
Brand Voice & Content Strategy
The skill maintains a brand knowledge base at /workspace/skills/linkedin/brand/:
Brand Voice (brand/voice.md)
Defines how your company speaks on LinkedIn. Updated by the user or inferred from
successful posts. The voice guide covers:
- Tone and register (technical but approachable)
- Vocabulary preferences and avoidances
- Formatting conventions (emoji usage, hashtag strategy, line breaks)
- Content pillars (what we talk about and why)
When drafting posts, always read brand/voice.md first and conform to it.
Content Pillars (brand/pillars.md)
The recurring themes that define your LinkedIn presence:
- What topics we cover
- What angle we take on each
- What we never post about
- How we differentiate from generic AI hype
Audience Insights (brand/audience.md)
Who follows and engages with your page:
- Demographics and roles observed from commenters/reactors
- What content gets the most engagement
- Which profiles are VIPs (frequent engagers, industry voices)
- Engagement patterns by time/day
Content Log (brand/content-log.md)
Append-only record of every post published through the skill:
- Date, post text, engagement metrics (updated periodically)
- What worked, what didn't
- Ideas for future posts
Posting Cadence (brand/cadence.md)
Defines the rhythm:
- Target posting frequency (e.g., 3x/week)
- Best times to post (learned from engagement data)
- Content mix ratio (e.g., 40% technical, 30% community, 20% announcements, 10% culture)
- Scheduled drafts queue
Knowledge Base Operations
Building the brand KB
When the user first sets up the LinkedIn skill or asks to establish brand voice:
- Analyze existing posts —
linkedin list --limit 50 to understand current voice
- Create
brand/voice.md — synthesize the voice from existing content + user input
- Create
brand/pillars.md — define content themes
- Create
brand/audience.md — initialize from current followers/engagers
- Create
brand/cadence.md — set posting rhythm
- Create
brand/content-log.md — start tracking
Maintaining the KB
After every post:
- Append to
brand/content-log.md with date and text
- After 48h, update with engagement metrics
Periodically (weekly or on request):
- Analyze what's working → update
brand/audience.md
- Refine voice if the user gives feedback → update
brand/voice.md
- Rotate content pillars if needed → update
brand/pillars.md
Using the KB when drafting
When asked to draft or post:
- Read
brand/voice.md for tone
- Read
brand/pillars.md for topic alignment
- Read
brand/cadence.md to check if it's the right time
- Read recent entries in
brand/content-log.md to avoid repetition
- Draft in the established voice
- Present for approval before posting
Authentication
Current: Session-based (Voyager API)
Uses the active LinkedIn browser session (cookie + CSRF token). The LinkedIn tab
must be open. Works immediately, no setup required.
Future: OAuth (Official API)
For headless operation (no browser tab needed), register a LinkedIn Developer App
and request the Community Management API product. Then:
linkedin auth setup --client-id=<ID> --client-secret=<SECRET>
This enables:
- Posting without a LinkedIn tab open
- Stable, versioned API endpoints
- Proper rate limits and error handling
- Image/video upload support
- Scheduled posts via cron without browser dependency
Available commands
linkedin post <text> [--video=<path> | --image=<path> [--alt="..."]]
Publish a post to the configured company page.
- Posts as the company page (not personal profile)
- Visibility: Anyone (public)
- Include #hashtags and https://links inline
- With
--video=<path>, attaches a video (mp4, H.264). Equivalent to
linkedin video <path> "<text>". Uses the Voyager media-upload pipeline
(register → PUT bytes → createShare with media). SINGLE-part uploads only
for now; LinkedIn switches to MULTIPART for very large videos (not yet
supported — the helper raises a clear error in that case).
- With
--image=<path>, attaches an image (jpg/jpeg/png/gif/webp). Equivalent
to linkedin image <path> "<text>". Uses the same Voyager pipeline as video
with mediaUploadType: IMAGE_SHARING. Add --alt="<altText>" to set the
image's accessibility alt text. Cannot be combined with --video.
linkedin video <path> "<text>"
Alt form of linkedin post --video=. Posts a video update with the given
caption.
linkedin image <path> "<text>" [--alt="..."]
Alt form of linkedin post --image=. Posts an image update with the given
caption and optional alt text.
linkedin list [--limit N]
List recent posts with engagement statistics (comments, likes, reposts).
Each post includes an isRepost flag. When the page reshares another author's
post (rather than publishing original content), isRepost is true and two
extra fields are populated:
repostHeader — the reshare attribution, e.g. "AI Ecoverse reposted this"
originalAuthor — the name of the original author whose post was reshared
For reposts, the text field holds the original author's words, not the
page's own copy. Filter on isRepost when auditing only the content the page
authored itself (e.g. content-log entries, cadence tracking, voice analysis).
linkedin comments <activityId>
View comments on a specific post.
linkedin comment <activityId> <text>
Add a top-level comment on a post as the company page. (Does not reply to
a specific comment — it posts a new comment on the activity thread.)
linkedin reactions <activityId>
View who reacted to a post.
linkedin profile <vanityName|memberUrn>
Quick preview of a LinkedIn profile. Returns name, headline, location, summary,
and current positions. Use before responding to commenters to understand context.
linkedin watch --scoop=<name> [--interval="cron"]
Start watching for new comments. Polls every 5 minutes (configurable), fires a
webhook to the specified scoop when new comments arrive.
linkedin unwatch
Stop the comment watcher.
linkedin watches
Show current watch configuration and last-check status.
linkedin monday [--limit N] [--date Nd]
Monday protocol aggregation. Produces JSON array of:
- Posts with new engagement
- Individual new comments needing response
Watching for new comments
linkedin watch --scoop=linkedin-responder
Webhook payload on new comment:
{
"type": "linkedin-comment",
"event": "new-comment",
"data": {
"activityUrn": "urn:li:activity:...",
"postText": "Original post (truncated)...",
"postUrl": "https://www.linkedin.com/feed/update/...",
"commentText": "The comment text",
"commenter": "Commenter Name",
"commentUrn": "urn:li:fsd_comment:..."
}
}
The receiving scoop should:
linkedin profile <commenter> — understand who's commenting
- Read
brand/voice.md — respond in brand voice
linkedin comment <activityId> <text> — reply
Engagement Growth Playbook
Built into the brand KB, but the key principles:
- Respond to every comment within 4 hours — signals the algorithm to boost
- Ask questions in posts — drives comment engagement
- Tag relevant people sparingly — only when genuinely relevant
- Cross-reference with real conversations — share insights from actual work
- Consistent cadence > viral attempts — steady posting beats sporadic bursts
- Engage on others' posts — builds reciprocal relationships
- Use the hook-body-CTA pattern — first line hooks, body delivers, end asks
How it works
The script:
- Finds an open LinkedIn tab (or opens one)
- Extracts the CSRF token from the JSESSIONID cookie
- Makes API calls via
playwright-cli eval from the page context
- Requests carry cookies and correct Origin automatically
Endpoints reference
See references/endpoints.md for the full API documentation.
Limitations
- Both image and video posts work via the session-based Voyager pipeline
(
linkedin post --image=... / --video=...); OAuth is not required
- Large media files that LinkedIn marks as MULTIPART chunked uploads are not
yet supported (SINGLE-part only — covers everything ~3-5 MB and short clips)
- Multi-image carousel posts (up to 20 images) are not yet supported — only
one media item per post
- Click-to-tag-people on images (
tapTargets) is not yet supported
- The Voyager API is undocumented and may change; queryIds are version-pinned
- Rate limits are unknown; use reasonable intervals for polling
- Profile lookup by vanity name requires page navigation (slower than URN lookup)
- Real-time notifications require polling (LinkedIn has no push for company pages)