The canonical Yalc skill for LinkedIn and email outreach. Wraps the Unipile API as 9 high level verbs Claude can compose without ever touching HTTP.
Any of these natural language phrases activates the skill inside Claude Code.
The Unipile Outreach skill is a thin wrapper around our Unipile CLI at `~/bin/unipile/cli.mjs`, exposing 9 verbs to Claude Code: status, accounts, connect, send-message, send-connection, send-email, search-linkedin, profile, company. Combined, these cover every LinkedIn or email action a GTM operator runs in a day.
For Yalc workflows, this is the message layer. Where Crustdata supplies the audience and Claude drafts the copy, Unipile Outreach actually sends. The skill handles the friction (account auth, provider_id resolution, dry runs) so the operator can stay in the conversation instead of context switching to a CLI or web app.
The Unipile Outreach skill sits at the **send** node for both LinkedIn and email. It also doubles as a discovery node when you use `search-linkedin` or `profile` for last mile lookups before send.
The skill assumes upstream work is done: you have an account list, you've drafted the message, you know who to send to. The skill handles the act of sending. That's the right abstraction for a Yalc workflow because it lets Claude orchestrate the higher level decision (who, what, when) while delegating the wire to a battle tested verb.
The send and last mile discovery node. Yalc invokes this skill when it's time to actually contact a person on LinkedIn or via email. The skill returns structured JSON Yalc writes back to Notion or HubSpot.
UNIPILE_API_KEY (Access Token from Unipile dashboard)UNIPILE_DSN (Base URL e.g. https://api18.unipile.com:14891, rotates with infrastructure)Requires the Unipile CLI at `~/bin/unipile/cli.mjs`. The skill assumes Node 18+ and at least one connected Unipile account. First run through `status` verifies both env vars and the DSN's reachability.
The skill is opinionated. It exposes 9 high level verbs (`send-message`, `send-connection`, etc.) with built in dry run, provider_id resolution, and Notion writeback hooks. The MCP exposes the raw Unipile API surface. For Yalc workflows the skill is the right abstraction; for one off scripts the MCP is fine.
No. The DSN is part of how the API call is signed. The CLI returns a clear error if either env var is missing. Yalc's `gtm-os` env file template includes both placeholders.
Run `connect LINKEDIN`. The skill returns a Hosted Auth URL that expires in 15 minutes. Open it in a browser, authenticate, return to Claude Code. Verify with `accounts` to confirm `OK` status.
The send verbs handle send. For inbox listening, pair with the planned Unipile webhook receiver skill (or the Unipile MCP `list-messages` verb). The send and listen layers are deliberately separate.
LinkedIn flags behavioral patterns regardless of which API you use. The skill's per account daily limits respect LinkedIn's. The risk is when you push above what a human could plausibly do (60+ invites, 100+ messages per day per account). Stay within human plausible volume.
Yes. The `search-linkedin` verb supports `--api classic|sales_navigator|recruiter`. If your connected account has Sales Nav, the skill can run Sales Nav searches.
Clone the Yalc skill set, drop in your env, run from your next Claude Code session.
gh repo clone Othmane-Khadri/YALC-the-GTM-operating-system && cp -r YALC-the-GTM-operating-system/.claude/skills/unipile-outreach ./.claude/skills/