linkedin-high-intent — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited linkedin-high-intent (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The premise: people who comment or react on a relevant post are 5-10× more likely to accept a connection or reply than cold outreach. This skill turns a single post URL into a filtered, ICP-matched outreach campaign.
linkupapi_list_accounts.linkupapi_login directly (platform=linkedin, with email+password OR a login_token). On checkpoint_required → run linkupapi_checkpoint.status = connected account exists, present the connected accounts via AskUserQuestion (single-select). Each option label is the account display name; description shows email + country. The chosen account_id is used for every subsequent tool call in this run.LinkedIn rate-limits per account. This skill respects:
linkedin_profiles get)search_people / search_companies)Before Stage 1, run linkupapi_get_logs filtered to the last 24h on the chosen account. Count today's:
linkedin_network/invite callslinkedin_profiles/get callslinkedin_profiles/search_* callsCompute remaining budget per category. Never override the caps — trim the run or stop. Surface remaining budget in the Stage 0 echo so the user sees it before confirming.
If linkupapi_get_logs is unavailable or empty, fall back to scanning ./campaigns/*.md and ./enrichments/*.md for today's date and counting entries.
Use AskUserQuestion (single batched form):
/posts/ or /feed/update/)linkedin-outreach Stage 0: titles, sectors, sizes, geo. If the user has a saved ICP file (./icp/*.json), offer to reuse it.min(10, remaining_invites).linkedin-outreach: no note / personalized / custom. Recommended here: personalized note referencing the post (accept rate is much higher when you reference the engagement).Echo the brief with daily-cap math:
Post: {url}
ICP: {summary}
Engagement: commenters + reactors
Volume cap: 10 (today: 8 invites used / 12 remaining)
Profile budget: 45 used / 55 remaining today
Note style: short personalizedWait for "yes" before continuing.
Tool: linkedin_content. Load schema with ToolSearch query="select:mcp__linkupapi__linkedin_content" to confirm action names. Likely:
get_post_reactions for reactorsget_post_comments for commenters{"account_id": "...", "action": "get_post_reactions", "params": {"post_url": "<url>", "limit": 100}}Run the chosen action(s). Merge results, dedupe by profile_url. Drop:
LinkedIn Member anonymized entries (URL contains headless)profile_urlNot counted against the 15-search cap.
Each engager comes back with name, headline, sometimes current_company. Score each against the ICP using ONLY visible fields:
Surface the triage:
Engagers found: 47
Clear matches (will enrich): 12
Ambiguous (will enrich): 8
Clear non-matches (dropped): 27
Profile budget: 55 remaining → fits all 20.Stop here and ask if user wants to drop ambiguous to save budget when budget is tight.
Tool: linkedin_profiles get, sequential with 1-2s sleep between calls.
HARD CAP: do NOT exceed today's remaining profile-get budget. If 12 strong matches but only 5 budget left, enrich the 5 strongest by visible signal (headline match + current_company match) and write the rest to a "deferred to tomorrow" list in the campaign log.
For each enriched profile, verify CURRENT role (experience[0]) actually matches the ICP. Drop people whose recent job changed (false positives).
Final scoring per prospect:
Select up to min(volume_cap, remaining_invite_budget, len(strong_matches + medium_matches)).
Show the final shortlist to the user (table: name, headline, company, match score, post engagement type) before sending. Wait for "yes".
For each selected prospect:
linkedin_network/check_invitation → skip if PENDING / CONNECTED"Hi {first_name}, saw your {comment|reaction} on {post_topic_short} — same space we're operating in. Would love to connect."
Keep ≤250 chars. No links.
linkedin_network/invite with identifier=<handle> and message=<note>Report partial completion if cap hits before the volume target.
Write ./campaigns/{YYYY-MM-DD}-high-intent-{post-slug}.md:
# | Name | Company | Engagement type | Note sent | invitation_urnConcise on-screen summary. Include account_id and daily-cap usage.
Before Stage 5, glob ./campaigns/*.md and ./enrichments/*.md for any profile_url / invitation_urn already in the new shortlist. Drop those silently and surface the dedup count in the report.
| Tool | Action | Daily cap |
|---|---|---|
linkedin_content | get_post_comments / get_post_reactions | engagement (uncapped) |
linkedin_profiles | get | 100/day shared |
linkedin_network | check_invitation | (pre-flight, no cap) |
linkedin_network | invite | 20/day |
linkupapi_get_logs | — | run at Stage 0 |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.