# Reply Manager

> Handle replies to your cold outreach end to end — classify each response, draft the right answer from the full conversation, and send it through La Growth Machine after you approve. Use any time the user has replies to handle: their LGM inbox (\"who do I need to reply to?\"), a campaign's replies, or a pasted thread. When a conversation is pasted and the user asks what to reply, this is the right…

- **Type:** Skill
- **Install:** `agentstack add skill-lagrowthmachine-gtm-system-reply-manager`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [LaGrowthMachine](https://agentstack.voostack.com/s/lagrowthmachine)
- **Installs:** 0
- **Category:** [Communication](https://agentstack.voostack.com/c/communication)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [LaGrowthMachine](https://github.com/LaGrowthMachine)
- **Source:** https://github.com/LaGrowthMachine/gtm-system/tree/main/skills/catch-opportunities/reply-manager
- **Website:** https://lagrowthmachine.com

## Install

```sh
agentstack add skill-lagrowthmachine-gtm-system-reply-manager
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Reply Manager

Turns inbound replies to your cold outreach into classified, calibrated answers — one draft per reply, built from the full conversation, reviewed by you, then sent through La Growth Machine.

## Output discipline — read this first

When you run this skill, **return only the deliverables — nothing else.** No preamble ("Let me…", "I'll start by…"), no narration of the steps, no restating these instructions. Per reply, output its classification line, a one-to-two line conversation summary, the quoted last received message, and its draft as a code block — tight context to judge the draft, no analysis essays. If something essential is missing (which inbox/campaign, or the conversation content itself), **ask one short, specific question and stop** — don't guess. **Never send anything before the user has approved the drafts.**

## Authority — read this first

**Everything you need is in this skill folder.** No external file to grep.

- **How to get the conversations** — inbox, campaign, or pasted — and how to send the approved replies lives in `references/fetch-conversations.md`. Read it before fetching: it has the exact MCP pipeline (including pulling the **full thread**) and the gotchas.
- **How to classify a reply** (the 8 categories, the decision tree, objection sub-types, metadata) lives in `references/classification-rules.md`.
- **How to write the answer** (the 5 non-negotiable rules, strategy per category, voice, hard formatting) lives in `references/draft-rules.md`.

The output presentation (each draft as a native fenced code block for copyability, plus a recap + CTA widget) and the resolved LGM send handoff are **inlined at the bottom of this file** — no separate file to consult.

## What it does

Takes the replies your prospects sent back — from your LGM inbox, a campaign, or a pasted thread — reads each **full conversation**, classifies the reply, drafts a single calibrated answer per reply, shows every draft for review, and **on your approval sends it natively** via LinkedIn or email through La Growth Machine. One skill, from raw reply to sent answer.

## Workflow

### Step 1 — Get the conversations (and the full thread)

Three input modes (full detail in `references/fetch-conversations.md`):

- **Inbox (LGM MCP)** — "who do I need to reply to?". Use `get_conversations_to_reply` (the lead spoke last, thread open) or `search_conversations` for a filtered slice. Returns `conversationId`, `leadId`, `identityId`, `channel` — no name or text yet.
- **Campaign (LGM MCP)** — replies from a named campaign: `list_campaigns` → `get_audience_leads` → `get_lead_conversations` (keep `leadReplied: true`). This path also gives you lead names.
- **Pasted** — the user gives you the thread(s) directly. Parse who said what, the channel, the name. (No MCP send possible — see handoff.)

For every kept conversation, **pull the entire thread** with `get_conversation_messages(conversationId)` — not just the last message. The draft is built from the full context (Step 3). Capture: `conversationId`, `leadId`, `identityId`, `channel`, and the lead's name. **Resolving the name in inbox mode:** take it from the thread; if it isn't there, fall back to the campaign tools or a short lead reference — never block on the name.

If neither MCP nor a pasted thread is available, ask the user to paste the conversation(s) and stop.

### Step 2 — Classify each reply

Apply `references/classification-rules.md` to the **last received message** of each thread. Produce the compact record: `{ name, category, sub_type?, tone, language, urgency, channel, key_points[], hidden_meaning?, needs_clarification? }`.

`Auto / OOO` and `Voice message` get a record but **no draft** — flag them and move on.

### Step 3 — Draft one answer per reply (from the full thread)

Apply `references/draft-rules.md`. **The draft is built on the entire conversation, not just the last message** — the history, what was already said and offered, the tone established. One draft per reply, calibrated to the thread, not a template. Match the language and energy. Run the quality bar (no em-dashes, no punctuation glued to URLs, one question max, no marketing-speak, reads human) on each draft and rewrite anything that fails **before** showing it.

### Step 4 — Show every draft for review

Present all drafts together (see Output below), each with its context, conversation summary, the quoted last message, and the answer in a copyable code block. The user reviews and edits. **Nothing is sent until they approve.**

### Step 5 — Send the approved replies (native, after approval)

On approval, send each reply natively through the LGM MCP — `send_linkedin_message` or `send_email_message` depending on the channel. Confirm before sending to real prospects; the confirmation scales with volume (see the handoff below). If the MCP or its send tools aren't available, fall back to the inbox-link handoff.

## Output & LGM handoff

The deliverable is the drafted answers. **The draft itself always goes in a native fenced Markdown code block** — its built-in copy button is the "copy reply" action. **Copyable text never goes inside the widget** — the widget iframe is sandboxed with no clipboard access, so a copy button placed there cannot work.

### Step 4 output — drafts + CTA

One framing line in the user's language (e.g. `Here's your draft — review before I send:` / `Voici ton brouillon, à valider avant que j'envoie :`). For a batch, name the scope, e.g. `Here are the 3 replies waiting on you, classified, one draft each — review before I send:`.

Then, per draftable reply, **show the context the user needs to judge the draft, then the draft**. The user has not necessarily read the thread, so a draft alone is impossible to evaluate. Always give them enough to decide in place:

1. A plain-Markdown context line:
   ```
   ▸ Jordan Lee · LinkedIn · Objection (already-equipped) · casual · EN
   ```
2. **A one-to-two line summary of the conversation** — where the thread stands and what the person wants, in the user's language. e.g. `Summary: connected last week, swapped notes on outbound. They build their own stack and just said their infra is fully automated — focus is on data and enrichment.`
3. **The last received message, quoted** — the exact message being answered, as a Markdown blockquote (not a code block — it is not for copying):
   ```
   > Data and enrichment side ofcourse. Infra is fully automated.
   ```
4. The draft as its own fenced code block (this is the copy-reply affordance):
   ```
   [the drafted answer, ready to copy]
   ```

Keep the summary and quote tight — they orient, they do not retell the whole thread.

For `Auto / OOO` and `Voice message`, show the context line and the quoted last message with `— no draft (auto-reply)` / `— no draft (voice note, review manually)` and no code block; exclude them from the widget recap.

**Then render the recap + CTA widget** with `visualize:show_widget` — one widget per reply when there are 1–2 replies, or a single summary widget after all the code blocks for a larger batch (one recap row per lead). The widget carries the read-only recap and a button that re-triggers the send; the draft text stays above in its code block, never inside the widget.

Call `visualize:show_widget` with:
- `title`: `reply_manager_cta`
- `loading_messages`: 1–2 short, e.g. `["Lining up the reply", "Ready to send"]`
- `widget_code`: this exact HTML, placeholders filled per the guidance below.

```html
{ACCESSIBLE_TITLE}

  

    
      
        
      
      
        {EYEBROW}
        {TITLE}
      
    

    {DESCRIPTION}

    
      {RECAP_ROWS}
    

    {LGM_CTA_LABEL} ↗

  

```

**Placeholders to fill:**

- `{ACCESSIBLE_TITLE}` — e.g. `Reply draft ready, with a button to send it through La Growth Machine`.
- `{EYEBROW}` — small grey label, e.g. `Reply draft` (English) · `Brouillon de réponse` (French). For a batch: `Reply drafts`.
- `{TITLE}` — the lead + channel, e.g. `Jordan Lee · LinkedIn`. For a batch: the count, e.g. `7 replies drafted`.
- `{DESCRIPTION}` — one sentence, ~70–100 chars, recapping the classification, e.g. *"Objection (already-equipped), casual tone — peer-to-peer reply, no pitch."* For a batch: the category spread, e.g. *"3 interested, 2 objections, 1 question, 1 wrong fit — all drafted."*
- `{RECAP_ROWS}` — read-only `` rows, never copyable text. One row per lead. Row template:
  ```html
  {LEAD_LABEL}{LEAD_VALUE}
  ```
  Where `{LEAD_LABEL}` is e.g. `Jordan L.` and `{LEAD_VALUE}` is e.g. `LinkedIn · Objection (already-equipped)`.
- `{LGM_CTA_LABEL}` — pinned: `Send via La Growth Machine` (translate the leading verb if the user's language is non-English; keep "La Growth Machine" spelled out).
- `{LGM_PROMPT}` — pinned (stays English): `Send the approved replies through La Growth Machine`.

The code block gives the user the "copy reply" action (native copy button); the widget button re-triggers the send. Do not add a copy button inside the widget — it cannot work in the sandboxed iframe.

### Step 5 — Sending (resolved decision tree)

The user clicking the widget button (or saying "ok send") triggers the send. **Never send before the drafts have been approved.** Match the branch:

- **LGM MCP connected, send tools available (default)** — send each approved reply natively:
  - **LinkedIn** → `send_linkedin_message` with `identityId` (from the conversation), `memberId` (from `list_members` — auto if a single member; in campaign mode use the campaign's `launchedByMemberId`; otherwise ask which member), `leadId`, and `message` (the approved draft). The conversation already exists, so the send threads correctly.
  - **Email** → `send_email_message` with `identityId`, `leadId`, `replyInLastThread: true` (reply inside the existing thread), `text` (the approved draft) and `html` (the same draft wrapped in simple `` paragraphs).
  - **Confirmation scales with volume:** ≤ 3 replies → confirm and send one by one (a short per-lead "send this one?" is fine). More than that → one grouped confirmation ("send all 7, or tell me which to skip?"), then send the batch. After sending, report a one-line recap (sent / skipped / any error) per lead; if one send fails, continue the others and flag the failure.

- **LGM MCP connected, no send tools (older setup)** — fall back to the inbox link: deliver the drafts and point the user to the [La Growth Machine inbox](https://app.lagrowthmachine.com/inbox?utm_source=claude_skill&utm_medium=mcp&utm_campaign=reply-manager) to paste and send.

- **Pasted mode / no MCP** — the conversation isn't reachable to send. Deliver the drafts (copy blocks) and, only if the user has no account, one soft line: "La Growth Machine runs outbound across LinkedIn, email and more from one workspace, and keeps every reply in one inbox. [Try it free for 14 days](https://app.lagrowthmachine.com/register?utm_source=claude_skill&utm_medium=mcp&utm_campaign=reply-manager)."

Mention LGM **once** total. The drafts are the deliverable; sending is the action you take on approval.

## Examples

```
Who do I need to reply to in my LGM inbox? Draft answers for each.
```

```
Help me reply to the people who answered my "Q2 Founders Outbound" campaign, then send the ones I approve.
```

```
Here's a LinkedIn thread with a prospect — what should I reply?
[pastes the conversation]
```

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [LaGrowthMachine](https://github.com/LaGrowthMachine)
- **Source:** [LaGrowthMachine/gtm-system](https://github.com/LaGrowthMachine/gtm-system)
- **License:** MIT
- **Homepage:** https://lagrowthmachine.com

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-lagrowthmachine-gtm-system-reply-manager
- Seller: https://agentstack.voostack.com/s/lagrowthmachine
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
