Token导航 LogoToken导航

Agent Skill · 待分类

linkedin-outreach(链接外展)

linkedin-outreach 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

linkedin-outreach 是待分类类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为接触敏感数据;许可证信息还不明确,第三方扫描有提醒项,按安装量在待分类类的 11,209 个 Skill 里排第 5,605。

总安装 541周安装 23GitHub Stars 607下载 190核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:linkedin-outreach(链接外展)
来源仓库:https://github.com/athina-ai/goose-skills
仓库路径:skills/linkedin-outreach
安装命令:
npx skills add https://github.com/athina-ai/goose-skills --skill linkedin-outreach
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/athina-ai/goose-skills --skill linkedin-outreach

这个 Skill 是做什么的

这个 Skill 的分类还没最终确定,用法以来源仓库的说明为准。

将合格线索转化为 LinkedIn 消息序列,适配多种第三方外展工具。自动映射不同平台的列格式差异,简化导入流程。支持自定义开场白与跟进节奏,提升连接成功率。由于 LinkedIn 工具多为浏览器操作,无法全自动发送,需人工介入确认。

linkedin-outreach 属于待分类类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/linkedin-outreach

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/athina-ai/goose-skills --skill linkedin-outrea…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

linkedin-outreach 怎么安装?

在终端执行 npx skills add https://github.com/athina-ai/goose-skills --skill linkedin-outreach。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

linkedin-outreach 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

linkedin-outreach 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

linkedin-outreach 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

linkedin-outreach 用的人多吗?

公开数据是累计安装 541 次,近一周安装 23 次,下载 190 次,GitHub 607 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

linkedin-outreach 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理待分类类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

待分类类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
infsh-cli

infsh CLI · Codex、Claude

4,374,576382权限未标注未明确未收录
ai-video-generation

AI 视频生成 · Codex、Claude

4,313,376382调用外部服务未明确有提醒
lark-openapi-explorer

云雀 OpenAPI 浏览器 · Codex、Claude

2,064,1209,011需要联网未明确有提醒
lark-workflow-standup-report

Lark 工作流程站立报告 · Codex、Claude

2,041,6328,978需要联网未明确通过
use-my-browser

使用我的浏览器 · Codex、Claude

1,848,49140操作浏览器未明确未通过
linkedin-outreach

链接外展 · 本页

541607接触敏感数据未明确有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

LinkedIn Outreach

The LinkedIn counterpart to cold-email-outreach. Takes qualified leads from Supabase, builds personalized LinkedIn message sequences, exports for the user's LinkedIn outreach tool, and logs everything back to Supabase.

Tool-agnostic: Asks the user which LinkedIn tool they use. All tools are CSV-import based — no API/MCP automation for LinkedIn tools (they're browser-based). Adapters handle column mapping and format differences per tool.

When to Auto-Load

Load this skill when:

  • User says "LinkedIn outreach", "connect with these leads on LinkedIn", "send LinkedIn messages", "set up a LinkedIn campaign"
  • An upstream skill connects with "create LinkedIn campaign" or "passes: supabase-eligible-leads" and user specifies LinkedIn
  • User completes lead-qualification and wants to reach out via LinkedIn

Supported Outreach Tools

This skill does NOT assume a specific tool. It asks first, then adapts.

ToolIntegrationHow It Works
DripifyCSV importGenerate CSV matching Dripify's import format, user uploads manually
BotdogCSV importGenerate CSV with Botdog-compatible columns
ExpandiCSV importGenerate CSV matching Expandi import format
PhantomBusterCSV importGenerate CSV for PhantomBuster LinkedIn sequences
Manual / OtherCSV + instructionsExport leads + messages as generic CSV, provide setup instructions

Tool selection logic:

  1. Ask user in Phase 0: "Which LinkedIn outreach tool do you use?"
  2. Generate tool-specific import CSV based on selection
  3. If Other or unknown → generate generic CSV (linkedin_url, first_name, last_name, company, title, connection_request, followup_1, followup_2, followup_3, inmail_subject, inmail_body) and ask user for their tool's import requirements

Prerequisites

Supabase

People must be stored in Supabase with the schema from tools/supabase/schema.sql. The people and outreach_log tables must exist. Run python3 tools/supabase/setup_database.py if setting up fresh.

Environment variables in .env:

SUPABASE_URL=https://xxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY=eyJ...

LinkedIn Tool

Just need CSV export — no API keys required. The user imports the CSV into their tool manually.

Character Limits

LinkedIn enforces strict character limits. All generated messages must respect these.

Message TypeLimitNotes
Connection request note300 charactersHard limit. Every character counts.
Regular message8,000 charactersSent after connection accepted
InMail subject200 charactersOnly for InMail (premium feature)
InMail body1,900 charactersOnly for InMail

Enforcement: After generating any message, count characters. If over the limit, rewrite — do not truncate. Truncated messages look broken.

Phase 0: Intake

Ask all questions at once. Organize by category. Skip any already answered by an upstream skill.

Campaign Goal

  1. What's the objective? (book meetings, drive demo requests, get replies, build relationships, nurture)
  2. What's the outreach angle or hook? (hiring signal, competitor displacement, event-based, pain-based, cold database, KOL engagement, mutual connection)
  3. What should we name this campaign?

Outreach Tool

  1. Which LinkedIn outreach tool do you use? (Dripify / Botdog / Expandi / PhantomBuster / Other / Just give me a CSV)

Lead Selection

  1. Which leads should we target? Options:

- All leads for a specific client_name - Specific icp_segment - Title patterns (e.g., "VP Operations", "Director of Sales") - Industry or location filters - qualification_score above a threshold - Specific source (crustdata, apollo, linkedin, etc.) - Custom filter (describe what you want)

  1. Any exclusions? (specific companies, recently contacted leads, certain titles)
  2. Max campaign size? (default: 100 — LinkedIn tools have lower daily limits than email)

Tone & Style

  1. Which tone preset? Present these options:

- Casual Professional — Friendly, human, slightly informal. Like messaging a peer. (default) - Thought Leader — Lead with insight or a contrarian take. Position sender as an expert. - Provocative — Challenge assumptions, pattern-interrupt. Higher risk, higher reward. - Enterprise Formal — Polished, structured. For regulated industries or C-suite targets. - Custom — Paste reference messages that worked before, or describe the vibe.

  1. Any reference messages that have worked well? (paste examples — these override tone presets)

Sequence Structure

  1. How many follow-ups after connection? (default: 3)
  2. Timing between messages? (default: Day 0 connection / Day 3 FU1 / Day 7 FU2 / Day 14 FU3)
  3. Include InMail as a separate step for leads who don't accept the connection? (default: yes)

Personalization

  1. What signal data is available for these leads? (comment text, post they engaged with, mutual connections, hiring signals, event attendance)
  2. Any proof points or case studies to reference? (customer names, metrics, testimonials)

Phase 1: Lead Selection from Supabase

Connect

Use the shared Supabase client:

import sys, os
sys.path.insert(0, os.path.join("tools", "supabase"))
from supabase_client import SupabaseClient

client = SupabaseClient(os.environ["SUPABASE_URL"], os.environ["SUPABASE_SERVICE_ROLE_KEY"])

Build Filters

Map user criteria to PostgREST query parameters on the people table:

User SaysPostgREST Filter
"VP Operations"title=ilike.*VP Operations*
Client "happy-robot"client_name=eq.happy-robot
Score > 7qualification_score=gte.7
Has LinkedIn URLlinkedin_url=neq. (not empty)
Industry "logistics"industry=ilike.*logistics*
Location "San Francisco"location=ilike.*San Francisco*
Source "crustdata"source=eq.crustdata
Not contacted in 84 daysor=(last_contacted.is.null,last_contacted.lt.{84_days_ago})

Critical: For LinkedIn outreach, people MUST have a linkedin_url. Filter out people without one — they can't be contacted via LinkedIn.

Cooldown Filter (Mandatory)

Always exclude people contacted within 84 days (12 weeks) on ANY channel (email or LinkedIn). This is not optional.

Use the shared client's check_cooldown() method:

in_cooldown = client.check_cooldown(client_name="happy-robot", cooldown_days=84)
# Returns set of person_id strings still in cooldown

Or query directly:

  1. Query outreach_log for person_ids with sent_date in the last 84 days: GET /rest/v1/outreach_log?select=person_id&sent_date=gte.{84_days_ago}&status=neq.bounced&client_name=eq.{client}
  2. Collect those person_ids into an exclusion set
  3. Add id=not.in.({excluded_ids}) to the people query

Note: Cooldown applies across channels. A person emailed 30 days ago is still in cooldown for LinkedIn. This prevents multi-channel bombardment.

Present & Confirm

Show a sample table (10-15 leads) with:

  • Name, Title, Company, Industry, Score, LinkedIn URL, Last Contacted, Signal Type

Tell user: total eligible leads, how many excluded by cooldown, how many excluded for missing LinkedIn URL.

Ask user to confirm or adjust filters before proceeding.

Phase 2: Sequence Design

Present the sequence plan as a table before writing any copy:

StepTimingMessage TypeApproachCTA
1Day 0Connection request (300 chars)Signal-based personalized noteSoft — just connect
2Day 3Follow-up 1 (after accepted)Value-first: insight, resource, or observationQuestion or offer
3Day 7Follow-up 2Social proof or case studySpecific ask
4Day 14Follow-up 3Breakup / last touchOpen door
5Day 7*InMail (if not accepted)Standalone pitch with contextMeeting request

*InMail is sent to leads who haven't accepted the connection request by Day 7.

Key differences from email sequences:

  • Connection request is the gatekeeper — it must earn the accept. No selling in the connection note.
  • Follow-ups are conversational, not broadcast. They should read like DMs, not emails.
  • No subject lines except for InMail.
  • Shorter is almost always better. A 2-sentence message outperforms a 5-sentence one on LinkedIn.

Get user approval on the structure before generating copy in Phase 3.

Phase 3: Message Generation

Generate messages directly in this skill (no external sub-skill needed — LinkedIn messages are short enough to handle inline).

Signal-Aware Template Selection

Select the appropriate sequence template based on lead signal data:

Signal TypeTemplateKey Personalization Variable
Pain-language engager (has comment text)templates/sequence-templates/pain-language.md{comment_snippet}, {pain_topic}
Competitor post engagertemplates/sequence-templates/competitor-engagement.md{competitor_name}, {post_topic}
KOL engagertemplates/sequence-templates/kol-engagement.md{kol_name}, {post_topic}
Database search (lean signal)templates/sequence-templates/database-search.md{title}, {company}, {industry}
Hiring signaltemplates/sequence-templates/hiring-signal.md{role_hiring_for}, {job_posting_detail}
Event attendeetemplates/sequence-templates/event-attendee.md{event_name}, {event_topic}

Tone Calibration

  1. Load the selected tone preset from templates/tone-presets.json
  2. If user provided reference messages, those override the preset — analyze the reference messages for tone, length, structure, and vocabulary
  3. Apply tone guidelines to all generated messages

Calibration Loop

  1. Generate sample messages for 3-5 leads first (pick leads with different signal richness levels)
  2. Present to user for review — show the full sequence for each sample lead
  3. Iterate until approved (max 3 rounds)
  4. Batch generate remaining messages after approval

Writing Guidelines

Connection Request (300 chars max):

  • Lead with the signal (what they did/said that caught your attention)
  • One sentence of relevance (why you're connecting)
  • No pitch, no CTA, no "I'd love to..." — just be interesting enough to accept
  • MUST be under 300 characters. Count every character.

Follow-up 1 (value-first):

  • Thank for connecting (briefly — one clause, not a whole sentence)
  • Share something genuinely useful: insight, article, observation about their company/industry
  • End with a question, not a pitch

Follow-up 2 (social proof):

  • Reference a relevant customer or case study
  • Connect it to their specific situation
  • Make a specific, low-commitment ask (15-min call, async question)

Follow-up 3 (breakup):

  • Acknowledge you've been reaching out
  • One-line value recap
  • Leave the door open without pressure
  • Shortest message in the sequence

InMail (standalone pitch):

  • Subject: 200 chars max — curiosity-driven, not salesy
  • Body: 1,900 chars max — must work standalone since they haven't accepted your connection
  • Include context for why you're reaching out (the signal)
  • Must work even if they've never heard of you

Merge Variables

Standard variables available for all leads:

  • {first_name}, {last_name}, {company}, {title}, {industry}, {location}

Signal-specific variables (available based on source):

  • {comment_snippet} — the text of their LinkedIn comment
  • {pain_topic} — the pain point they engaged with
  • {competitor_name} — the competitor whose post they engaged with
  • {kol_name} — the KOL whose post they engaged with
  • {post_topic} — what the post was about
  • {event_name} — the event they attended
  • {role_hiring_for} — the role they're hiring for
  • {job_posting_detail} — a detail from the job posting

Phase 4: Campaign Export

Step 1: Generate Universal CSV

Core columns for all exports:

linkedin_url, first_name, last_name, company, title, connection_request, followup_1, followup_2, followup_3, inmail_subject, inmail_body

Step 2: Format for Selected Tool

Dripify:

  • Column mapping: Profile URL → linkedin_url, Note → connection_request, Message 1 → followup_1, etc.
  • Dripify expects one row per lead with all messages in separate columns
  • Export format: CSV with headers matching Dripify's import template

Botdog:

  • Column mapping: linkedin_profile_url → linkedin_url, connection_note → connection_request, message_1 → followup_1, etc.
  • Export format: CSV

Expandi:

  • Column mapping: LinkedIn URL → linkedin_url, Connection message → connection_request, Follow-up #1 → followup_1, etc.
  • Supports InMail columns: InMail subject, InMail message
  • Export format: CSV

PhantomBuster:

  • Column mapping: profileUrl → linkedin_url, message → connection_request
  • PhantomBuster typically handles one action at a time — may need separate CSVs for connection + follow-ups
  • Export format: CSV

Manual / Other:

  • Use the universal CSV format
  • Provide column descriptions and tool-agnostic import instructions
  • Ask user what format their tool expects, adjust if needed

Step 3: Save Files

skills/linkedin-outreach/output/{campaign-name}-{YYYY-MM-DD}.csv

Create the output/ directory if it doesn't exist.

Step 4: Optional Google Sheet

If user wants a review sheet, use google-sheets-write capability to create a sheet with:

  • Tab 1: Lead list with all messages (one row per lead)
  • Tab 2: Sequence templates (the master templates used)
  • Tab 3: Campaign config summary

Phase 5: Review & Approval

Present campaign summary:

Campaign: {name}
Tool: {dripify/botdog/expandi/etc.}
Leads: {count}
Sequence: Connection + {followup_count} follow-ups + InMail
Timing: Day 0 → Day {last_day}
Tone: {preset_name}
Signal types: {breakdown by signal type}
Leads with rich signal: {count} ({percentage}%)
Leads with lean signal: {count} ({percentage}%)
Export file: {file_path}

Hard Approval Gate

Do NOT mark the campaign as ready without explicit user confirmation. Present the summary, then ask: "Ready to finalize? Type 'yes' to mark as ready for import."

After approval:

  • Tell user the file is ready for import into their LinkedIn tool
  • Provide the file path
  • Give tool-specific import instructions (see Phase 4)
  • Remind user to verify the first 5-10 messages look correct after import

Phase 6: Logging

Database Write Policy

All database writes in this phase require the user's prior approval from the finalization gate in Phase 5. Since LinkedIn campaigns are always exported (never auto-launched), confirm with the user before logging to outreach_log — they may not have actually imported the campaign into their LinkedIn tool yet. Only log after the user confirms the export is final.

Log to Supabase

After export and user confirmation, insert records into outreach_log:

POST /rest/v1/outreach_log
Prefer: return=minimal

[
  {
    "person_id": "{person_uuid}",
    "campaign_name": "{campaign_name}",
    "channel": "linkedin",
    "tool": "{dripify/botdog/expandi/phantombuster/manual}",
    "sent_date": "{ISO timestamp}",
    "status": "exported",
    "client_name": "{client_name}"
  },
  ...
]

Or use the shared client:

client.log_outreach(entries)

Status is "exported", not "sent". LinkedIn tools are browser-based — we can't confirm delivery. The status changes to "sent" when the user confirms they launched the campaign in their tool.

Update People Records

Update last_contacted on the people table for all people in this campaign:

PATCH /rest/v1/people?id=in.({person_ids})
{ "last_contacted": "{ISO timestamp}" }

Present Summary

Campaign: {name}
{count} people logged to outreach_log (channel: linkedin)
last_contacted updated for {count} people
Cooldown active until: {date + 84 days}
Next eligible re-contact: {date}
File ready: {file_path}

Cooldown Enforcement Rules

Reference section for cooldown logic used throughout this skill. Shared with cold-email-outreach.

RuleDetail
Default cooldown84 days (12 weeks) from sent_date
Cross-channelCooldown applies across email AND LinkedIn. A lead emailed recently is in cooldown for LinkedIn too.
Bounced leadsExempt from cooldown (email only — LinkedIn doesn't bounce). Filter: status=neq.bounced when checking cooldown
Active campaign leadsAlways ineligible — if a lead is in an active campaign on any channel, they cannot be added to another campaign
User overrideUser can explicitly override cooldown for specific leads — ask for confirmation before allowing
Null last_contactedLeads never contacted are always eligible

Output Directory

Campaign exports are saved to:

skills/linkedin-outreach/output/

Create this directory if it doesn't exist. Files are named {campaign-name}-{YYYY-MM-DD}.csv.

平台分布

Codex

35.74%
按下载量换算68

Claude

27.68%
按下载量换算53

Cursor

17.96%
按下载量换算34

Gemini CLI

9.27%
按下载量换算18

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

可疑

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills