Skip to content

/linkedin-reply-handler

Draft a reply to one LinkedIn comment from its URL, or sweep a whole thread from just the post URL and draft a reply to every comment worth answering, in one batch. Use for replying to a comment, following an author reply, or clearing all comments on a post. Resolves the correct

From plugin
linkedin-skills
5.8k12 skills

Claude Code

$ npx -y skills add sergebulaev/linkedin-skills --skill linkedin-reply-handler --agent claude-code

SKILL.md

linkedin-reply-handler.SKILL.md
name: linkedin-reply-handler
description: "Draft a reply to one LinkedIn comment from its URL, or sweep a whole thread from just the post URL and draft a reply to every comment worth answering, in one batch. Use for replying to a comment, following an author reply, or clearing all comments on a post. Resolves the correct parentComment (LinkedIn flattens threads to 2 levels), filters low-value comments before a sweep, and posts via Publora on approval. Not for top-level comments (use linkedin-comment-drafter)."

LinkedIn Reply Handler

Drafts a reply to a specific LinkedIn comment, or sweeps an entire comment thread (every top-level comment and its replies) from just the post URL and drafts a reply to each one worth answering. Both modes correctly handle LinkedIn's 2-level thread flattening: if you're replying to a reply, the Publora API needs the TOP-level comment URN as `parentComment`, not the reply's URN.

When to use

**Single comment:**

  • User pastes a LinkedIn comment URL (contains `?commentUrn=...`) and says "reply to this"
  • An author replied to the user's comment and the user wants to continue the thread
  • User wants to re-engage a conversation that's gone dormant

**Whole thread (just a post URL, no comment URLs):**

  • User pastes a post URL and says "reply to all the comments", "clear my inbox on this post", "draft replies for everyone who commented", "sweep the comments on this post"
  • User wants to catch up on a post that has accumulated comments over several days

Not for:

  • Commenting on someone else's post (not replying to comments on the user's own post) → `linkedin-comment-drafter`
  • Reading engagement without drafting anything → `linkedin-engager-analytics` or `linkedin-thread-monitor`

Input

Either shape works:

  • A LinkedIn URL containing `commentUrn=urn:li:comment:(activity:POST,COMMENT_ID)` — either the direct comment permalink or a feed URL with the query fragment. Triggers single-comment mode.
  • Just a LinkedIn post URL, in any of the standard shapes (see root `SKILL.md` URL table) — no comment URLs needed. Triggers whole-thread mode.

Output

**Single comment:**

  • 1-2 reply drafts, 150-300 chars each
  • Reaction suggestion for the comment being replied to (always react before replying)
  • Thread context summary (who said what, when)
  • Approval card → on user "post", fires reaction + reply via Publora

**Whole thread:**

  • A filtered roster: how many comments were fetched, how many were filtered out and why, how many drafts follow
  • One reply draft per comment worth replying to (150-300 chars each), each tagged with its target comment, the correct `parentComment` URN, and a reaction suggestion
  • A single batch approval card covering every draft
  • On approval, posts all of them (reaction + reply, per comment)

Steps — single comment

**Voice profile first (all drafts, both modes).** If `../../references/voice-profile.md` has `filled: yes`, load it and match the user's voice fingerprint, hard rules, and CTA/link style throughout. If it is not filled, mention once that `linkedin-humanizer --mode profile` can learn their voice from a few posts, then proceed with the generic voice rules. If `../../references/story-bank.md` has `filled: yes`, load it too and take concrete details (numbers, dates, named projects) from there instead of asking mid-draft. Never invent a figure that is not in it; if the bank has nothing that fits, ask the user or offer `linkedin-interviewer`.

1. **Parse the URL.** `lib.url_parser.parse_linkedin_url` returns `post_urn`, `comment_id`, `comment_urn`. 2. **Determine thread structure.** If `APIFY_TOKEN` is set, call `lib.ApifyClient.fetch_post_comments(post_id=post_urn, max_items=50)` and locate the comment by `comment_id`. Otherwise ask the user to paste the relevant slice of the thread. **With the Apify MCP connector available instead of a token**, read the same comments through its tool and drop the run-summary row before using them, per `../../references/mcp-read-layer.md`; that is the only read path on claude.ai. Figure out whether the target is:

  • a top-level comment (parentComment = this comment's URN when replying)
  • a reply to a top-level comment (parentComment = the TOP comment's URN, not this reply's URN. LinkedIn flattens)

3. **Read the full context.** Author post text, top-level comment text, any intermediate replies. Include the user's own prior comment if they're in the thread. 4. **Draft the reply.** Follow the engagement templates in `references/reply-templates.md`. If the counterpart asked a question, answer it directly. If they pushed back, concede then sharpen. 5. **Humanizer pass.** Scrub 2026 AI vocab by density, cap em dashes (about one per 100 words), fix only machine-flat rhythm and never manufacture sentence-length variance. Canonical rules: `linkedin-humanizer` V3. 6. **Approval card.** Include thread preview (who said what in last 3 turns), the draft, reaction suggestion, and the parentComment URN we'll send. 7. **On approval.** Call `lib.publish(kind="reply", draft_text=<approved>, target_url=<comment_url>, post_urn=<urn>, platform_id=<id>, parent_comment=<top_level_comment_urn>, reaction_type=<chosen>)`. The wrapper handles Publora / manual / diy routing.

Steps — whole thread

Same voice-profile-first rule applies. Then:

1. **Parse the post URL.** `lib.url_parser.parse_linkedin_url` to get `post_urn`. If the URL is a reshare, resolve the canonical original post first — see "Reshare gotcha" below — comments live on the original, not the reshare's activity id. 2. **Fetch the full comment tree.** Call `lib.ApifyClient.fetch_post_comments(post_id=<post_urn or resolved canonical id>, max_items=100)` Comments come back sorted by most relevant, which is what surfaces the reply threads the parentComment rule needs; pass `sort_order="most recent"` if the user explicitly wants the newest first. If `APIFY_TOKEN` is not set, ask the user to paste the comment list (name + text per comment is enough;

Read more
@sergebulaev
Ships withlinkedin-skills

Claude skills for LinkedIn. 12 Claude Code and Codex skills that write LinkedIn posts, comments, and replies in your voice. They draft content, strip AI tells, and wait for your approval before anything gets published. No coding required.

Stars on GitHub

Momentum

stars in total
5.8k
Star history of sergebulaev/linkedin-skills on GitHub, a chart by star-history.com

Other skills on linkedin-skills.

More skills from other plugins.

prompt-lookup

prompt-lookup

Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use…

@gh-f@gh-fInstall Skill
ppt-master

ppt-master

AI-driven presentation workflow for generating editable PPTX decks and slides, reconstructing page visuals, creating reusable…

@hugohe3@hugohe3Install Skill
morph-ppt

morph-ppt

Use this skill when the user wants a .pptx with smooth cross-slide animation — PowerPoint Morph transitions, Keynote-style…

officecli13d33k
@iofficeai@iofficeaiInstall Skill

Questions about linkedin-reply-handler.

Which coding agents can use linkedin-reply-handler?
linkedin-reply-handler installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.