{"id":51231216,"url":"https://github.com/jeremylongshore/intent-outreach","last_synced_at":"2026-06-28T16:30:58.139Z","repository":{"id":359716466,"uuid":"1087433437","full_name":"jeremylongshore/intent-outreach","owner":"jeremylongshore","description":"ADK-based SDR orchestration on Vertex AI Agent Engine. Routes leads through Research, Enrich, and Outreach agents with BYO data provider keys (Clay, Apollo, Clearbit).","archived":false,"fork":false,"pushed_at":"2026-06-17T00:26:58.000Z","size":99509,"stargazers_count":3,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T01:15:39.938Z","etag":null,"topics":["a2a-protocol","agent-engine","ai-agents","apollo","clay","clearbit","firestore","google-adk","intent-solutions","lead-enrichment","sales-development","sdr-automation","typescript","vertex-ai"],"latest_commit_sha":null,"homepage":"https://pipelinepilot-prod.web.app","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jeremylongshore.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["jeremylongshore"],"buy_me_a_coffee":"jeremylongshore"}},"created_at":"2025-10-31T22:48:37.000Z","updated_at":"2026-06-17T00:27:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jeremylongshore/intent-outreach","commit_stats":null,"previous_names":["jeremylongshore/pipelinepilot","jeremylongshore/intent-outreach"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jeremylongshore/intent-outreach","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremylongshore%2Fintent-outreach","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremylongshore%2Fintent-outreach/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremylongshore%2Fintent-outreach/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremylongshore%2Fintent-outreach/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jeremylongshore","download_url":"https://codeload.github.com/jeremylongshore/intent-outreach/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeremylongshore%2Fintent-outreach/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34896652,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a-protocol","agent-engine","ai-agents","apollo","clay","clearbit","firestore","google-adk","intent-solutions","lead-enrichment","sales-development","sdr-automation","typescript","vertex-ai"],"created_at":"2026-06-28T16:30:57.580Z","updated_at":"2026-06-28T16:30:58.133Z","avatar_url":"https://github.com/jeremylongshore.png","language":"JavaScript","funding_links":["https://github.com/sponsors/jeremylongshore","https://buymeacoffee.com/jeremylongshore"],"categories":[],"sub_categories":[],"readme":"# Intent Outreach\n\n**AI outbound prospecting for founders who do their own selling — research → enrich → outreach, in\nClaude Code, with your own model.**\n\nIntent Outreach is a model-agnostic, Claude-Code-native SDR orchestrator. It researches companies,\nenriches the leads, and drafts personalized outreach — running **fully on your machine**, with **your\nown** data-provider and model keys, and **zero Google dependency**. Claude is the default model; bring\nan OpenAI / Grok / Gemini key once it's passed the eval gate.\n\nAs a Claude Code plugin, an **orchestrator skill** (`/intent-outreach`) dispatches **phase sub-agents**\n(research → enrich → draft) over a **bundled MCP server** that houses your data-provider APIs — keeping\neach phase in its own context while the orchestrator checkpoints with you between stages.\n\n\u003e Built for technical founders / indie SaaS \u0026 AI startups who do their own outbound — no SDR\n\u003e headcount, no per-seat data tools, you own your keys and your data.\n\n---\n\n## Why it's different\n\n- **Local-only.** Runs on your machine. No hosted database, no telemetry, no server-side retention.\n  Run records go to a local JSONL file (`~/.intent-outreach/runs.jsonl`).\n- **BYO keys.** Connector + model keys live in your environment (or a local file). They're read\n  locally and sent only to each provider's own API — never to us, never to a cloud secret store.\n- **Deterministic where it matters.** Connectors are called in a fixed order in code; the model is\n  called only at two seams (fit-scoring, drafting). The LLM never decides which API to hit.\n- **A real data model + a hard gate.** Every record is a validated value type. Un-validated model\n  output **cannot** reach storage — it's a compile error, and a CI invariant.\n- **Model-agnostic, but earned.** A provider is \"supported\" only after it passes golden evals. No\n  silent-quality surprises from a weak model dropping a tool call.\n- **Pluggable connectors.** Ships adapters for Apollo, Hunter, People Data Labs, Exa, Crunchbase,\n  LeadMagic, Clay, Clearbit, and ZoomInfo — and a registry so you can add your own in one file.\n\n## Two ways to run it\n\n### 1. Claude Code plugin (primary)\n\n```text\n/plugin marketplace add jeremylongshore/intent-outreach\n/plugin install intent-outreach@jeremylongshore\n```\n\nThen invoke the skill (`/intent-outreach`) with an ICP and some domains. The skill drives the bundled\n**Intent Outreach MCP server** through deterministic Research → Enrich → Outreach phases, checkpoints\nwith you between each, drafts grounded messages, and saves a **validated** run locally.\n\nThe plugin also ships:\n\n- **Phase sub-agents** — the orchestrator skill dispatches one per stage via the `Task` tool:\n  `outreach-researcher` (Phase 1, one per domain — fan-out), `outreach-enricher` (Phase 2),\n  `outreach-drafter` (Phase 3, grounded score + draft). Each keeps its own context and calls only the\n  deterministic MCP tools for its stage; the orchestrator aggregates and checkpoints with you.\n- **Companion skills (slash commands)** — `/outreach-connectors` (which data connectors are\n  configured), `/outreach-research` (quick Phase-1-only research without a full campaign),\n  `/outreach-profile` (inspect or scaffold a Report Profile). Each is a focused, user-invocable skill.\n- **A `SessionStart` hook** that prints a one-line connector-readiness status.\n\n### 2. Standalone CLI\n\n```bash\nnpm install                    # only needed to develop/regenerate; the bundle is committed\nnode bundle/cli.mjs run --icp \"B2B SaaS founders doing their own outbound\" \\\n                        --domains acme.com,globex.com --channel email\nnode bundle/cli.mjs connectors   # which connectors are configured\nnode bundle/cli.mjs providers    # model providers + eval-gate status\n```\n\n`bundle/cli.mjs` and `bundle/server.mjs` are committed, dependency-inlined builds (so the plugin runs\non a fresh clone with no `node_modules`); regenerate them with `npm run bundle`.\n\n## Keys (bring your own)\n\nSet only the providers you want; unset connectors are silently skipped. **Apollo + Hunter both have\nfree tiers, so a full campaign can run for $0.**\n\n| Env var | Provider | Tier |\n|---|---|---|\n| `APOLLO_API_KEY` | Apollo.io — company, people, enrichment | free (50/mo) |\n| `HUNTER_API_KEY` | Hunter.io — email finding/verification | free (50/mo) |\n| `PDL_API_KEY` | People Data Labs — person/company enrichment | free (100/mo) |\n| `EXA_API_KEY` | Exa — web research context | free (1k/mo) |\n| `CRUNCHBASE_API_KEY` | Crunchbase — funding/investors | paid |\n| `LEADMAGIC_API_KEY` | LeadMagic — email + mobile finding | paid |\n| `CLAY_API_KEY` + `CLAY_WEBHOOK_URL` | Clay — middleware (push-only) | paid |\n| `CLEARBIT_API_KEY` | Clearbit — enrichment | legacy (pre-2024 keys only) |\n| `ZOOMINFO_JWT` | ZoomInfo — enrichment | enterprise |\n| `ANTHROPIC_API_KEY` | Claude (default model) | — |\n| `OPENAI_API_KEY` / `XAI_API_KEY` / `GEMINI_API_KEY` | alternate models (eval-gated) | — |\n\nTo drive a non-Anthropic model from inside Claude Code, point `ANTHROPIC_BASE_URL` at an LLM gateway\n(LiteLLM/Bifrost). See `000-docs/017-AT-DECR`.\n\n## Architecture (one screen)\n\n```\norchestrator skill  ─┐                     ┌─ research_domain ─┐\n  → phase agents     ├─► Intent Outreach ──┤  enrich_lead       ├─► pipeline_core\n  (R→E→O, fixed)     │     MCP server      └─ save_run ─────────┘   (framework-free)\nstandalone CLI ──────┘                                               │\n                                                                     ├─ connectors/ (registry; 9 adapters)\n  research() → enrich()  : deterministic, fixed connector order      ├─ providers.ts (Vercel AI SDK; eval-gated)\n  score() → draft()      : the ONLY LLM calls (structured output)    ├─ validator.ts (the gate: Validated\u003cT\u003e brand)\n  validate → save        : un-validated output can't be stored       └─ store.ts (local JSONL; never hosted)\n```\n\n- **`pipeline_core/`** — the framework-free spine (CI-guarded against any Google/cloud import).\n- **`mcp/server.ts`** — one stdio MCP server, thin wrapper over `pipeline_core`.\n- **`skills/intent-outreach/SKILL.md`** — the orchestrator skill; dispatches phase agents in fixed order.\n- **`skills/outreach-{connectors,research,profile}/`** — focused companion skills (the slash commands).\n- **`agents/`** — phase sub-agents (`outreach-researcher`, `outreach-enricher`, `outreach-drafter`).\n- **`hooks/`** — `SessionStart` connector-readiness hook.\n- **`prompts/`** — versioned, eval-gated prompt files.\n- **`evals/`** — golden fixtures + scorers; the supported-provider gate.\n- **`profiles/`** — Report Profiles: declarative output customization (starter profiles included).\n\n## Develop\n\n```bash\nnpm install\nnpm run typecheck      # tsc --noEmit\nnpm test               # vitest\nnpm run build          # → dist/ (also copies prompts/)\nnpm run mcp            # run the MCP server on stdio (tsx)\nnpx tsx evals/run.ts --offline   # the free, deterministic eval gate\n```\n\n## License\n\nIntent Solutions Proprietary — see `LICENSE`.\nBuilt by Jeremy Longshore · intentsolutions.io\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeremylongshore%2Fintent-outreach","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeremylongshore%2Fintent-outreach","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeremylongshore%2Fintent-outreach/lists"}