Pp Contact Goat
Super LinkedIn for the terminal. Search, enrich, and map warm-intro paths across LinkedIn (stickerdaniel/linkedin-mcp-server subprocess), Happenstance (cookie-first free quota with bearer-API fallback), and Deepline (paid enrichment). Two Happenstance auth surfaces coexist: Chrome cookie session (free monthly allocation) and HAPPENSTANCE_API_KEY bearer (paid credits, deeper schema). Use when the user asks who they know at a company, how to get a warm intro, who to prospect, or wants cross-source dossiers, network diffs, or waterfall enrichment.
- Skill ID
- mvanhorn/printing-press-library/pp-contact-goat
- Publisher
- mvanhorn
- Repository
- printing-press-library
- Installs
- 0
- Files
- 1
- License
- Apache-2.0
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
mvanhorn/printing-press-library/pp-contact-goatInstalls these files- SKILL.md
What this skill tells the agent
<!-- GENERATED FILE — DO NOT EDIT. This file is a verbatim mirror of library/sales-and-crm/contact-goat/SKILL.md, regenerated post-merge by tools/generate-skills/. Hand-edits here are silently overwritten on the next regen. Edit the library/ source instead. See the repository agent guide, section "Generated artifacts: registry.json, cli-skills/". -->
Contact Goat - Printing Press CLI
Prerequisites: Install the CLI
This skill drives the contact-goat-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
- Install via the Printing Press installer. It defaults binaries to
$HOME/.local/binon macOS/Linux and%LOCALAPPDATA%\Programs\PrintingPress\binon Windows: ``bash npx -y @mvanhorn/printing-press-library install contact-goat --cli-only`` - Verify:
contact-goat-pp-cli --version - Ensure the reported install directory is on
$PATHfor the agent/runtime that will invoke this skill.
If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.6 or newer):
go install github.com/mvanhorn/printing-press-library/library/sales-and-crm/contact-goat/cmd/contact-goat-pp-cli@latestIf --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
When to Use This CLI
Reach for this when the user wants:
- coverage of a company (who you already know there, ranked by relationship strength)
- a warm-intro path to a target person (mutual connections across sources)
- prospecting (fan-out search with cross-source dedupe)
- a unified dossier (LinkedIn profile + Happenstance research + optional Deepline enrichment)
- network diffs over time (what's new in your graph in the last N days)
- waterfall enrichment that walks free sources before paid ones
Skip it when the user has a workflow that lives entirely inside LinkedIn Sales Navigator, or when they only need raw LinkedIn scraping with no Happenstance or Deepline overlay (use the LinkedIn MCP directly in that case).
Two Auth Surfaces
Happenstance has two parallel auth paths and the CLI uses both:
| Surface | Auth | Cost | Default? |
|---|---|---|---|
| Cookie web app | Chrome session cookies | Free monthly allocation | YES (auto-prefer) |
| Public REST API | HAPPENSTANCE_API_KEY (Bearer) | 2 credits/search, 1 credit/research | Fallback only |
The auto router prefers cookies until quota is exhausted, then falls back to bearer with an explicit "cost spent" log line on stderr. Use --source api on coverage, hp people, prospect, or warm-intro to opt into bearer explicitly (e.g. for the richer research schema or scoped group searches). Use --source hp to force the cookie surface.
The api hpn * subcommands always use the bearer surface and always cost credits. Provision and rotate keys at https://happenstance.ai/settings/api-keys.
Argument Parsing
Parse $ARGUMENTS:
- Empty,
help, or--help-> runcontact-goat-pp-cli --help - Starts with
installand ends withmcp-> MCP installation (see below) - Starts with
install-> CLI installation (see below) - Anything else -> Direct Use (map the request to the best command and run it)
MCP Server Installation
- Install the MCP server: ``
bash go install github.com/mvanhorn/printing-press-library/library/sales-and-crm/contact-goat/cmd/contact-goat-pp-mcp@latest`` - Register with Claude Code: ``
bash claude mcp add -e DEEPLINE_API_KEY=value -e HAPPENSTANCE_API_KEY=value contact-goat-pp-mcp -- contact-goat-pp-mcp`` Ask the user for actual values of required API keys before running. - Verify:
claude mcp list.
The MCP server exposes 16 tools. The four bearer-API tools added in this release are:
api_search- Run a Happenstance public-API search (costs 2 credits)api_research- Run a deep-research dossier (costs 1 credit on completion)api_groups_list- List Happenstance groups for the caller (free)api_usage- Show live credit balance and usage history (free)
The other 12 tools cover the cookie surface (search, friends, feed, notifications, dossier, etc.) and the LinkedIn / Deepline integrations.
Direct Use
- Check if installed:
which contact-goat-pp-cli. If not found, offer CLI installation (above). - Discover commands:
contact-goat-pp-cli --help. Drill into subcommand help withcontact-goat-pp-cli <command> --helporcontact-goat-pp-cli api hpn <subcommand> --help. - Match the user query to the best command (see Notable Commands below).
- Execute with the
--agentflag for structured, token-efficient output: ``bash contact-goat-pp-cli <command> [args] --agent`` - The
--agentflag sets--json --compact --no-input --no-color --yes.
Source routing (cookie vs bearer) is automatic. The auto router prefers the free cookie surface and falls back to the paid bearer surface only when cookie quota is exhausted, logging a "cost spent" notice on stderr. Pass --source api to opt into bearer explicitly (richer schema, group-scoped searches), or --source hp to force cookies.
Enrichment Preflight (read this before running any enrichment command)
These commands spend Deepline credits and REQUIRE DEEPLINE_API_KEY or a BYOK setup:
waterfall(unless you pass--byokand have BYOK providers configured)dossier --enrich-emaildeepline find-email/enrich-person/email-find/phone-finddeepline search-people/search-companies/enrich-company
Before invoking any of these, verify auth by running doctor first:
contact-goat-pp-cli doctor --agent | grep -i deeplinedeepline_env shows the resolution source:
set (env)—DEEPLINE_API_KEYexported in the current shellset (flag)—--deepline-keypassed on the command lineset (file:~/.local/deepline/<host>/.env)— auto-discovered from the official Deepline CLI's persisted key (the user authenticated withdeepline auth registerordeepline auth status; no shell export needed)not set— none of the above. Ask the user for a key, or for a BYOK Hunter/Apollo key
The auto-discovery path means a user who has the Deepline CLI installed and authenticated does NOT need to re-export the key into their shell — contact-goat reads ~/.local/deepline/code-deepline-com/.env directly (mode 0600, owned by the user). Don't ask the user to re-export when set (file:...) is reported. If deepline_discovery_skipped is also reported, those are candidate files the resolver rejected for a security reason (wrong mode, missing prefix); surface them so the user can fix the underlying issue.
Provider chain by target kind (waterfall):
| Target | Primary | Fallback 1 | Fallback 2 |
|---|---|---|---|
| LinkedIn URL | apollo_people_match | hunter_people_find | contactout_enrich_person |
| apollo_people_match | hunter_people_find | - | |
| Name + --company | dropleads_email_finder | hunter_email_finder | datagma_find_email |
Notes:
- Name targets MUST pass
--company <domain>(or setCONTACT_GOAT_COMPANYenv). - Apollo returns
personal_emails[]when available; treatemail_status: "unavailable"as "no verified work email on file" (the personal email is still usable). - Dropleads returns
status: "catch_all"for domains on Google Workspace; the email is a pattern guess, not a verified mailbox. - Provider-level 403s are surfaced as "Provider not connected" rather than "Check DEEPLINE_API_KEY"; they do not abort the chain. The next provider is tried automatically.
Notable Commands
| Command | What it does |
|---|---|
coverage <company> | Who you know at a company across LinkedIn + Happenstance, ranked by relationship strength |
More from mvanhorn
Use this skill in a project
Open any RiverX project, search the Skills panel for mvanhorn/printing-press-library/pp-contact-goat, and install it in one click.
