There is a repository going round called linkedin-agent-skill: eleven Claude Code skills that between them write posts, comments and replies, score your profile, plan your week and clean the machine fingerprints out of a draft. It is free, MIT licensed, and had 184 stars when we looked. We installed it, read all eleven skill files, and ran the part that actually executes code, the humaniser, on two drafts: one of ours and one written to be as bad as possible. This is what it is, what it caught, and the one thing it broke.
What it is, and what it refuses to do
Each skill is a markdown file of instructions that Claude Code follows when you type its command. /li-post takes one idea and offers three hooks from a list of twenty-one named formulas (Contrarian Take, Number Reveal, Mistake Confession, Before and After, The Receipt, Myth Bust and so on), then a full draft. /li-comment writes a comment on someone else’s post. /li-reply handles the thread under your own. /li-profile scores your profile against a twelve-item rubric out of 100. /li-plan writes the week. /li-carousel, /li-repurpose, /li-dm, /li-inbox and /li-audit do what their names say. /li-human is two Python scripts with no dependencies.
None of them posts to LinkedIn. Every skill ends with a block of text for you to paste, and the README explains why in its own “fine print” section: there is no official way to post to a personal profile without an approved partner app, automating the site breaks LinkedIn’s User Agreement, and accounts get restricted for it. The approval gate is the design, not a setting.
That matters to us because our Academy course on getting clients from LinkedIn comments was built from a video that has Claude Code scrape five hundred posts and draft a comment for each, and the course keeps that step with a warning about what it can cost the account. A tool that drafts the comment and hands it to a person is the half of that method with no risk in it, and the course now points at this one.
The humaniser, on a real draft
detect.py scores a text on five checks: burstiness (how much sentence length varies), specificity (numbers and names per hundred words), slop density (hits against a 113-entry lexicon of stock phrases), fingerprint (invisible characters, em dashes, curly quotes) and voice (contractions, pronouns, structural tells). Each is scored out of 100; the verdict weights the average at 60 per cent and the single weakest check at 40 per cent, on the reasoning that a detector only needs one signal to fire.
We fed it a post of ours about an unanswered support inbox: 61 unread messages, $4,200 a month in ads, three changes made in the first week. It scored 66.4, verdict REVIEW. Slop density and fingerprint were perfect, 100 each: no stock phrases, no em dashes, nothing invisible. Specificity was 73.6, with seven concrete markers. Voice was 61, and it flagged one structural tell, three bullet points of near-identical length. The weakest check was burstiness at 50.5: sentence-length variation of 0.46 across thirteen sentences, against a target of 0.55. The report ended with “Weakest signal: BURSTINESS. Fix that first.”
That is a fair note. The draft was written in short declarative sentences on purpose, and a human editor would have said the same thing in different words: it reads a little metronomic. The tool did not find machine writing, because there was none. It found a stylistic habit, which is a more useful thing to be told.
The humaniser, on a terrible draft
Then we wrote the worst LinkedIn post we could: “In today’s fast-paced world of e-commerce, it’s not just about driving traffic, it’s about leveraging every touchpoint to create a seamless customer journey”, a “Here’s the thing”, a “robust, data-driven support framework”, “game-changing results”, “Let that sink in”, a rocket emoji and six hashtags.
Score: 33.7, FLAGGED. Slop density was zero, meaning maximal, with nine stock terms found and named. Fingerprint took a hit for the one em dash. Voice flagged two structural tells, which it labelled “rocket” and “hashtag-wall”. Burstiness, ironically, was better than our real post, because bad writing alternates long clichés with short punches.
humanize.py --report then removed ten artefacts: the em dash became a comma, “in today’s fast-paced world” became “right now”, “here’s the thing” and “let that sink in” were deleted, “leveraging” became “using”, “seamless” became “clean”, “journey” became “process”, “unlock” became “get”, “robust” became “solid”, “game-changing” became “big”. It flagged three things it would not touch, with a reason for each: the “it’s not just X, it’s Y” construction (“Say the one thing you actually mean. Delete the setup half.”), the rocket, and the hashtag wall (“Three hashtags. LinkedIn stopped rewarding the wall.”).
What it broke
The cleaned draft opened: “Right now of e-commerce, it’s not just about driving traffic…”. The lexicon replaced the phrase “in today’s fast-paced world” with “right now” and left the “of e-commerce” that had been hanging off it. Deleting “Here’s the thing:” left the next sentence starting with a lowercase “most”.
Neither is a bug in the sense of being unintended. A regex cannot know what a phrase was attached to. But it is the reason the README’s own instruction is to run the script and then read the result, and the reason the “flagged, not fixed” category exists. Anyone who pipes a draft through the humaniser and pastes the output without reading it will publish “Right now of e-commerce” under their own name, and it will read as exactly what it is.
The comment skill is the good one
Of the eleven, /li-comment is the one we would keep if we could keep one. It defines nine types of comment and tells the model to pick by what the post is: add a number the post lacks, add the missing case, disagree with the agreement stated first, extend one line, ask the real question, offer the receipt from having done the thing, correct a fact, reframe, or a one-liner under twelve words that has to be funny or true. Then the rules: two to four sentences; never open with “Great post”, “Love this”, “So true” or the author’s first name with an exclamation mark, because all of those are invisible; never restate the post; one idea. It returns two options of different types with a line on why.
That is a better brief than most people give themselves before commenting, and it is the discipline the Academy course teaches in lesson four. The skill does not make the comment specific; you still have to know something. It stops you writing filler.
/li-profile’s rubric is worth a look even if you never run it. Twelve items, weighted: the headline is 12 points and full marks means it says who you help and what changes for them, with one piece of proof, in the full 220 characters. The first two lines of the About section are 10 points and must name the reader’s problem, with no “passionate about” and no opening with your own name. Recent activity is 10. The rubric’s note says most first-pass profiles land in the 30s and 40s, and having read it against ours, that sounds right.
What we cannot tell you
Whether a month of /li-plan and /li-post changes anyone’s reach. That needs a month, a real profile and a before figure, and a post that claimed to know after a weekend would be the kind of post the humaniser is built to catch. The install takes two minutes, the voice file the README asks you to fill in takes ten, and the honest test is to run it for four weeks and look at /li-audit’s numbers.
Verdict
Install it for the humaniser and the comment brief. Fill in voice.md first, because the README is right that without it every user of the skill sounds like every other user of the skill, and that is a new fingerprint replacing the old one. Read every output before pasting. And do not look for the button that posts, because there is not one, and the reasons it is missing are the same reasons the account you are trying to grow is still yours.