Install
$ agentstack add skill-kushal238-outreach-agent-skill-outreach-agent-skill ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Outreach Agent
Create reviewed Gmail drafts (never send) of personalized outreach to people at the user's target companies, so the user can review and send them by hand.
Prerequisites — verify before doing anything
- Apollo MCP connected (people-search + people-enrichment tools available).
- Gmail MCP connected (
create_draft,list_draftsavailable).
If either is missing, STOP and point the user to SETUP.md. Do not try to substitute another data source or guess email addresses.
Contact source — pick ONE
- CSV (preferred): read the CSV named in
contacts_csvintargets.yaml(default
contacts.csv). Use it and skip steps 1-2 below. Map columns: First Name, Last Name, Title, Company, Email, Email Status. Use only rows where Email is non-empty. All email statuses are fair game — do not filter by status.
- Apollo MCP (needs a paid plan): if no CSV, run steps 1-2 (search + enrich). On a free
plan these return API_INACCESSIBLE — fall back to asking the user for a CSV.
Inputs — read these two files from this skill's folder
targets.yaml— who the user is (name, background) +daily_cap. With a CSV, the
titles/companies fields are ignored (the CSV is the target list).
template.md— the email template. The actual template is the content under the
## Template heading; the first line of it is the Subject: line.
If your_name or your_background in targets.yaml is blank, STOP and ask the user to fill them in — personalization and the signature depend on them.
Procedure
- Find people. For each target company × title, use Apollo people-search to find
matching people for the user's field. Pull at most ceil(daily_cap / number_of_companies) per company so the run stays under the cap. Prefer recruiters and hiring managers.
- Enrich. Use Apollo enrichment to reveal each person's verified email.
Drop anyone without a verified email. Never guess or construct an address.
- Dedupe. For each remaining candidate:
- Check
completed.csvin this skill's folder. Skip anyone whose email appears there — they've already been contacted. - Check Gmail with
list_draftsandsearch_threads(query their email). Skip anyone already drafted or previously emailed. - Track who was skipped and why.
- Respect the cap. Never create more than
daily_capdrafts in one run. If more
qualified candidates remain, list the overflow and stop at the cap.
- Personalize (tiny adjustment). Render the template for each contact:
- Fill
{{first_name}},{{company}},{{title}},{{your_name}},{{your_background}}
from the data.
- For
{{custom_line}}, write one sentence grounded only in real, known facts
(their title, team, company). Never fabricate anything about the person.
- Keep all other wording exactly as written — the template is the user's voice.
- Confirm if large. If more than 5 drafts will be created, show the user the candidate
list (name, company, title, email) and get an explicit confirm before creating any drafts.
- Create drafts. Use Gmail
create_draftwith the contact's email asto, the rendered
subject, and the rendered body. Never call any send tool.
- Report. Output a table:
Name | Company | Title | Email | Draft created? | Skipped (reason).
Remind the user to review every draft in Gmail before sending.
After sending
When the user confirms they've sent emails from the drafts:
- Remove those contacts from
contacts.csv. - Append them to
completed.csv(same folder), adding today's date in theDate Sentcolumn. completed.csvcolumns:First Name, Last Name, Title, Company, Email, Email Status, List, Date Sent.- Never delete contacts — only move them. This prevents re-drafting to already-contacted people.
Hard rules
- Drafts only. Never send.
- Never invent, guess, or pattern-match an email address — only use Apollo-verified emails.
- Never fabricate facts about a person in
{{custom_line}}. - Stay at or under
daily_cap. - Confirm with the user before creating more than 5 drafts in a run.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: kushal238
- Source: kushal238/outreach-agent-skill
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.