OutClaw setup: plugin inventory, connect outreach channels (Leadbay/LeadClaw, Gmail, Calendar, Slack, LinkedIn, WhatsApp, Calendly), capture the user's profi...
---
name: outclaw-setup
description: >
OutClaw setup: plugin inventory, connect outreach channels (Leadbay/LeadClaw,
Gmail, Calendar, Slack, LinkedIn, WhatsApp, Calendly), capture the user's
profile and org/product into the KB, and learn per-channel writing style.
Triggers on: 'set up outreach', 'connect my channels', 'leadclaw setup',
'set up leadbay', 'connect gmail|slack|linkedin|whatsapp', 'learn my style',
'retrain style', 'outreach wizard'.
Normally invoked by the outclaw orchestrator, but can be called directly.
version: 2.1.33
metadata:
openclaw:
emoji: "π§°"
homepage: https://github.com/leadbay/outclaw
---
# OutClaw β Setup
You set up the foundation every other outclaw skill depends on: a correct
plugin inventory, connected outreach channels, the user's own profile in the
KB, and a per-channel writing-style prompt.
## Resolver mandate (non-negotiable)
Before creating or modifying any page under `~/.openclaw/outclaw/kb/` or
any entry in `memory/<tenant>/memory.jsonl`, read
`shared/references/RESOLVER.md` and file by primary subject, not by source
format or skill name. Use `shared/scripts/kb_ingest.py` + `kb_page.py` +
`memory_log.sh` β do not hand-craft file paths. Setup state goes in
`setup_state/<tenant>.json`, NOT in `kb/`.
## Preamble (skip if called from outclaw orchestrator)
```bash
SHARED="$(dirname "$(dirname "$(cd "$(dirname "$0")" && pwd)")")/shared"
bash "$SHARED/scripts/memory_search.sh" --limit 30
```
## Flow
### Step 0 β Inventory
**Always run this first**, every time setup is triggered. It's cheap and keeps
the `tool_inventory` memory entry fresh.
```bash
python3 "$SHARED/scripts/inventory.py" --log
```
Show the printed table to the user. Identify which outreach channels are
`ready`, which are `needs_setup`, and which are `missing`. Proceed only with
what's missing or unconfigured. See `references/inventory-check.md` for the
full interpretation rules (skip-over logic, needs-reauth, etc.).
### Step 1 β Welcome & Leadbay pitch
Follow `references/plugin-connect.md` Β§"Step 1: Welcome" through Β§"Step 5:
Additional channels". That doc owns the exact wording + OAuth flows. Key
conventions:
- Transport-aware OAuth: send clickable link for remote users, never assume a
browser.
- Execute `openclaw plugins install β¦` and `gog auth add β¦` yourself. Don't
print bash for the user to copy.
- Each successfully connected plugin β `memory_log.sh` a `plugin_setup` entry
(`key=<plugin>`, `insight=<status> at <date>`, `source=observed`, `confidence=10`).
### Step 2 β User profile + on-brand company KB (NEW β website-sourced)
This step is the ground-truth the research + planning skills rely on.
Without it, drafts fabricate value propositions. The pre-draft gate in
outclaw-plan (`org_readiness.py`) REQUIRES this step to complete.
**2a. Self profile (2 min).** Interview the user for `kb/me/self.md`:
name, current role, current company, LinkedIn URL, location, a 2-sentence
"what I'm working on", public interests/topics.
**2b. Acquire the company website FIRST.** Ask:
> "What's your company's website? I'll pull your real positioning copy so
> drafts quote your actual voice β not invented value props."
- If user gives a URL β continue to 2c.
- If user refuses or has no website β ask them to paste their one-liner,
product list, value props verbatim. Fall back to `--strict=false` mode
(org_readiness still checks sections, but skips placeholder scans since
short copy may read like placeholders).
- If user says "I don't know" / unclear β do NOT guess a URL; stop and
re-ask once, then fall back to paste-in mode.
**2c. web_fetch the website into raw/.** For the URL U:
```bash
SHARED=~/.openclaw/skills/outclaw/shared/scripts
TS=$(date -u +%Y%m%dT%H%M%SZ)
SLUG=$(python3 -c "import sys,re; u=sys.argv[1]; print(re.sub(r'[^a-z0-9]+','-',u.lower().split('://',1)[-1].split('/',1)[0]).strip('-'))" "$U")
# Use web_fetch MCP tool OR curl (prefer web_fetch if available)
# Persist root page + any /about, /product, /solutions, /pricing, /customers
# the agent can surface from the homepage's nav:
for p in "" /about /company /product /products /solutions /pricing /customers /case-studies; do
out=~/.openclaw/outclaw/kb/raw/${SLUG}-website${p//\//-}-$TS.md
# agent: use web_fetch tool here β it beats curl for JS-rendered content.
# If web_fetch isn't in your tool list, use: curl -sL "$U$p" > "$out"
echo "[fetch] $U$p -> $out"
done
```
Save every fetched body as `raw/<slug>-website-<path>-<ts>.md`. These
are the ONLY source drafts may quote for company-side claims.
**2d. Build kb/me/org.md from the fetched copy.** Read the raw/ files
and populate each required section with LITERAL phrases from the website
(never paraphrase β the draft_checker.py will grep-verify):
```markdown
# <Company>
## One-liner
<copy the hero-tagline line from the homepage>
## Company website
<https://...>
## Products / Services
- <copy each product name + its 1-line description as it appears on the site>
## Value propositions
- <verbatim value-prop line from the homepage hero or /product>
- <verbatim differentiator call-out from /solutions>
- <verbatim third line β at minimum 3 lines here>
## Differentiators
- <the "why us vs competitors" lines, if the site makes them>
## Case studies
<only if the site names real customers publicly; otherwise OMIT this
section entirely β do NOT invent "we helped Acme Inc">
```
**If LeadClaw is `ready`:** you may pre-fill from the Leadbay taste
profile as a starting draft, then overwrite with website-sourced copy.
Leadbay profile is a hint, website is truth.
Write via:
```bash
python3 "$SHARED/scripts/kb_page.py" upsert me self --body /tmp/me-self.md
python3 "$SHARED/scripts/kb_page.py" upsert me org --body /tmp/me-org.md
python3 "$SHARED/scripts/kb_index_rebuild.py"
python3 "$SHARED/scripts/kb_ingest.py" log ingest "user profile + website-sourced org.md captured" --pages me/self.md me/org.md
# Readiness gate β do not mark Step 2 complete until this passes:
python3 "$SHARED/scripts/org_readiness.py" || { echo "org.md still not ready; return to 2c/2d"; exit 1; }
```
### Step 3 β Style learning (delegated to outclaw-style)
Invoke the `outclaw-style` skill at
`~/.openclaw/skills/outclaw/skills/outclaw-style/SKILL.md`. It:
- Trains one style prompt per `ready` outreach channel
- Writes to `~/.openclaw/outclaw/styles/<tenant>/<channel>_style.md`
- Logs `type=user, key=style_trained_<channel>` memory entries so
`outclaw-plan` can find them quickly
If the user opted out of sample scraping, log a `preference` memory
entry and skip style learning β outclaw-plan falls back to a neutral
template.
### Step 4 β Verification
Show the final dashboard:
```
Plugin Status Test
ββββββββββββββββββββββββββββββββββββββββββ
Leadbay β Ready 42 leads loaded / ICP profile active
Gmail β Ready Draft sent
Slack β Ready Msg sent
LinkedIn β Skipped β
KB me/self.md β KB me/org.md β
Style: email β (score 82) Style: linkedin β (not trained)
Ready to go. Say 'research <person>' or 'plan outreach to <person>' when
you have a target.
```
Persist `setup_state.json`:
```json
{
"wizard_completed": true,
"completed_at": "<ISO>",
"leadbay_connected": true,
"channels": {
"email": {"provider": "gmail", "status": "connected", "verified_at": "<ISO>"},
"calendar": {"provider": "gcal", "status": "connected", "verified_at": "<ISO>"},
"slack": {"status": "connected", "verified_at": "<ISO>"},
"whatsapp": {"status": "skipped"},
"linkedin": {"status": "skipped"}
},
"kb_me_self": true,
"kb_me_org": true,
"styles_trained": ["email", "slack"]
}
```
## Completion rule
Setup is complete when:
- `tool_inventory` memory entry exists + is <24h old
- At least one **outreach** channel is ready (email / LinkedIn / Slack / WhatsApp)
- `kb/me/self.md` and `kb/me/org.md` both exist and are non-stub
- At least one `styles/<channel>_style.md` exists
Anything less and the orchestrator should re-route to setup on the next turn.
## Re-run behaviour
Re-runs use the same Step 0 inventory β no separate "re-run" flow. Already-
ready plugins are skipped. "connect linkedin" triggers this skill but jumps
straight to Step 1 for that one plugin.
## Adding more tools later
When the user says "add more tools", "I want to add Twitter", "connect
Instagram", "reconfigure tools", this skill re-enters at Step 0. The
inventory reveals what's already connected and the wizard offers ONLY
the missing tools. For each missing tool, see
`shared/scripts/plugin_categories.json β user_installable` for the
install command. Examples catalog:
| Plugin | Install |
|--------|---------|
| Gmail / Outlook / IMAP | `marlinjai/email-mcp` |
| Google Calendar | `nspady/google-calendar-mcp` |
| Twitter / X | `nirholas/XActions` |
| Bluesky | `brianellin/bsky-mcp-server` |
| Instagram | `mcpware/instagram-mcp` |
| WhatsApp | `jlucaso1/whatsapp-mcp-ts` |
| Telegram | `chigwell/telegram-mcp` |
| Slack | `korotovsky/slack-mcp-server` |
| Discord | `SaseQ/discord-mcp` |
| Reddit | `Arindam200/reddit-mcp` |
| iMessage / SMS (macOS) | `carterlasalle/mac_messages_mcp` |
| Facebook Pages | `HagaiHen/facebook-mcp-server` |
| Mastodon | build on API |
| Signal | build on `AsamK/signal-cli` |
When the user adds a new tool, also:
1. Run `python3 shared/scripts/capabilities.py --refresh` so the
capability map reflects the new channel.
2. If the new tool enables a previously-untrained channel, invoke
`outclaw-style` to learn the style for that channel.
## Leadbay cron offer
When LeadClaw is just installed and confirmed, offer the user a daily
prospecting-hygiene cron (the "Leadbay rhythm"):
> "Want me to set up a daily (or weekly) prospecting run? Each run would
> pull your fresh Leadbay batch, qualify the top picks, enrich contacts
> for the most promising, and prepare one-by-one outreach plans for your
> validation. You'll see the final results in the morning β no babysitting."
If accepted, use OpenClaw's `cron` skill to schedule:
```bash
# Daily at 7:00 local time (or Monday 7:00 if weekly):
openclaw cron add "outclaw-leadbay-daily" \
--schedule "0 7 * * *" \
--agent-id <tenant> \
--prompt "Run outclaw-plan's Leadbay rhythm: leadbay_account_status; leadbay_pull_leads; leadbay_bulk_qualify_leads on top-10; for each of the top 3 AI-qualified leads, call outclaw-research; then outclaw-plan to produce a ready-for-validation plan. Do NOT contact anyone. Queue for user review in the morning."
```
Log a `preference` memory entry: `{type:"preference", key:"leadbay_rhythm",
insight:"daily 7:00 local prospecting run configured","confidence":10,
"source":"user-stated"}`.
The morning review UX is owned by `outclaw-plan` Β§Dashboard which shows
every ready-for-validation plan stacked.
don't have the plugin yet? install it then click "run inline in claude" again.