social-listening
Skill2 starsChanged 27 days agoMITView on GitHub
Find the LinkedIn conversations worth joining every week: each Monday the week''s public LinkedIn posts about the problem you solve are judged against your ICP, and one Slack digest lists the posts worth joining and the commenters who look like buyers, each with a link. Triggers: "tell me which linkedin posts we should comment on", "watch linkedin for people talking about our problem", "social listening on linkedin", "weekly digest of linkedin conversations in our space", "who is engaging with posts about our category", "monitor linkedin posts mentioning our competitors". Cargo project, LinkedIn fetchPosts, searchPostComments, defineModel, defineAgent, Slack postMessage. Skip when: you want named target accounts checked for hiring, news or detection-feed events, once, which is monitor-buying-signals; or you want people who just took a role you sell to, which is new-hire-detection.
7 other projects use a version of this.
Adopted by
Most recently taken up by
- DoddleHQ/doddle-social-media-skillstheir own version, first seen Nov 8, 2026
- Nooticr/nooticr-mcptheir own version, first seen Oct 21, 2026
- calven-ai/marketing-as-codetheir own version, first seen Oct 7, 2026
- Ootto-AI/claude-content-skillstheir own version, first seen Aug 23, 2026
- TikHub/tikhub-plugintheir own version, first seen Jun 15, 2026
- CodeAlive-AI/ceo-ai-ostheir own version, first seen May 18, 2026
Other versions7 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 7
- vivy-yi/xiaohongshu-skills★ 455same name
- Ootto-AI/claude-content-skills★ 417same name
- calven-ai/marketing-as-code★ 10same name
- CodeAlive-AI/ceo-ai-os★ 9same name
- TikHub/tikhub-plugin★ 7same name
- DoddleHQ/doddle-social-media-skills★ 0same name
- Nooticr/nooticr-mcp★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository46 other files it gives its agents.
- llms.txtllms.txt
- account-scoringSkill
- agentic-engagementSkill
- create-gtm-skillSkill
- apollo-to-cargoSkill
- ask-cargoSkill
- build-tam-listSkill
- call-captureSkill
- clay-to-cargoSkill
- crm-deduplicationSkill
- crm-enrichmentSkill
- enrich-company-dataSkill
- enrich-linkedin-profileSkill
- expansion-signalsSkill
- extract-sales-navigator-searchSkill
- find-b2b-leadsSkill
- find-companies-using-techSkill
- find-linkedin-urlSkill
- find-portfolio-companiesSkill
- find-stakeholdersSkill
- find-work-emailSkill
- goal-coverageSkill
- inbound-qualificationSkill
- linkedin-contentSkill
- meeting-prepSkill
- monitor-buying-signalsSkill
- new-hire-detectionSkill
- next-step-trackerSkill
- readiness-scoringSkill
- research-accountSkill
- score-leadsSkill
- stalled-deal-nudgeSkill
- standupSkill
- tam-buildingSkill
- track-funding-roundsSkill
- track-job-changesSkill
- verify-email-listSkill
- visitor-identificationSkill
- waterfall-enrichmentSkill
- web-captureSkill
- website-auditingSkill
- website-buildingSkill
- weekly-planningSkill
- win-loss-reviewSkill
- workspace-healthSkill
- zoominfo-to-cargoSkill
The file
We split this skill into the rules it gives an agent
4 rules. 0 are common, 4 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 6 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 94
Reconcile it with what is already declared: If the project already has a LinkedIn, Slack or Anthropic connector, rewire the imports to the …
- Distinctive: line 150
Write early and a failed post marks posts as surfaced that nobody saw.
- Distinctive: line 168
every quoted comment exists on the linked post, and every employer shown is in the commenter's own headline
- Distinctive: line 173
Read the live price of each paid step immediately before the plan, and say each one out loud:
“Common” is measured: kept by at least 6 in 10 of the 6 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Social listening
State: to-be-approved. Deploy-verified against a live workspace: yes, on 2026-10-04: a
limit: 20 search landed 21 posts from the past week, the listener surfaced 3 of them in one Slack
digest, read no comments because none of the picked posts had any, called no engagement action,
and wrote 4 ledger rows (3 posts and the week's digest row); a re-run the same day found the digest
row and posted nothing. Treat Done when
below as the acceptance test and review cargo-ai project plan before deploying. Make no outcome claim
for this skill until it is approved.
The outcome
The conversations your buyers have in public stop going past unseen. Every Monday:
- A model buys one capped search.
linkedin_postssyncs LinkedIn's post search for the past week, on keywords taken from your workspace context: the pains in the buyer's own words, the category term, competitor names. The query is the spend, so it lives in the model's config. - An agent judges. It reads the ICP and pains from the context, drops every post already surfaced, and picks at most five worth joining, each with the context line that decided it.
- It reads comments only on those five, and names at most ten commenters whose headline matches an ICP persona, quoting the first sentence of what they said.
- One digest lands in a locked Slack channel, and the picked posts go into the
surfaced_postsledger, so a post never headlines twice.
It never likes, comments, connects or messages. Those actions sit on the same LinkedIn connector and none is wired; the contract fails if one is. A human reads the digest and decides whether to join. The ledger keeps posts, not people: an engager appears in that week's digest, quoted from a public comment, and is not stored as a list.
Example
Every Monday, tell #gtm-signals which LinkedIn conversations about lead routing are worth joining.
Illustrative output, fictional records:
:ear: *What the market said this week*
_Routing breakage after CRM migrations came up three times._
*Worth joining*
• Dana Ruiz, VP RevOps at Fabrikam: "Our Salesforce migration broke every
routing rule we had" — ICP persona, pain "routing breaks on field changes"
(linkedin.com/posts/dana-ruiz_fab…) · 41 comments
• Wingtip Toys Engineering: a teardown of hand-built lead routing — category
term "speed to lead" (linkedin.com/posts/wingtip…) · 12 comments
*Warm engagers*
• Sam Okafor, Head of Revenue Operations at Contoso, on Dana's post:
"We rebuilt ours three times this year." (linkedin.com/in/sam-okafor)
_Searched: 40 posts read, 3 already surfaced_Forty posts were read; two were picked and recorded in surfaced_posts, one commenter matched an ICP
persona, and nothing was sent to anyone.
Put it in your project
This folder is a worked example: real project resources written for some other company. The job is
to end up with the code your company would have written, in your project, and an agent does the
adapting. If the cargo-project skill is in your session it carries the long form of this; if not, this
is enough.
- Install it — the CLI does the copy. From inside the project (the folder holding
cargo.json),cargo-ai project add cookbook/social-listeningwrites this example toinfra/social-listening/and this procedure to.agents/skills/social-listening/. No project yet?cargo-ai project init <dir> --cookbook social-listening && cd <dir> && npm installdoes both. If you are reading this from the project's.claude/skills/, the install already happened — start at step 2. - Reconcile it with what is already declared. If the project already has a LinkedIn, Slack or Anthropic connector, rewire the imports to the existing one and drop the copy; two resources with one slug is a collision at deploy.
- Write the keywords from the context. Replace
searchKeywordsininfra/models/linkedin-posts.tswith phrases a buyer would post, read from the ICP and pains in the workspace context, plus competitor names. Run the search once by hand (cargo-ai orchestration action executeonlinkedin.searchPostswith the same keywords anddatePosted: "Past week") and read ten results out loud before you keep them. - Point Slack at your channel. Set
channelIdininfra/agents/listener.tsto a channel id (C…) from the Slack connector's autocomplete, and invite the bot. - Adapt. Work the sections below in order: What should not change is what you argue back
about; What you can change is what you offer unprompted; What you will be asked is the floor,
and you derive before you ask. Record what you changed and why under a
## Decisionssection in your copy of this file. - Check, then plan.
node --import tsx evals/contract.mjsfrom this skill's folder, thennpm run check && cargo-ai project planfrom the project root. Show the diff, and deploy only on an explicit yes:cargo-ai project deploy. - Verify. Trigger the model sync once, then send the agent its trigger text by hand
(
cargo-ai ai message create), and walk Done when with evidence. Send it again: the second run must post nothing.
What you will be asked
Derive before you ask. An input with a lookup is looked up, not asked.
| Input | Kind | How it is answered | Why it matters |
searchKeywords (infra/models/linkedin-posts.ts) | derived | From the ICP pains, category term and competitors in the workspace context, confirmed against one manual search. Asked only when the context has none. | It is what you buy each week. Positioning copy as keywords returns vendors talking to each other; buyer language returns buyers. |
limit (infra/models/linkedin-posts.ts) | asked | 20 to 100 in steps of 20. Price it from the live per-post cost before you pick. | It is the weekly spend ceiling on the search. |
channelId (infra/agents/listener.ts) | asked | The Slack channel id (C…) from the connector's autocomplete. Invite the bot. | The digest names people. Locked so it never lands in a customer shared channel. |
connectors (infra/connectors/) | value | derived: cargo-ai connection connector list shows authorized LinkedIn, Slack and Anthropic connectors. default: true binds each. | Without LinkedIn the sync returns nothing and the digest reads "quiet week" forever. |
| our own company and people | derived | From the workspace context (company, positioning). | They are excluded from picks. Miss them and the digest recommends joining your own posts. |
What you can change
| Variation | When it is right | How | What it costs |
two-searches | Pain language and competitor names return different crowds | Add a second fetchPosts model with its own keywords and give the listener read access to both | Two searches billed each week. The ledger still dedupes a post that matches both. |
with-reactions | Comments are rare in your niche and reactions are the only signal | Add linkedin.actions.searchPostReactions to uses and a §4 line to read them on picked posts | Billed per reactor, often hundreds a post, and a reaction carries no words to quote. Cap it in the prompt. |
with-tiers | account-scoring is installed and you want engagers at A/B accounts first | Add the tiered companies model to uses read-only, and in §4 match the headline's stated employer by name | Name matching misses on abbreviations. Only a headline that states the employer can match; never look it up. |
daily | The category moves fast and a weekly digest is stale | datePosted: "Past 24 hours", a daily cron on both the model and the agent | Seven searches a week instead of one, and a digest most days will be quiet. |
competitor-only | You only want to hear when a competitor is discussed | Keywords become competitor names only | You lose the buyers who describe the pain without naming any vendor, which is most of them. |
What should not change
- No engagement action on
uses. (infra/agents/listener.ts) Liking, commenting, connecting or messaging from an agent is automated outreach to people who never asked. The contract fails on any of them. - The ledger stores posts, never people. (
infra/models/surfaced-posts.ts) A standing list of everyone who commented on a topic is a scraped list. The digest names engagers that week, quoted from a public comment, for a human to read. - The search is the spend, so it stays in the model's config and capped.
(
infra/models/linkedin-posts.ts) Removinglimitor wideningdatePostedre-buys last week's posts every Monday; the sync replaces the rows, so nothing is gained. - The ledger is checked before comments are read, and written after the post.
(
infra/agents/listener.prompt.ts§2, §5, §6) Check late and every re-run re-pays for comments. Write early and a failed post marks posts as surfaced that nobody saw. - Comments are read only on picked posts, under the cap. (
infra/agents/listener.prompt.ts§4) The comment read bills per comment returned; reading every post's comments is the bill that grows without anyone choosing it. - No invented employer. (
infra/agents/listener.prompt.ts§4) An engager's company is what their headline states, or nothing. Looking people up elsewhere turns a digest into a dossier. channelIdis locked. (infra/agents/listener.ts) The digest quotes people by name.
Done when
node --import tsx evals/contract.mjspassescargo-ai project planreports the agent, the two models, the three connectors and the two folders- the first sync landed rows in
linkedin_posts, all from the past week, no more thanlimit - one digest landed in the locked channel in the
references/digest.mdshape, every pick citing a context line and linking its post surfaced_postshas one row per pick plus onedigest-<date>row, and no column holding a person- a second run the same day posted nothing and read no comments
- the run transcript shows no LinkedIn action other than
searchPostComments, and only on picks - every quoted comment exists on the linked post, and every employer shown is in the commenter's own headline
What it costs
Read the live price of each paid step immediately before the plan, and say each one out loud:
cargo-ai connection integration get linkedin: thefetchPostsextractor (per post returned, so the weekly ceiling islimittimes that price) andsearchPostComments(per comment returned).cargo-ai orchestration action list postMessage --kind connector --integration-slug slack.
The weekly cost is one search capped by limit, comment reads on at most five posts each capped by
the prompt's comment limit, one Slack post, and the agent run billed as LLM tokens through the
Anthropic connector. On the live run the agent run, not the search, was most of the bill: it reads
the ICP, personas, objections and insights before it judges a post. A re-run that stops at the
ledger costs a small fraction of a full run. Read the run's usage after the first week
(cargo-ai ai message get) before you widen limit.
Composes into
account-scoring (the with-tiers variation puts engagers at A and B accounts first),
web-capture (what the market says next to what competitors publish), and find-linkedin-url /
enrich-linkedin-profile when a human decides one engager is worth a closer look.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

