Intent Outreach
Purpose
Coordinate a reviewed Research → Enrich → Score and Draft workflow without sending any message. The
bundled MCP server runs configured connectors in fixed registration order and rejects invalid campaign
runs before writing them to the local JSONL store.
Prerequisites
- Enable the bundled
intent-outreach MCP server and its three phase agents:
outreach-researcher, outreach-enricher, and outreach-drafter.
- Export at least one connector credential. Use
list_connectors to learn each connector's exact
environment variable and current runtime note; do not infer account entitlements from its tier label.
- Supply an ICP or offer, one or more domains, a channel (
email or linkedin), and the maximum
contacts to draft per company.
- Treat every provider call as an external network request governed by that provider's terms and quota.
Instructions
- Preflight. Call
list_connectors. Show displayName, tier, phases, keyEnvVar,
configured, and note. If no configured connector supports research, stop and name the relevant
environment variables. Never print credential values.
- Confirm scope. Confirm the ICP, normalized domains, channel, and contacts-per-company. If a
Report Profile is supplied, Read and summarize it before proceeding. Only the profile fields listed
as runtime-mapped in references/report-profiles.md are automatically
applied; obtain explicit confirmation before treating other fields as operational instructions.
- Research. Dispatch
outreach-researcher once per domain. Give each agent only the confirmed
domain and ICP. Aggregate its returned leads, contacts, and connector status, then deduplicate by
stable domain/email identifiers. Show the results and use AskUserQuestion to ask which leads to keep.
- Enrich. Dispatch
outreach-enricher once per kept lead with that lead and its contacts. Preserve
the returned provider attribution and timestamps. Show the new signals; empty or partial output is
valid.
- Score and draft. Dispatch
outreach-drafter once per kept lead with the ICP, lead, contacts,
enrichments, channel, limit, and applicable style override. Require every claim to be supported by
the supplied data. Show every draft and ask the user to approve, edit, reject, or stop.
- Save only after approval. Assemble the exact
save_run input: id, icp, domains,
provider, model, leads, contacts, enrichments, messages, and skippedConnectors. Each
message must include contactKey, channel, body, cta, model, promptVersion, and
createdAt; subject and fitScore are optional. Call save_run only after the approval checkpoint.
- Report the receipt. Return the run id, status, local path, record counts, connector failures, and
confirmation that nothing was sent.
Safety and data handling
- Never invent a person, address, company fact, funding event, customer, metric, or relationship.
- Never display secrets. Connector credentials are read from environment variables and sent only to
the corresponding provider API by that connector.
save_run writes locally to $INTENT_OUTREACH_HOME/runs.jsonl, or
~/.intent-outreach/runs.jsonl when that variable is unset. It does not send outreach.
- This repository's license permits only the uses stated in
LICENSE; do not describe it as open source.
Output
Return a compact campaign receipt containing:
- researched, retained, enriched, and drafted counts;
- connectors that ran, skipped, or failed;
- approved drafts and their grounded source signals;
- the
save_run result and local path, if the user approved persistence.
Error handling
- No research connector configured: stop before dispatch and show the relevant
keyEnvVar values.
- Connector failure: retain the runtime's skipped/failed result, continue with other connectors, and
label the campaign partial.
- Empty or thin evidence: report it honestly; allow a generic draft only when the user wants one.
- Agent failure: identify the affected domain or lead and continue only with intact results.
- Validation failure: correct the field named by
save_run and retry only with the user's approved
content. Never bypass the validator or write directly to the run store.
Examples
User: /intent-outreach — ICP: seed-stage developer-tool founders; domains: example.com; email; one contact
Call list_connectors, confirm scope, research the domain, pause for lead selection, enrich retained
leads, draft from returned evidence, pause for message approval, then call save_run. If the connector
returns no evidence, say so; do not substitute a plausible company fact.
- Example: campaign with no configured research connector. Stop after preflight and return the
environment-variable names from the registry; do not dispatch agents.
- Example: partial provider failure. Continue with intact provider results, mark the affected domain
partial, and preserve the skipped connector in the save payload.
- Example: rejected drafts. Do not call
save_run; return the reviewed research receipt and state
that no campaign record or message was written.
When troubleshooting a failed save, compare the submitted field named in the validation error with the
MCP input schema, correct only that field, and preserve the approved message content.
Resources
- Report Profile contract
- Runtime and persistence contract
- Companion skills:
outreach-connectors, outreach-profile, and outreach-research
1---2name: intent-outreach3description: Run a local research, enrichment, and outreach-drafting workflow over company domains with bring-your-own provider keys. Use when a user wants a reviewed SDR campaign or grounded cold-email drafts. Trigger with "run an outreach campaign", "prospect these companies", or "/intent-outreach".4license: SEE LICENSE IN LICENSE5---67# Intent Outreach89## Purpose1011Coordinate a reviewed Research → Enrich → Score and Draft workflow without sending any message. The12bundled MCP server runs configured connectors in fixed registration order and rejects invalid campaign13runs before writing them to the local JSONL store.1415## Prerequisites1617- Enable the bundled `intent-outreach` MCP server and its three phase agents:18 `outreach-researcher`, `outreach-enricher`, and `outreach-drafter`.19- Export at least one connector credential. Use `list_connectors` to learn each connector's exact20 environment variable and current runtime note; do not infer account entitlements from its tier label.21- Supply an ICP or offer, one or more domains, a channel (`email` or `linkedin`), and the maximum22 contacts to draft per company.23- Treat every provider call as an external network request governed by that provider's terms and quota.2425## Instructions26271. **Preflight.** Call `list_connectors`. Show `displayName`, `tier`, `phases`, `keyEnvVar`,28 `configured`, and `note`. If no configured connector supports research, stop and name the relevant29 environment variables. Never print credential values.302. **Confirm scope.** Confirm the ICP, normalized domains, channel, and contacts-per-company. If a31 Report Profile is supplied, Read and summarize it before proceeding. Only the profile fields listed32 as runtime-mapped in [references/report-profiles.md](references/report-profiles.md) are automatically33 applied; obtain explicit confirmation before treating other fields as operational instructions.343. **Research.** Dispatch `outreach-researcher` once per domain. Give each agent only the confirmed35 domain and ICP. Aggregate its returned leads, contacts, and connector status, then deduplicate by36 stable domain/email identifiers. Show the results and use AskUserQuestion to ask which leads to keep.374. **Enrich.** Dispatch `outreach-enricher` once per kept lead with that lead and its contacts. Preserve38 the returned provider attribution and timestamps. Show the new signals; empty or partial output is39 valid.405. **Score and draft.** Dispatch `outreach-drafter` once per kept lead with the ICP, lead, contacts,41 enrichments, channel, limit, and applicable style override. Require every claim to be supported by42 the supplied data. Show every draft and ask the user to approve, edit, reject, or stop.436. **Save only after approval.** Assemble the exact `save_run` input: `id`, `icp`, `domains`,44 `provider`, `model`, `leads`, `contacts`, `enrichments`, `messages`, and `skippedConnectors`. Each45 message must include `contactKey`, `channel`, `body`, `cta`, `model`, `promptVersion`, and46 `createdAt`; `subject` and `fitScore` are optional. Call `save_run` only after the approval checkpoint.477. **Report the receipt.** Return the run id, status, local path, record counts, connector failures, and48 confirmation that nothing was sent.4950## Safety and data handling5152- Never invent a person, address, company fact, funding event, customer, metric, or relationship.53- Never display secrets. Connector credentials are read from environment variables and sent only to54 the corresponding provider API by that connector.55- `save_run` writes locally to `$INTENT_OUTREACH_HOME/runs.jsonl`, or56 `~/.intent-outreach/runs.jsonl` when that variable is unset. It does not send outreach.57- This repository's license permits only the uses stated in `LICENSE`; do not describe it as open source.5859## Output6061Return a compact campaign receipt containing:6263- researched, retained, enriched, and drafted counts;64- connectors that ran, skipped, or failed;65- approved drafts and their grounded source signals;66- the `save_run` result and local path, if the user approved persistence.6768## Error handling6970- **No research connector configured:** stop before dispatch and show the relevant `keyEnvVar` values.71- **Connector failure:** retain the runtime's skipped/failed result, continue with other connectors, and72 label the campaign partial.73- **Empty or thin evidence:** report it honestly; allow a generic draft only when the user wants one.74- **Agent failure:** identify the affected domain or lead and continue only with intact results.75- **Validation failure:** correct the field named by `save_run` and retry only with the user's approved76 content. Never bypass the validator or write directly to the run store.7778## Examples7980> **User:** `/intent-outreach — ICP: seed-stage developer-tool founders; domains: example.com; email; one contact`8182Call `list_connectors`, confirm scope, research the domain, pause for lead selection, enrich retained83leads, draft from returned evidence, pause for message approval, then call `save_run`. If the connector84returns no evidence, say so; do not substitute a plausible company fact.8586- **Example: campaign with no configured research connector.** Stop after preflight and return the87 environment-variable names from the registry; do not dispatch agents.88- **Example: partial provider failure.** Continue with intact provider results, mark the affected domain89 partial, and preserve the skipped connector in the save payload.90- **Example: rejected drafts.** Do not call `save_run`; return the reviewed research receipt and state91 that no campaign record or message was written.9293When troubleshooting a failed save, compare the submitted field named in the validation error with the94MCP input schema, correct only that field, and preserve the approved message content.9596## Resources9798- [Report Profile contract](references/report-profiles.md)99- [Runtime and persistence contract](references/runtime-contract.md)100- Companion skills: `outreach-connectors`, `outreach-profile`, and `outreach-research`