Systems Lab

Agent skill

lead-sourcing-linkedin

Source leads via LinkedIn Sales Navigator by translating role-based and trigger-based ICP criteria into Sales Nav search URLs and filter recipes, executing via session-based tools or manual CSV export, and normalizing to the canonical Lead schema with strict ToS compliance.

slowingNeeds a keyActs undeclared1,306 words

Filed under LinkedIn and social.

From devangk003/gtm-agent-skills · 32 skills · 0 · pushed 2026-06-18

What it does when it runs

Source leads via LinkedIn Sales Navigator by translating role-based and trigger-based ICP criteria into Sales Nav search URLs and filter recipes, executing via session-based tools or manual CSV export, and normalizing to the canonical Lead schema with strict ToS compliance. Use when the play is role/trigger-driven, when Sales Nav surfaces signals Apollo can't see, or when LinkedIn URL is required as the dedup key.

Read from the skill and the 6 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • AGENTIC_APP_TOKEN
  • ATTIO_ACCESS_TOKEN
  • ATTIO_API_KEY
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
writes files

Ask about lead-sourcing-linkedin

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/devangk003/gtm-agent-skills.git /tmp/gtm-agent-skills
git -C /tmp/gtm-agent-skills sparse-checkout set "lead-sourcing-linkedin"
mkdir -p ~/.claude/skills/lead-sourcing-linkedin
cp -R "/tmp/gtm-agent-skills/lead-sourcing-linkedin/." ~/.claude/skills/lead-sourcing-linkedin/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs AGENTIC_APP_TOKEN, ATTIO_ACCESS_TOKEN, ATTIO_API_KEY, which you have to obtain separately.

Reproduced in full from devangk003/gtm-agent-skills/blob/6b9a1b0094ffd83d6c02bc03b7ce1610661a1644/lead-sourcing-linkedin/SKILL.md, which is licensed MIT (skill frontmatter). 1,306 words, 11 headings.

Lead Sourcing — LinkedIn

Source leads via Sales Navigator's role- and trigger-based search filters with strict ToS compliance. Emit search URLs + filter recipes, execute via session-based tools (PhantomBuster, HeyReach) or manual CSV export, normalize to the Lead schema. LinkedIn URL is the primary person dedup key. A parallel browser-use path exists for users without a Sales Nav seat (see Procedure step 0).

Clarification Protocol

When you encounter any of the following, STOP and ask the user — do NOT make a silent assumption, and do NOT flatly refuse:

  • Ambiguous or missing input
  • A fork in approach (multiple valid frameworks, segments, scopes, or sources)
  • A rule that would block progress
  • An assumption that materially shapes the output
  • Unverified data that a downstream step depends on

Present 2–4 concrete options with trade-offs and your recommendation.

Format:

Decision needed: <what's being decided> Options:

  • A) <option> — trade-off
  • B) <option> — trade-off
  • C) <option> — trade-off My recommendation: <X> because <reason>. Confirm or pick a different option before I continue.

Refusing to proceed is NEVER the final answer. Every "block" must come with an override option. If the user picks an override, honor it on the first request — do not re-prompt the same block multiple times in one run.

Scope

This skill ONLY produces LinkedIn-sourced lead CSV records (Sales Navigator OR browser-use path). Do not expand into adjacent topics. If the user's request implies adjacent scope, trigger Clarification Protocol with options to (A) stay in scope, (B) note the adjacent need as a follow-up, (C) hand off to a different skill.

Verification Requirements (Derived Details Only)

The search action itself does NOT require web verification — LinkedIn returns are first-party for sourcing. However, every derived person/company detail that this skill or downstream skills will state as fact (titles, seniorities, company size, technographics) MUST be verified or marked [UNVERIFIED] before push.

  • Tag derived details inline as [H/M/L][Sn].
  • Source URL goes in the lead record's provenance field.
  • Unverified derived details belong in ## Assumptions to Validate, NOT in the lead's main fields.

Sources are mandatory for derived claims. If you cannot cite a source, mark [UNVERIFIED].

When to Use

  • "Find VPs who started their current role in the last 90 days"
  • User wants role/trigger-driven plays — leadership shifts, recent hires, active LinkedIn presence
  • Sales Nav surfaces signals Apollo can't see (fresh role changes, posts)
  • User has a Sales Nav seat and needs search filters
  • User exported Sales Nav CSV and wants it ingested
  • LinkedIn URL is required as the primary dedup key

Legend — Confidence Score (derived fields)

  • [H] — verified primary source (LinkedIn first-party, company website)
  • [M] — single secondary source (third-party DB, news article)
  • [L] — inferred (pattern guess, similar-company extrapolation)

Quick Reference

ConceptValue
PathsSales Navigator (seat required) OR browser-use (manual login, no seat)
ModesAPI-substitute (PhantomBuster/HeyReach) / Manual (Sales Nav UI) / BYO (CSV) / Browser-use
Direct scrapingDefault OFF — see browser-use ToS gate for throttled small-batch override
Primary merge keylinkedin_url — highest-confidence in this skill
Sales Nav UI cap25 leads/page; 1,000 results per search
Trigger filters"Years in Current Position <1 year", "Posted on LinkedIn past 30d", "Changed jobs past 90d"
Email coverageSales Nav rarely surfaces email — data-enrichment mandatory next
PhantomBuster pacing50–100 profiles/day per session is safe
CompliancePublic-profile content only; session-based tools acceptable; direct-scraping refused

Procedure

  1. Pick the path. Trigger Clarification Protocol: "Sales Navigator path or browser-use path? (A) Sales Nav (faster, requires seat) (B) Browser-use (manual login, no seat needed, lower throughput) (C) Cancel." Honor user choice on first response. If B, jump to "Alternative Path" section.
  2. Confirm ICP grounding. Read ICP scorecard from icp-definition. Extract role map and trigger library. If absent, flag ungrounded and trigger Clarification Protocol with options to (A) proceed with default rubric (lower confidence), (B) load ICP first, (C) cancel.
  3. Determine mode. Sales Nav seat + PhantomBuster/HeyReach key → API-substitute. Else seat alone → manual (output URL). Else CSV → BYO. Else → URL + recipe only. If user requests direct scraping outside the browser-use path, default to refusing and trigger Clarification Protocol with options (A) switch to browser-use throttled small-batch, (B) use BYO CSV, (C) override with explicit ToS acknowledgment (output flagged lower-confidence: tos-override).
  4. Translate ICP → Sales Nav filter set. Map titles → Title (Boolean); seniority → Seniority Level; function → Function; geography → Geography; trigger-recency → Years in Current Position <1 year; active-poster → Spotlights: Posted on LinkedIn past 30d. Output: search URL + recipe. If pre-flight count is <20 or >5000, trigger Clarification Protocol on widening/narrowing the search criteria. Reference ${HERMES_SKILL_DIR}/references/linkedin-deep-reference.md for filter patterns.
  5. Pre-flight: discover(). Small-batch PhantomBuster job (50 profiles) or user reports UI count. Surface count, cost, sample of 5. Wait for explicit authorization.
  6. Execute. API-substitute: submit Phantom, collect CSV. Manual: user runs search, exports. BYO: user uploads CSV.
  7. Normalize to Lead schema. LinkedIn URL is primary identity. Stamp provenance: [verified: linkedin-sales-nav] or [verified: linkedin-browser-use] for native fields; [user-provided] for BYO. Tag derived fields [H/M/L]. Email typically absent → tag unverified. Run ${HERMES_SKILL_DIR}/scripts/normalize_lead.py.
  8. Dedup + compliance + push. linkedin_url doubled in priority as merge key. Run ${HERMES_SKILL_DIR}/scripts/dedup_leads.py. GDPR EU tagging; ToS reminder in run record. Run ${HERMES_SKILL_DIR}/scripts/push_to_crm.py. Summary recommends data-enrichment MANDATORY next.

Alternative Path: Browser-Use Flow (No Sales Navigator)

For users without a Sales Nav seat or who prefer manual control. Open LinkedIn in a browser session via the browser tool/MCP, then prompt the user to log in manually — never handle credentials, never request password/email/OTP/cookies. After confirmed login, drive search/scroll/extract through browser automation; throttle requests to mimic human behavior; respect ToS.

Before scraping at volume, surface the ToS gate: "LinkedIn ToS prohibits automated scraping at volume. Confirm: (A) proceed with throttled small-batch (≤50 profiles/day) (B) cancel. Acknowledge that you accept the ToS risk if proceeding." Honor user choice on first response.

Output uses the same CSV schema as the Sales Nav path, with source = linkedin-browser-use. See ${HERMES_SKILL_DIR}/references/browser-use-flow.md for full step-by-step.

Pitfalls

  • Direct LinkedIn scraping outside the throttled browser-use path — forbidden by ToS; account-suspension and legal risk; default OFF and require explicit user override
  • Skipping data-enrichment — LinkedIn rarely provides email; outreach without enrichment will bounce
  • Promoting Sales Nav recency past freshness — "started 5 days ago" may be 5 weeks ago in reality
  • Inventing LinkedIn URLs — profile URLs are predictable but fabricating them is forbidden
  • Ignoring session-safety — aggressive PhantomBuster usage flags accounts; pace 50–100/day
  • Mistaking "LinkedIn Member" privacy-mode profiles as skip-able — surface count, don't suppress

Verification

  1. sales_nav_search_url resolves to the same filter set on replay
  2. Every record's LinkedIn URL is canonical (/in/<handle>, no tracking params)
  3. Provenance tags accurately reflect source path (Sales Nav vs PhantomBuster vs BYO)
  4. data-enrichment is recommended before any outreach run
  5. Privacy-mode and partial profiles routed to review queue

Output Format

  • Sections required: Lead CSV, Run Summary, Assumptions to Validate
  • Tables / fields: Per CSV schema in ${HERMES_SKILL_DIR}/references/csv-schema.mdlead_id, contact_name, contact_title_raw, contact_title_normalized, contact_seniority, contact_function, contact_linkedin_url, contact_email_primary, contact_email_status, contact_phone_primary, contact_phone_status, company_name, company_domain, company_industry, company_size_employees, company_size_band, company_location, company_tech_stack, signals (JSON), personalization_hook, source (linkedin-sales-nav OR linkedin-browser-use), source_query, source_run_id, freshness_date, provenance_<field>
  • Length target: Up to gtm.sourcing_run_record_cap records per run; Run Summary ≤300 words
  • File type: CSV (UTF-8, RFC 4180) + markdown summary
  • Mandatory closing sections: Run Summary (counts, mode, ToS posture), Assumptions to Validate (any [UNVERIFIED] derived fields), Recommended Next Skill (data-enrichment)

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what lead-sourcing-linkedin does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.