From outreach-superpower
Use when the user wants to manage my prospects, bulk update prospects, move prospects to a new sequence, change prospect status, update CRM, delete prospects, snooze tasks, skip tasks, or manage tasks. Triggers on "manage my prospects," "bulk update prospects," "move prospects to new sequence," "change prospect status," "update CRM," "delete prospects," "snooze tasks," "skip tasks," "manage tasks." Reads and writes the Saleshandy CRM via MCP with strict confirmation gates: any operation affecting >10 records requires explicit "yes, proceed"; delete and status-change operations on sequences require typed sequence-name confirmation; destructive ops are never chained. All destructive actions append-logged to crm-actions.md.
How this skill is triggered — by the user, by Claude, or both
Slash command
/outreach-superpower:crm-operationsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This is the highest-risk skill in the plugin. It can write to live CRM data, bulk-enroll prospects in active sequences, mark prospects as Do Not Contact, delete records, and change sequence states. Every destructive action passes through a confirmation gate calibrated to its blast radius, and every destructive action is append-logged to `crm-actions.md`.
This is the highest-risk skill in the plugin. It can write to live CRM data, bulk-enroll prospects in active sequences, mark prospects as Do Not Contact, delete records, and change sequence states. Every destructive action passes through a confirmation gate calibrated to its blast radius, and every destructive action is append-logged to crm-actions.md.
The Saleshandy CRM is a prospect database + outreach tracking layer (not a deal pipeline). It is the single source of truth for who can be contacted, who has been contacted, and what state each prospect is in across all sequences. Editing it incorrectly at scale is the worst class of mistake this plugin can make.
--sequence <id or name> - scope reads or writes to a sequence.--account <id or email> - scope to a sending account.--filter <field=value> - filter prospects before any action.--limit <N> - cap the number of records the operation will touch.outreach-workspace/<campaign>/crm-actions.md with timestamp, MCP tool, scope, and the user's confirmation evidence. This file is append-only - never overwritten, never edited.Default campaign: default. If user invocation includes --campaign <name>, use that. Full rule: see using-outreach-superpower.
references/execution-protocol.md - source of truth for the Full Protocol mode and confirmation-gate pattern. CRM operations that touch >10 records or change sequence state run in Full Protocol mode (Understand -> Plan -> Confirm -> Execute -> Verify). Confirmation gates in this skill are calibrated against the gate matrix in that doc.delete_sequence, update_sequence_status (when status is paused / stopped / archived), remove_email_accounts_from_sequence when it leaves the sequence with zero senders.crm-actions.md is append-only. Every destructive call - successful or failed - appends a row. Never overwrite, never edit, never delete entries. The log is the audit trail. If the user runs this skill twice in a session, the second run appends to the same file.add_dnc_items or assigning a DNC outcome) is a CAN-SPAM / GDPR compliance act. It cannot be undone the same way a tag is removed. ALWAYS confirm by name + reason before assigning DNC, even on a single prospect.update_sequence_status for the prospect's enrollment, OR confirm the account-level setting "Consider prospect as finished if reply received" is ON).crm-actions.md with status errored and surface the error to the user. They decide whether to retry.Every CRM call falls into one of four classes. The class determines the gate.
Lookups, counts, and inspections. No data change. No gate.
| MCP tool | Use |
|---|---|
list_clients | enumerate clients (agency / multi-tenant context) |
list_fields | enumerate prospect fields available for filter/edit |
list_tasks | list tasks (by sequence, by assignee, by status) |
get_task_by_id | fetch one task |
get_task_counts | aggregate counts by status |
get_task_assignee_list | enumerate task assignees |
These can run freely. State the scope in the answer so the user can interpret correctly.
Modifies exactly one record. Confirmation required but no typed scope.
| MCP tool | Confirmation format |
|---|---|
skip_task | "Skip task #N () for ? Yes/no." |
snooze_task | "Snooze task #N until ? Yes/no." |
complete_task | "Mark task #N complete? Yes/no." |
update_task_note | Show old note + new note. "Apply? Yes/no." |
Gate fires on the first ambiguous response. A clear "yes" passes. After the call, append to crm-actions.md.
Modifies more than 10 records in one call. Confirmation requires "yes, proceed" verbatim AND the count + sample card.
| MCP tool | What to show |
|---|---|
bulk_skip_tasks | count + sample of 3-5 tasks + reason for skipping |
bulk_snooze_tasks | count + sample + snooze duration |
add_leads_to_sequence (bulk) | count + sample of leads + sequence name + sequence status (Active/Draft/Paused) + entry step |
add_dnc_items (bulk) | count + sample + reason + reminder that this is a compliance act |
Confirmation card format:
Bulk operation: <name>
MCP tool: <exact tool name>
Scope: <filter applied or "manually selected"> -> <N> records
Sample (first 3-5):
- <record 1>
- <record 2>
- <record 3>
...
Side effects:
<e.g., "Sequence is Active - emails will start sending on next scheduled slot.">
<e.g., "DNC affects all current and future sequences for these prospects.">
Type "yes, proceed" to execute, or describe the change you want.
A response that is not literally "yes, proceed" or "yes proceed" (with or without the comma) does NOT pass. "Sure" or "ok" or "do it" or any other phrasing does not pass. State this expectation in the card.
Operations that delete data, change sequence state in production, or remove senders from a live sequence.
| MCP tool | Typed confirmation required |
|---|---|
delete_sequence | User types sequence name verbatim |
update_sequence_status (paused / stopped / archived) | User types sequence name verbatim |
remove_email_accounts_from_sequence (when removal leaves zero senders) | User types sequence name verbatim |
update_sequence_priority_distribution (any in-flight live sequence) | User types sequence name verbatim |
update_sequence_settings (when changing send schedule on live sequence) | User types sequence name verbatim |
Confirmation card format:
DESTRUCTIVE: <operation name>
MCP tool: <exact tool>
Target: <sequence name>
Current state: <e.g., "Active, 1,250 prospects enrolled, last send 4 hours ago">
After this call: <e.g., "Sequence deleted permanently. All enrollment history preserved in prospect records, but the sequence and its in-flight tasks will be removed.">
Impact: <e.g., "1,250 prospects will stop receiving emails from this sequence. They remain in CRM with their history intact.">
To confirm, type the sequence name verbatim:
> <sequence name>
The user types the name. The skill compares (case-insensitive, trim whitespace). If it matches, the gate passes. If not, prompt once: "That doesn't match. The sequence name is ''. Type it exactly to confirm, or type 'cancel' to abort." If the second attempt also fails or the user types anything else, cancel and log to crm-actions.md with status aborted.
Some operations live in other skills or are deliberately omitted from CRM ops:
reply_to_email): handled by inbox-triage with per-message confirmation.email-auditor for critique.create_sequence, add_sequence_step): out of scope here. Use Saleshandy UI; this skill operates on existing sequences.create_schedule, create_dnc_list): out of scope. Manage in Saleshandy UI; bulk additions to existing DNC lists are in scope via add_dnc_items.If a user asks for one of these, route them: "That's out of scope for crm-operations. Create it in Saleshandy, then come back to enroll / DNC / manage it here."
list_clientslist_fieldslist_tasksget_task_by_idget_task_countsget_task_assignee_listskip_tasksnooze_taskcomplete_taskupdate_task_notebulk_skip_tasksbulk_snooze_tasksadd_leads_to_sequenceadd_dnc_itemsdelete_sequenceupdate_sequence_statusupdate_sequence_priority_distributionupdate_sequence_settingsremove_email_accounts_from_sequenceIdentify which operation class fires. If ambiguous (e.g., "delete prospects who haven't opened in 90 days" could mean DNC or sequence removal), ask one scoping question: "To confirm: do you want to (A) hard-delete from CRM: not available through this skill. The safest equivalent is (B) DNC + remove from sequences, which I can run as two separately gated ops. So: (B) mark them DNC and stop all future outreach, or (C) just remove them from this sequence?" Option (A) is surfaced only to acknowledge user intent, then immediately redirected to (B). Never present (A) as executable.
For any write op:
Based on the operation class, present the matching confirmation card. Wait for the user's response. Do NOT pre-emptively call the MCP tool.
After the gate passes, call the MCP tool. Surface the response. If it returns an error, log to crm-actions.md with status errored and the error text; surface to the user; do not retry without explicit instruction.
Count drift. The displayed count in the confirmation card is a pre-call estimate. The post-call returned count is what gets logged - never the pre-call estimate. If the post-call count diverges by more than 5% from the displayed count, log status partial and surface the diff so the user can reconcile.
crm-actions.mdAppend one row immediately after the MCP call returns (success or failure). Do NOT buffer until end-of-session. If the user cancels mid-flow, the rows already written must persist.
After a destructive call succeeds:
analytics-interpreter to see how this changes your active prospect base.").crm-actions.md formatThe file is append-only. Each destructive call writes one row. The header is written once on first append.
---
file: crm-actions.md
campaign: <campaign>
note: append-only audit log of every destructive CRM operation. Never overwrite.
---
# CRM Actions Log - <campaign>
| Timestamp (UTC) | Operation class | MCP tool | Scope | Count | Confirmation evidence | Status | Notes |
|---|---|---|---|---|---|---|---|
| 2026-05-19T14:23Z | bulk-write | bulk_snooze_tasks | sequence="Q1 Outbound" assignee=jyot | 47 | "yes, proceed" | success | snoozed 7 days |
| 2026-05-19T14:28Z | destructive | update_sequence_status | sequence="Q2 Outbound" -> paused | 1,250 enrollments | typed "Q2 Outbound" | success | paused per user request after low reply rate |
| 2026-05-19T14:32Z | bulk-write | add_dnc_items | filter: replied="not interested" last 60d | 18 | "yes, proceed" | success | DNC compliance batch |
| 2026-05-19T15:01Z | destructive | delete_sequence | sequence="Old Test Sequence" | 0 enrollments | typed "Old Test Sequence" | success | empty test sequence cleanup |
| 2026-05-19T15:14Z | destructive | delete_sequence | sequence="Fintech Outreach Q1" | 847 enrollments | typed "fintech outreach Q2" (mismatch) | aborted | user typed wrong name; no call made |
| 2026-05-19T15:22Z | bulk-write | add_leads_to_sequence | sequence="Warm Follow-Up" entry=Step 1 | 83 | "yes, proceed" | success | warm prospects from Opens >=3 + Replies=0 filter |
| 2026-05-19T15:30Z | single-write | skip_task | task #4421 | 1 | "yes" | errored | MCP returned PLAN_LIMIT; no retry |
Columns:
single-write, bulk-write, or destructive. (Class 1 read ops are NOT logged here.)success, errored, aborted, partial (count diverged >5% from display), or unknown (MCP timeout).User: "What's the status of vatsal patel?"
list_tasks with filter prospect_email=<email> (or use --filter).get_task_by_id for any tasks in flight.No log entry. Read-only.
User: "Snooze task #4421 for a week."
get_task_by_id to confirm the task exists and fetch its details.snooze_task. On success: log to crm-actions.md. State completion.User: "Enroll those 83 warm prospects in my Warm Follow-Up sequence."
list_sequences filtered to the named sequence. Confirm it is Active (or Draft / Paused) and which entry step.add_leads_to_sequence. Surface result. Append to crm-actions.md.User: "Delete the Q2 Outbound sequence."
list_sequences -> get name, status, enrollment count, last activity.delete_sequence. Log success.aborted, do nothing.User: "Delete all prospects who haven't opened in 90 days."
paused, in-flight emails stop on next scheduled slot, prospects stay enrolled.update_sequence_status with status=paused. Log.aborted with the typed strings, do not retry.errored with the limit message, surface to user, recommend the upgrade path. Do NOT estimate around it.inbox-log.md if it exists, present the count and prospects, run the bulk-DNC gate.add_leads_to_sequence adds duplicates that are already in the sequence: Saleshandy deduplicates by email. State this and report the effective count after dedup once the MCP call returns.update_sequence_priority_distribution on a sequence with no active senders: the change is moot. State this and ask if the user wants to add senders first via Saleshandy UI before adjusting distribution.crm-actions.md, filter to today's UTC date, summarize. This is a read op on a workspace file, not on Saleshandy data; no MCP call needed.crm-actions.md doesn't exist yet: create it on first append. Seed with the header block.crm-actions.md has been manually edited: detect by checking for any row with a missing column. Surface a warning "The audit log appears to have been edited outside this skill. Continuing to append, but be aware history may be incomplete." Still append the new row. Never refuse to write because of a malformed prior row.partial and surface the diff so the user can reconcile (e.g., "Displayed 83 prospects, MCP returned 76 affected (-8%). Likely cause: new DNCs or sequence-state changes between display and execution."). Do NOT retry automatically. The post-call returned count is what gets logged, not the pre-call estimate.unknown with the timeout marker. Do NOT retry. Recommend the user inspect Saleshandy directly to confirm whether the operation committed before re-running.Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Generates daily or weekly digests of activity from connected sources (chat, email, docs, tasks, CRM), highlighting action items, decisions, mentions, and project updates.
npx claudepluginhub saleshandy/outreach-superpower --plugin outreach-superpower