← Back to list
⚡

linkedin-reply-handler Checked

Draft a reply to one LinkedIn comment from its URL, or sweep a whole thread from just the post UR…
⚡ Productivity skills By sergebulaev Version v1.0.6b78503 Added 2026-09-15 Updated 2026-09-22 Source ↗ Part of LinkedIn Growth →
9.5Overall rating
2Views
42Downloads
2.4kStars

Installation

🤖 Install via AI

Copy the prompt below and send it to your AI assistant (e.g. Claude Code) — it will follow the instructions and install automatically.

Install the "linkedin-reply-handler" skill by following the instructions at https://skill123.me/install/linkedin-reply-handler.
⌨️ Command line install

Run in your terminal — downloads and installs to ~/.claude/skills/.

curl -fsSL https://skill123.me/install/linkedin-reply-handler.sh | bash
📦 Download ZIP

Download the zip and extract it into your skills directory (e.g. ~/.claude/skills/), then restart your session.

⬇ Download v1.0.6b78503 · 10 KB
📊 Static rating
9.5/10
Trigger
9.5
Structure
9.3
Workflow
9.6
Content
10.0
Engineering
9.0
Security
9.5

Six-dimension rubric with reviewer rationale.

View scorecard ↓
🛡 Dynamic test
—

Not live-tested yet — this skill is rated on static analysis only.

About this skill

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.

Documentation

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

View full documentation

**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, scrape_replies=True) and locate the comment by comment_id. Otherwise ask the user to paste the relevant slice of the thread. 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, scrape_replies=True). If APIFY_TOKEN is not set, ask the user to paste the comment list (name + text per comment is enough; nested replies noted as such).

3. **Flatten the tree into a reply queue.** For each top-level comment, queue the comment itself plus every reply under it. Each queue entry carries: comment_id (the one being replied to), top_level_comment_id (for the flattening rule below), author name, comment text, and depth.

4. **Filter out low-value comments.** Drop anything matching references/filtering-rules.md: plain "thanks for sharing" / generic praise with no content, duplicate or near-duplicate text already filtered elsewhere in the thread, spam or engagement-bait patterns, and comments from the user's own account (don't reply to yourself). Report the drop count and a one-line reason per category — don't silently discard.

5. **Draft each remaining reply.** For every surviving queue entry, follow the same references/reply-templates.md templates as single-comment mode (R1 Answer-Their-Question, R2 Concede-Then-Sharpen, R3 Extend-Their-Thesis, R4 Share-Lived-Experience, R5 Ask-Back). Read the surrounding thread (the top-level comment plus any prior replies) for context before drafting a reply to a nested reply.

6. **Compute the parentComment URN for each draft.** Use lib.url_parser.build_parent_comment_urn(post_urn, top_level_comment_id) — always the TOP-level comment's id, never an intermediate reply's id, per the flattening gotcha below. Sweeping many comments at once makes it easy to mix up which id is "top-level" — double check each entry's top_level_comment_id before building its URN.

7. **Humanizer pass.** Same scrub as single-comment mode, run per draft.

8. **One batch approval card.** Present every surviving draft together: for each, the commenter's name, a short quote of what they said, the drafted reply, the reaction suggestion, and the parentComment URN. Show the filter summary from step 4 above the drafts so the user can sanity-check what got skipped. Wait for one explicit approval — the user can approve all, or call out specific ones to skip or edit.

9. **On approval, publish each one.** For each approved draft, call lib.publish(...) the same way single-comment mode does. React before replying on each comment. If the user approved only some drafts, publish only those.

The flattening gotcha (both modes)

LinkedIn only nests replies two levels deep. Visually the thread looks like:


Top comment by Alice (id: 111)
└─ Reply by Bob (id: 222)          ← parentComment: urn:li:comment:(activity:POST, 111)
   └─ Reply by Carol (id: 333)     ← parentComment: STILL urn:li:comment:(activity:POST, 111)

Carol's reply doesn't nest under Bob's — it's pinned at level 2 to the same top comment. If you pass urn:li:comment:(activity:POST, 222) as parentComment, the API returns 400 on some paths or silently misplaces the reply.

**Rule in this skill:** always use the TOP-level comment's URN as parentComment. In single-comment mode, if you're rep

Score breakdown

Trigger
9.5
Dual-mode What/When plus explicit Not-For routing to drafter and analytics.
Structure
9.3
152-line SKILL.md with four tight references covering templates, threading, filtering, examples.
Workflow
9.6
Flattening and reshare gotchas handled, filter transparency, batch approval, rate-limit-aware sequential publish with stop-on-429 rule.
Content
10.0
Exceptionally precise edge-case documentation and concrete drop patterns.
Engineering
9.0
Correct frontmatter; lib and reference paths exist in bundle context.
Security
9.5
No cookies or login; comments treated as data with injection flagging inside sweeps; publish gated on explicit batch approval.
Best-in-batch execution design: single-comment and whole-thread sweep modes, correct 2-level parentComment flattening with per-entry double-check, transparent filter summary, batch approval, sequential publishing with 429 stop rule, and sweep-wide prompt-injection defenses. Fetching is no-cookie public Apify only.

Assessment methodology

🧪
AI-assessed
Evaluated by automated analysis across quality, usability, and security dimensions. This is not a substitute for your own review — always inspect a skill before installing it.

Version history

v1.0.6b78503 2026-09-22
10 KB

— Refreshed from GitHub sergebulaev/linkedin-skills@6b78503

v1.0.0 2026-09-15
11 KB

Imported from sergebulaev/linkedin-skills@main