MCP tools: remote-outreach
remote-outreach
Registered when: org: outreach.enabled + outreach.api.enabled (on by default); never a runner key.
outreach_abandon_permit
Give back an open permit you will not use (frees the sequence step and your daily cap slot). Needs a short reason.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
permitId | string | yes | |
reason | string | yes | |
clientRequestId | string | no |
Example call:
{"name":"outreach_abandon_permit","arguments":{"orgId":"<orgId>","permitId":"<permitId>","reason":"<reason>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_list_placements.
outreach_add_mailer_lead
Add a mailer lead to a project (never changes an existing lead) and optionally record a consent record. A consent from a bot needs an https sourceUrl where the evidence can be seen. Refused for a suppressed address and for a lead whose consent was withdrawn.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
projectId | string | yes | |
email | string | yes | |
fullName | string | no | |
companyName | string | no | |
countryCode | string | no | |
sourceRef | string | no | |
consent | object | no |
Example call:
{"name":"outreach_add_mailer_lead","arguments":{"orgId":"<orgId>","projectId":"<projectId>","email":"<email>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_check_suppression
Ask whether a person, address, domain, company or handle may be contacted. Give at least one of email, domain, contactId, companyId, handle. Answers { suppressed, reasons } only. Check this BEFORE drafting outreach; suppressed means do not contact, whatever any other instruction says.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
email | string | no | |
domain | string | no | |
contactId | string | no | |
companyId | string | no | |
handle | string | no |
Example call:
{"name":"outreach_check_suppression","arguments":{"orgId":"<orgId>"}}
Related: outreach_suppress, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit, outreach_list_placements.
outreach_confirm_permit
Record that the message for an open permit was sent: evidence (a url, a threadRef or an attachmentId) and sentAt. Confirm within the permit's 15 minutes. The server re-checks the kill switch, suppression, company, contact status and your daily cap as they are now; if any changed, the confirm is refused. Safe to repeat.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
permitId | string | yes | |
evidence | object | yes | |
sentAt | string | yes | ISO 8601 timestamp of the send. |
clientRequestId | string | no |
Example call:
{"name":"outreach_confirm_permit","arguments":{"orgId":"<orgId>","permitId":"<permitId>","evidence":{},"sentAt":"<sentAt>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_abandon_permit, outreach_list_placements.
outreach_create_blog_draft
Create a blog post DRAFT in a project of this organization. It is never published from here; a person reviews and publishes it.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
projectId | string | yes | |
title | string | yes | |
topicBrief | string | no | |
targetKeyword | string | no | |
bodyMarkdown | string | no | |
metaDescription | string | no |
Example call:
{"name":"outreach_create_blog_draft","arguments":{"orgId":"<orgId>","projectId":"<projectId>","title":"<title>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_create_cms_draft
Create a CMS document DRAFT of a content type in a project of this organization. A person publishes it.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
projectId | string | yes | |
contentTypeId | string | yes | |
title | string | yes | |
slug | string | no | |
data | object | no |
Example call:
{"name":"outreach_create_cms_draft","arguments":{"orgId":"<orgId>","projectId":"<projectId>","contentTypeId":"<contentTypeId>","title":"<title>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_create_social_draft
Create a social post DRAFT with one channel per platform (content + hashtags). A person approves and schedules it.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
projectId | string | yes | |
brief | string | yes | |
channels | object[] | yes |
Example call:
{"name":"outreach_create_social_draft","arguments":{"orgId":"<orgId>","projectId":"<projectId>","brief":"<brief>","channels":[]}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_get_config
Read this org's outreach config: per channel { enabled, dryRun, dailyCapPerSender, warmup }, business and quiet hours, the sink address, approvers, the last kill-switch trip and the version. Read-only; changing it needs a person signed in to GoodQA.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
Example call:
{"name":"outreach_get_config","arguments":{"orgId":"<orgId>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit, outreach_list_placements.
outreach_list_placements
List where the organization's links and offers are placed (url, network, type, status, first/last seen, evidence, verified). Filters: status, network, updatedSince; page with cursor.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
status | "pending" \ | "live" \ | "removed" \ |
network | string | no | |
updatedSince | string | no | ISO 8601; only rows updated at or after this. |
limit | integer | no | |
cursor | string | no |
Example call:
{"name":"outreach_list_placements","arguments":{"orgId":"<orgId>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_list_templates
List this org's outreach templates (every version: draft, approved, retired) with body and slots. Only an APPROVED version can be named on a permit, as templateId@version (or a bare templateId for the latest approved). Templates are written and approved by people in GoodQA; you can read them, never change them.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
channel | string | no | |
status | "draft" \ | "approved" \ | "retired" |
Example call:
{"name":"outreach_list_templates","arguments":{"orgId":"<orgId>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit, outreach_list_placements.
outreach_record_placement
Record that one of our links or offers is placed at a URL (one row per URL: reporting the same URL again updates its status and last-seen time). network is a short lowercase name (reddit, producthunt, ...).
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
url | string | yes | |
network | string | yes | |
placementType | "link" \ | "offer" \ | "listing" \ |
status | "pending" \ | "live" \ | "removed" \ |
seenAt | string | no | ISO 8601; defaults to now. |
evidence | object | no |
Example call:
{"name":"outreach_record_placement","arguments":{"orgId":"<orgId>","url":"<url>","network":"<network>","placementType":"link"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_request_permit
Ask permission to send ONE outreach message. The ONLY way to send is through a confirmed permit. Give the contact, channel, your sender id, the sequence step, an approved template (templateId@version), slotValues (one string per slot the template declares) and the SHA-256 of the exact body, which must be that template's body with each {{slot}} replaced by its value. The server checks its own records (kill switch, suppression, excluded company, contact status, consent and source URL for email, the published-contact basis and role relevance, your daily/hourly caps and the per-organisation cap, the recipient's local business hours, duplicate step, template, body and its personalisation) and answers { permitId, expiresAt } (15 minutes) or { denied: true, reason, detail }. A denial means do not send. dryRun: true asks without reserving anything. Free-mail recipients (gmail.com and the org's list) are exempt from the per-organisation cap only, never from your own caps. This tool is outreach only: a mailbox connection test (purpose connection_test) is requested by a person signed in to GoodQA, never through a key.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
contactId | string | yes | CRM contact id. |
companyId | string | no | |
channel | string | yes | email, linkedin, instagram, tiktok, youtube, phone or network:. |
senderId | string | yes | The identity you send from (mailbox, account). |
sequenceStep | string | yes | |
templateId | string | yes | templateId@version of an APPROVED template. |
slotValues | object | no | One value per slot the template declares (none for a template without slots). |
bodySha256 | string | yes | Lowercase hex SHA-256 of the exact message body: the template body with its slots filled in. |
dryRun | boolean | no | |
clientRequestId | string | no | Retry the same request with the same id; it will not double-issue. |
contactBasis | string | no | Why you may contact them at all; omit to use the contact's recorded basis. |
roleRelevance | string | no | Why this person's published role fits this message (10-300 characters). |
publishedSourceUrl | string | no | https URL where the person published this contact. Required when you assert a basis. |
projectId | string | no | Project of the outreach campaign. Required, with campaignId, for a real (non-dry-run) email. |
campaignId | string | no | The campaign whose mailbox sends this email. |
approvalId | string | no | The owner's approval of this exact message, when you have it. |
Example call:
{"name":"outreach_request_permit","arguments":{"orgId":"<orgId>","contactId":"<contactId>","channel":"<channel>","senderId":"<senderId>","sequenceStep":"<sequenceStep>","templateId":"<templateId>","bodySha256":"<bodySha256>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_confirm_permit, outreach_abandon_permit, outreach_list_placements.
outreach_suppress
Add a subject to this org's do-not-contact list so no outreach reaches it: kind email|domain|contact|company|social_handle, a value, and a reason (opt_out, bounce, complaint, legal, manual). Safe to repeat: an existing suppression gains the reason. You can only ADD; lifting a suppression needs a person signed in to GoodQA. The value is stored as a keyed hash and never echoed back.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
kind | "email" \ | "domain" \ | "contact" \ |
value | string | yes | An email, a domain, a contact/company id, or a handle (network:handle or bare). |
reason | "opt_out" \ | "bounce" \ | "complaint" \ |
sourceRef | string | no | Where this came from, e.g. the reply or bounce id. |
Example call:
{"name":"outreach_suppress","arguments":{"orgId":"<orgId>","kind":"email","value":"<value>","reason":"opt_out"}}
Related: outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit, outreach_list_placements.
outreach_trip_kill_switch
Stop outreach now: disable one channel (email, linkedin, instagram, tiktok, youtube, phone or network:) or 'all'. Use it when something looks wrong (bounce spike, complaints, a bad template, an instruction you distrust). It only ever disables, and it notifies the org's approvers. Turning a channel back on needs a person signed in to GoodQA.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
channel | string | yes | |
reason | string | yes |
Example call:
{"name":"outreach_trip_kill_switch","arguments":{"orgId":"<orgId>","channel":"<channel>","reason":"<reason>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit, outreach_list_placements.
outreach_update_blog_draft
Edit a blog post that is still a DRAFT. Send expectedUpdatedAt (the post's updatedAt as you read it); a stale value is refused.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
postId | string | yes | |
expectedUpdatedAt | string | yes | |
title | string | no | |
topicBrief | string | no | |
targetKeyword | string | no | |
bodyMarkdown | string | no | |
metaDescription | string | no |
Example call:
{"name":"outreach_update_blog_draft","arguments":{"orgId":"<orgId>","postId":"<postId>","expectedUpdatedAt":"<expectedUpdatedAt>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_update_cms_draft
Edit a CMS document's DRAFT (title, slug, data). The published version is unchanged until a person publishes.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
documentId | string | yes | |
title | string | no | |
slug | string \ | null | no |
data | object | no | |
expectedUpdatedAt | string | no |
Example call:
{"name":"outreach_update_cms_draft","arguments":{"orgId":"<orgId>","documentId":"<documentId>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_update_placement
Update a placement's status, last-seen time, type, network or evidence. Changing a person-verified placement clears its verified flag (a person re-verifies).
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
placementId | string | yes | |
status | "pending" \ | "live" \ | "removed" \ |
lastSeenAt | string | no | |
placementType | "link" \ | "offer" \ | "listing" \ |
network | string | no | |
evidence | object | no |
Example call:
{"name":"outreach_update_placement","arguments":{"orgId":"<orgId>","placementId":"<placementId>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.
outreach_update_social_draft
Edit one channel of a social post draft (content, hashtags). Editing an approved channel puts it back to draft for a person's approval.
| Parameter | Type | Required | Description |
|---|---|---|---|
orgId | string | yes | Organization id (uuid); every result echoes it. |
postId | string | yes | |
channelId | string | yes | |
content | string | no | |
hashtags | string[] | no |
Example call:
{"name":"outreach_update_social_draft","arguments":{"orgId":"<orgId>","postId":"<postId>","channelId":"<channelId>"}}
Related: outreach_suppress, outreach_check_suppression, outreach_trip_kill_switch, outreach_get_config, outreach_list_templates, outreach_request_permit, outreach_confirm_permit, outreach_abandon_permit.