Home

nitro

v1.4.0
Base URL
https://api.nitrosend.com/mcp

Multi-channel marketing automation platform. Use nitro_get_status first for current account and brand context, readiness, blockers, warmup, and recommendations. OAuth connections can switch current brand with nitro_select_brand; API-key connections are pinned to their key's brand.

Connect

Add to your MCP client configuration:

{ "mcpServers": { "nitro": { "url": "https://api.nitrosend.com/mcp" } } }
Protocol MCP 2026-05-26Transport streamable-httpCapabilities tools, resources, prompts

Tools

nitro_get_status

read-onlyidempotent
TOOLnitro_get_status

Get current account context, sender identity, dashboard links, readiness, onboarding status, and recommendations.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_get_status
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_get_status",
    "arguments": {}
  }
}
const result = await client.callTool("nitro_get_status", {});
result = await session.call_tool("nitro_get_status", arguments={})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_select_account

idempotent
TOOLnitro_select_account

Switch the current Nitrosend account for this OAuth MCP connection. Use when the task is for a different account than the one shown in nitro_get_status. The switch takes effect on the next tool call. Credential-authenticated connections are pinned to one account and cannot switch.

Parameters

account_idintegerrequiredargument

ID of the account to switch to. Get IDs from nitro_get_status.available_accounts.items[*].id.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_select_account
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_select_account",
    "arguments": {
        "account_id": 0
      }
  }
}
const result = await client.callTool("nitro_select_account", {
  "account_id": 0
});
result = await session.call_tool("nitro_select_account", arguments={
  "account_id": 0
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_select_brand

idempotent
TOOLnitro_select_brand

Select the current brand for this OAuth MCP connection. Use this instead of passing brand_sid to other tools. Credential-authenticated connections are pinned to one brand and cannot switch.

Parameters

brand_sidstringargument

Exact brand SID to select. Provide either brand_sid or name.

namestringargument

Brand name to select when the SID is unknown. Provide either name or brand_sid. Ambiguous names return candidates without changing context.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_select_brand
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_select_brand",
    "arguments": {
        "brand_sid": "string",
        "name": "string"
      }
  }
}
const result = await client.callTool("nitro_select_brand", {
  "brand_sid": "string",
  "name": "string"
});
result = await session.call_tool("nitro_select_brand", arguments={
  "brand_sid": "string",
  "name": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_query

read-onlyidempotent
TOOLnitro_query

Query any Nitrosend entity. Returns paginated results.

Parameters

entitystringflowscampaignstemplatessegmentscontactslistseventsimportsmessagessuppressionshistoryproductsrequiredargument

Which entity type to query. Use nitro_search_contacts for full-text contact search.

filtersobjectargument

Entity-specific filters. All entities support id (integer) to fetch a single record.

  • flows — status (draft/live/paused/archived/cancelled), campaign_id (integer|null), trigger_event (string), search (string)
  • campaigns — status (draft/scheduled/live/paused/completed/cancelled/archived), search (string)
  • templates — subject (string, ILIKE match on subject line)
  • segments — name (string, ILIKE match)
  • contacts — query (string, full-text search), subscribed_email (boolean), subscribed_phone (boolean), list_id (integer)
  • lists — name (string, ILIKE match)
  • events — name (string, exact event type), from (ISO 8601 datetime), to (ISO 8601 datetime)
  • imports — status (pending/processing/complete/failed/canceled/contact_us)
  • messages — channel (email/sms), status (queued/sent/failed), to (string, recipient address)
  • suppressions — email, reason (hard_bounce/soft_bounce/complaint/manual/admin), source_provider, active (boolean)
  • history — source (notification/tool), event_type, tool, actor, correlation_id, resource_uri, from, to
  • products — status (active/draft/archived/deleted), query (string, title/handle match)
pageintegerargument

Page number (default 1)

perintegerargument

Results per page (max 50, default 25)

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_query
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_query",
    "arguments": {
        "entity": "flows",
        "filters": {},
        "page": 0,
        "per": 0
      }
  }
}
const result = await client.callTool("nitro_query", {
  "entity": "flows",
  "filters": {},
  "page": 0,
  "per": 0
});
result = await session.call_tool("nitro_query", arguments={
  "entity": "flows",
  "filters": {},
  "page": 0,
  "per": 0
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_search_contacts

read-onlyidempotent
TOOLnitro_search_contacts

Search contacts by email, name, or phone. Returns summary list or full profile.

Parameters

querystringrequiredargument

Email address, name, or phone number

modestringsummaryprofileargument

summary = list, profile = single contact detail (default: summary)

pageintegerargument

Page number (default 1)

perintegerargument

Results per page (max 50, default 25)

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_search_contacts
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_search_contacts",
    "arguments": {
        "query": "string",
        "mode": "summary",
        "page": 0,
        "per": 0
      }
  }
}
const result = await client.callTool("nitro_search_contacts", {
  "query": "string",
  "mode": "summary",
  "page": 0,
  "per": 0
});
result = await session.call_tool("nitro_search_contacts", arguments={
  "query": "string",
  "mode": "summary",
  "page": 0,
  "per": 0
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_set_brand_kit

idempotentopen-world
TOOLnitro_set_brand_kit

Set up Brand Kit identity from website URL or direct fields. Provide url to auto-scrape brand colors/fonts, or fields to set values directly, or both (fields override scraped values). For local logo files, upload via nitro_ingest first and pass the returned media_url/image_url as logo_url. Sync mode (default) returns results immediately — best when you need Brand Kit data now for composing. Async mode (mode: 'async') accepts url only and runs scraping in the background — use when deferred completion is acceptable.

Body

application/json
urlstring

Website URL to scrape Brand Kit from

logo_urlstring

Public or Nitro CDN URL to a logo image (png/jpg/webp/svg) to attach. For local logo files, upload via nitro_ingest first and pass the returned media_url/image_url (raw signed_id values are not accepted).

fieldsobject

Direct Brand Kit field updates

Show child attributes
brand_colorstring

Hex color e.g. #ff0000

text_colorstring

Hex color

bg_colorstring

Hex color

font_bodystring
font_headingstring
heading_sizeinteger

Heading/title font size in pixels, 12-48

body_sizeinteger

Body text font size in pixels, 12-20

radiusinteger

Global brand corner radius in pixels, 0-64. Defaults to 8; set 0 for square corners across every eligible layer.

spacing_densitystringcompactnormalspacious

Section spacing rhythm: compact, normal, or spacious

company_namestring
physical_addressstring
company_descriptionstring
documentstring

Full brand voice markdown document

dry_runbooleanfalse

Preview changes without persisting

modestringsyncasyncsync

sync (default) or async for URL scraping

idempotency_keystring

Required for non-dry-run URL scraping or remote logo fetches. Reuse the same key only for an exact retry. Direct fields/document updates may omit it.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_set_brand_kit
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_set_brand_kit",
    "arguments": {
        "url": "string",
        "logo_url": "string",
        "fields": {
          "brand_color": "string",
          "text_color": "string",
          "bg_color": "string",
          "font_body": "string",
          "font_heading": "string",
          "heading_size": 0,
          "body_size": 0,
          "radius": 0,
          "spacing_density": "compact",
          "company_name": "string",
          "physical_address": "string",
          "company_description": "string"
        },
        "document": "string",
        "dry_run": false,
        "mode": "sync",
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_set_brand_kit", {
  "url": "string",
  "logo_url": "string",
  "fields": {
    "brand_color": "string",
    "text_color": "string",
    "bg_color": "string",
    "font_body": "string",
    "font_heading": "string",
    "heading_size": 0,
    "body_size": 0,
    "radius": 0,
    "spacing_density": "compact",
    "company_name": "string",
    "physical_address": "string",
    "company_description": "string"
  },
  "document": "string",
  "dry_run": false,
  "mode": "sync",
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_set_brand_kit", arguments={
  "url": "string",
  "logo_url": "string",
  "fields": {
    "brand_color": "string",
    "text_color": "string",
    "bg_color": "string",
    "font_body": "string",
    "font_heading": "string",
    "heading_size": 0,
    "body_size": 0,
    "radius": 0,
    "spacing_density": "compact",
    "company_name": "string",
    "physical_address": "string",
    "company_description": "string"
  },
  "document": "string",
  "dry_run": false,
  "mode": "sync",
  "idempotency_key": "string"
})
Request Body
{
  "url": "string",
  "logo_url": "string",
  "fields": {
    "brand_color": "string",
    "text_color": "string",
    "bg_color": "string",
    "font_body": "string",
    "font_heading": "string",
    "heading_size": 0,
    "body_size": 0,
    "radius": 0,
    "spacing_density": "compact",
    "company_name": "string",
    "physical_address": "string",
    "company_description": "string"
  },
  "document": "string",
  "dry_run": false,
  "mode": "sync",
  "idempotency_key": "string"
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_ingest

TOOLnitro_ingest

Ingest a local or remote asset into Nitrosend-hosted storage and return URLs you can place directly into email design fields. V1 supports kind=image only. Use image_data only for small local/chat-attached images. For larger local image files, call this tool with upload={kind: 'image', filename, content_type, byte_size, checksum} to create a direct upload reservation, PUT bytes to the returned direct_upload.url, then call this tool again with signed_id. Public remote image URLs can be used directly in compose tools when permanence is not required, or passed as image_url here when Nitro-hosted permanence is desired.

Body

application/json
kindstring

Asset kind to ingest. V1 supports image only.

image_datastring

Image payload as raw base64 bytes or a full data URL. PNG, JPEG, or WebP only; decoded size must be under 10MB.

image_urlstring

Public http/https image URL to ingest into Nitro-hosted storage when permanence is desired. PNG, JPEG, or WebP only; remote file must be under 10MB.

signed_idstring

Upload signed_id returned by this tool's upload reservation after PUTing image bytes to direct_upload.url.

descriptionstring

What the picture shows, e.g. 'Swimmer at dawn on St Kilda pier, cold light'. Stored with the image so later campaigns can choose it from the brand library, and used as its alt text. Applies to image_data, image_url, signed_id, and upload reservation sources.

uploadobject

Reserve an authorized upload link for a local asset. V1 supports kind=image only. Provide filename, content_type, byte_size, and base64 MD5 checksum; then PUT bytes to the returned direct_upload.url and call this tool again with signed_id.

Show child attributes
kindstringrequired

Asset kind. V1 supports image only.

filenamestringrequired

Original image filename, e.g. hero.png.

content_typestringrequired

MIME type. Use image/png, image/jpeg, or image/webp.

byte_sizeintegerrequired

Exact file size in bytes before upload.

checksumstringrequired

Base64 MD5 checksum required by Active Storage direct upload.

filenamestring

Original filename for image_data uploads, or an optional filename override for image_url/signed_id sources.

content_typestring

Optional MIME type hint when image_data is raw base64 rather than a data URL.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_ingest
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_ingest",
    "arguments": {
        "kind": "string",
        "image_data": "string",
        "image_url": "string",
        "signed_id": "string",
        "description": "string",
        "upload": {
          "kind": "string",
          "filename": "string",
          "content_type": "string",
          "byte_size": 0,
          "checksum": "string"
        },
        "filename": "string",
        "content_type": "string"
      }
  }
}
const result = await client.callTool("nitro_ingest", {
  "kind": "string",
  "image_data": "string",
  "image_url": "string",
  "signed_id": "string",
  "description": "string",
  "upload": {
    "kind": "string",
    "filename": "string",
    "content_type": "string",
    "byte_size": 0,
    "checksum": "string"
  },
  "filename": "string",
  "content_type": "string"
});
result = await session.call_tool("nitro_ingest", arguments={
  "kind": "string",
  "image_data": "string",
  "image_url": "string",
  "signed_id": "string",
  "description": "string",
  "upload": {
    "kind": "string",
    "filename": "string",
    "content_type": "string",
    "byte_size": 0,
    "checksum": "string"
  },
  "filename": "string",
  "content_type": "string"
})
Request Body
{
  "kind": "string",
  "image_data": "string",
  "image_url": "string",
  "signed_id": "string",
  "description": "string",
  "upload": {
    "kind": "string",
    "filename": "string",
    "content_type": "string",
    "byte_size": 0,
    "checksum": "string"
  },
  "filename": "string",
  "content_type": "string"
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_manage_audience

destructive
TOOLnitro_manage_audience

Create or update contacts, manage subscriptions, lists, events, segments, and tags. Custom contact fields belong in attributes.data. For more than 100 contact writes, use nitro_import_contacts with CSV.

Parameters

operationstringcreate_contactupdate_contactset_subscriptionmanage_listrecord_eventdelete_segmentbulk_tagrequiredargument

Which audience operation to perform. Each operation expects specific params:

  • create_contact — params: {email (string), phone (string), opt_in (boolean, recommended: true), attributes: {first_name, last_name, country_code, source, data: {custom_field: value}}}
  • update_contact — params: {contact_id or contact_email (exactly one), attributes: {first_name, last_name, country_code, source, data: {custom_field: value}}}. Custom data is merged; omitted, null, and empty-string values do not erase existing values.
  • set_subscription — params: {contact_id (required), kind: "email"|"phone" (required), opt_in (boolean), opt_out (boolean), unsubscribe_all (boolean)}. Value auto-resolved from contact.
  • manage_list — params: {action: "create"|"rename"|"delete"|"add_contacts"|"remove_contacts" (required), list_id (integer), name (string), contact_ids (integer[]) or emails (string[])}
  • record_event — params: {contact_id or contact_email (one required), event (required, custom names allowed e.g. order_confirmed), data (object, max 32KB), resource_uid, resource_name, resource_url, amount}
  • delete_segment — params: {segment_id (required), force (boolean)}. Requires confirm: true.
  • bulk_tag — params: {contact_ids (integer[], required), tags (string[], required), tag_action: "add"|"remove"|"set" (default: "add")}
paramsobjectrequiredargument

Operation-specific parameters. See operation description for required/optional fields.

dry_runbooleanfalseargument

Preview changes without persisting (default: false)

confirmbooleanfalseargument

Required for destructive operations: delete_segment, manage_list with action='delete'

idempotency_keystringargument

Optional deduplication key. Same key returns cached result.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_manage_audience
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_manage_audience",
    "arguments": {
        "operation": "create_contact",
        "params": {},
        "dry_run": false,
        "confirm": false,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_manage_audience", {
  "operation": "create_contact",
  "params": {},
  "dry_run": false,
  "confirm": false,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_manage_audience", arguments={
  "operation": "create_contact",
  "params": {},
  "dry_run": false,
  "confirm": false,
  "idempotency_key": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_manage_outreach

destructiveopen-world
TOOLnitro_manage_outreach

Plan and operate person-first outreach discovery through one provider-neutral surface. Start with action='intent': it returns the full current brand, voice, memory, audience, safety, and target-profile contract. Fill that scaffold, then use estimate before start. Discovery always resolves named people. Companies are targeting and evidence context, never outreach recipients. Provider names, keys, native filters, and cursors are not inputs. action='start' requires a stable idempotency_key, qualified-lead target, and maximum USD-cent charge; it creates one campaign and starts its bounded background pipeline. Reusing the same key with changed input is rejected. status returns a bounded summary and a nitro:// resource for criterion coverage, source progress, spend, funnel, and ready inventory.

Body

application/json
actionstringintentestimatestartstatuspauseresumecancelrequired

intent, estimate, start, status, pause, resume, or cancel.

goalstring

Operator's outreach objective. Supply on intent so the returned scaffold is grounded in the actual task.

namestring

Campaign name. Required for start.

target_profileobject
Show child attributes
criteriaArray<object>required
Show child attributes
keystring

Stable criterion name used in coverage and fit findings.

subjectstringprospectcompanysignalprospect

The evidence subject evaluated by this criterion.

fieldstringrequired

Canonical profile field, such as title, seniority, organization_industry, or organization_employee_range.

operatorstringequalsincludesincludes_anyinrangepresentequals
valueany

Expected scalar, list, or range. Omit only for the present operator.

requiredbooleanfalse

A required unknown or mismatch prevents a person from matching.

weightnumber1

Relative weight for non-required fit ranking.

minimum_confidencenumber[0, 1]0
maximum_age_daysinteger>= 1

Optional freshness ceiling for evidence used by this criterion.

capabilitiesArray<string>professional_profilesconnected_profilescommunity_signalshiring_activity

Optional outcome capabilities returned by intent. Omit to use current defaults. Required capabilities are always included.

seedsArray<object>

Optional bounded first-party person or company seeds. Supplying a company never makes it an outreach recipient.

Show child attributes
domainstring
website_urlstring
careers_urlstring
company_namestring
first_namestring
last_namestring
linkedin_urlstring
source_record_idstring
seed_artifactsArray<object>

Optional purpose-bound CSV seed manifests uploaded for the current account and brand.

Show child attributes
signed_idstringrequired
exclusionsobject

Optional campaign-local company exclusions. Brand suppressions for customers, active deals, replies, opt-outs, and manual blocks always apply.

Show child attributes
company_domainsArray<string>
target_countinteger[1, 1000]

Maximum number of accepted qualified people to return.

maximum_spend_centsinteger>= 0

Customer-authorized maximum charge in USD cents. Use the estimate quote unchanged unless the operator narrows the target.

campaign_idinteger

Required for status, pause, resume, and cancel.

brand_context_refstring

Optional current ref returned by intent. A valid ref suppresses repeated inline context; a stale ref returns the fresh full context.

idempotency_keystring

Required for start. Reuse only for an exact retry of the same campaign input.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_manage_outreach
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_manage_outreach",
    "arguments": {
        "action": "intent",
        "goal": "string",
        "name": "string",
        "target_profile": {
          "criteria": [
            {
              "key": "string",
              "subject": "prospect",
              "field": "string",
              "operator": "equals",
              "required": false,
              "weight": 1,
              "minimum_confidence": 0,
              "maximum_age_days": 1
            }
          ]
        },
        "capabilities": [
          "professional_profiles"
        ],
        "seeds": [
          {
            "domain": "string",
            "website_url": "string",
            "careers_url": "string",
            "company_name": "string",
            "first_name": "string",
            "last_name": "string",
            "linkedin_url": "string",
            "source_record_id": "string"
          }
        ],
        "seed_artifacts": [
          {
            "signed_id": "string"
          }
        ],
        "exclusions": {
          "company_domains": [
            "string"
          ]
        },
        "target_count": 1,
        "maximum_spend_cents": 0,
        "campaign_id": 0,
        "brand_context_ref": "string",
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_manage_outreach", {
  "action": "intent",
  "goal": "string",
  "name": "string",
  "target_profile": {
    "criteria": [
      {
        "key": "string",
        "subject": "prospect",
        "field": "string",
        "operator": "equals",
        "required": false,
        "weight": 1,
        "minimum_confidence": 0,
        "maximum_age_days": 1
      }
    ]
  },
  "capabilities": [
    "professional_profiles"
  ],
  "seeds": [
    {
      "domain": "string",
      "website_url": "string",
      "careers_url": "string",
      "company_name": "string",
      "first_name": "string",
      "last_name": "string",
      "linkedin_url": "string",
      "source_record_id": "string"
    }
  ],
  "seed_artifacts": [
    {
      "signed_id": "string"
    }
  ],
  "exclusions": {
    "company_domains": [
      "string"
    ]
  },
  "target_count": 1,
  "maximum_spend_cents": 0,
  "campaign_id": 0,
  "brand_context_ref": "string",
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_manage_outreach", arguments={
  "action": "intent",
  "goal": "string",
  "name": "string",
  "target_profile": {
    "criteria": [
      {
        "key": "string",
        "subject": "prospect",
        "field": "string",
        "operator": "equals",
        "required": false,
        "weight": 1,
        "minimum_confidence": 0,
        "maximum_age_days": 1
      }
    ]
  },
  "capabilities": [
    "professional_profiles"
  ],
  "seeds": [
    {
      "domain": "string",
      "website_url": "string",
      "careers_url": "string",
      "company_name": "string",
      "first_name": "string",
      "last_name": "string",
      "linkedin_url": "string",
      "source_record_id": "string"
    }
  ],
  "seed_artifacts": [
    {
      "signed_id": "string"
    }
  ],
  "exclusions": {
    "company_domains": [
      "string"
    ]
  },
  "target_count": 1,
  "maximum_spend_cents": 0,
  "campaign_id": 0,
  "brand_context_ref": "string",
  "idempotency_key": "string"
})
Request Body
{
  "action": "intent",
  "goal": "string",
  "name": "string",
  "target_profile": {
    "criteria": [
      {
        "key": "string",
        "subject": "prospect",
        "field": "string",
        "operator": "equals",
        "required": false,
        "weight": 1,
        "minimum_confidence": 0,
        "maximum_age_days": 1
      }
    ]
  },
  "capabilities": [
    "professional_profiles"
  ],
  "seeds": [
    {
      "domain": "string",
      "website_url": "string",
      "careers_url": "string",
      "company_name": "string",
      "first_name": "string",
      "last_name": "string",
      "linkedin_url": "string",
      "source_record_id": "string"
    }
  ],
  "seed_artifacts": [
    {
      "signed_id": "string"
    }
  ],
  "exclusions": {
    "company_domains": [
      "string"
    ]
  },
  "target_count": 1,
  "maximum_spend_cents": 0,
  "campaign_id": 0,
  "brand_context_ref": "string",
  "idempotency_key": "string"
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_define_segment

idempotent
TOOLnitro_define_segment

Define a contact segment with explicit filters and preview. Defaults to preview_only: true (dry preview without saving). Set preview_only: false and provide a name to persist.

Body

application/json
namestring

Segment name (required when preview_only: false)

filtersArray<any> | anyrequired

Contact segment filters. Use a flat array for simple AND filters, or a boolean tree group: {op: "and"|"or"|"not", conditions: [...]}. A NOT group must contain exactly one condition. Leaves are attribute filters ({name, predicate, value}) or event filters ({type: "event", event, predicate, value?, within_days?, since?}).

segment_idinteger

Existing segment ID to update (omit for new segment)

preview_onlybooleantrue

Only preview matching contacts, do not save (default: true). Set to false + provide name to persist.

idempotency_keystring

Optional deduplication key

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_define_segment
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_define_segment",
    "arguments": {
        "name": "string",
        "filters": [],
        "segment_id": 0,
        "preview_only": true,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_define_segment", {
  "name": "string",
  "filters": [],
  "segment_id": 0,
  "preview_only": true,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_define_segment", arguments={
  "name": "string",
  "filters": [],
  "segment_id": 0,
  "preview_only": true,
  "idempotency_key": "string"
})
Request Body
{
  "name": "string",
  "filters": [],
  "segment_id": 0,
  "preview_only": true,
  "idempotency_key": "string"
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_import_contacts

TOOLnitro_import_contacts

Import contacts and custom fields from inline records (< 100), reserve an authorized CSV upload link, finalize an uploaded signed_id, or process an existing import_id. New email contacts are auto-subscribed by default; existing subscription state is preserved unless opt_in is explicit. For SMS-only contacts, set opt_in: true explicitly (TCPA compliance). For large local CSVs, call this tool with upload={filename, content_type, byte_size, checksum}, PUT bytes to the returned direct_upload.url, then call this tool again with signed_id. Large CSV imports use the same async pipeline as app/API/CLI: up to 250k rows self-serve, with sends held for review above 20k; larger files return contact_sales.

Body

application/json
recordsArray<object>

Array of contact objects (max 100): {email, phone, first_name, last_name, country_code, source, opt_in, data}. For larger custom-field updates, use the CSV path with columns mapping.

Show child attributes
emailstring
phonestring
first_namestring
last_namestring
country_codestring
sourcestring
dataobject

Custom contact fields. Values use the same merge and field-catalog rules as REST contact writes.

opt_inboolean

Explicitly set subscription state. New email contacts default to subscribed when omitted; existing contacts preserve their current state. Must be explicitly true for SMS (TCPA).

import_idinteger

Existing Import record ID for CSV processing

signed_idstring

Upload signed_id returned by this tool's upload reservation after PUTing CSV bytes to direct_upload.url.

uploadobject

Reserve an authorized upload link for a local CSV file. Provide filename, content_type, byte_size, and base64 MD5 checksum; then PUT bytes to the returned direct_upload.url and call this tool again with signed_id.

Show child attributes
filenamestringrequired

Original CSV filename, e.g. contacts.csv.

content_typestringrequired

MIME type. Use text/csv or application/csv.

byte_sizeintegerrequired

Exact file size in bytes before upload.

checksumstringrequired

Base64 MD5 checksum required by Active Storage direct upload.

resourcestringcontacts

Import resource. Use contacts for contact CSV imports.

parserstringdefault

Parser name. Use default unless a future schema documents another parser.

columnsobject

Optional import column mapping object.

optionsobject

Import options, e.g. {list_ids: [123]} to add imported contacts to lists.

Show child attributes
list_idsArray<integer>
dry_runbooleanfalse

Preview import without persisting (default: false)

idempotency_keystring

Optional deduplication key

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_import_contacts
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_import_contacts",
    "arguments": {
        "records": [
          {
            "email": "string",
            "phone": "string",
            "first_name": "string",
            "last_name": "string",
            "country_code": "string",
            "source": "string",
            "data": {},
            "opt_in": true
          }
        ],
        "import_id": 0,
        "signed_id": "string",
        "upload": {
          "filename": "string",
          "content_type": "string",
          "byte_size": 0,
          "checksum": "string"
        },
        "resource": "contacts",
        "parser": "default",
        "columns": {},
        "options": {
          "list_ids": [
            0
          ]
        },
        "dry_run": false,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_import_contacts", {
  "records": [
    {
      "email": "string",
      "phone": "string",
      "first_name": "string",
      "last_name": "string",
      "country_code": "string",
      "source": "string",
      "data": {},
      "opt_in": true
    }
  ],
  "import_id": 0,
  "signed_id": "string",
  "upload": {
    "filename": "string",
    "content_type": "string",
    "byte_size": 0,
    "checksum": "string"
  },
  "resource": "contacts",
  "parser": "default",
  "columns": {},
  "options": {
    "list_ids": [
      0
    ]
  },
  "dry_run": false,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_import_contacts", arguments={
  "records": [
    {
      "email": "string",
      "phone": "string",
      "first_name": "string",
      "last_name": "string",
      "country_code": "string",
      "source": "string",
      "data": {},
      "opt_in": true
    }
  ],
  "import_id": 0,
  "signed_id": "string",
  "upload": {
    "filename": "string",
    "content_type": "string",
    "byte_size": 0,
    "checksum": "string"
  },
  "resource": "contacts",
  "parser": "default",
  "columns": {},
  "options": {
    "list_ids": [
      0
    ]
  },
  "dry_run": false,
  "idempotency_key": "string"
})
Request Body
{
  "records": [
    {
      "email": "string",
      "phone": "string",
      "first_name": "string",
      "last_name": "string",
      "country_code": "string",
      "source": "string",
      "data": {},
      "opt_in": true
    }
  ],
  "import_id": 0,
  "signed_id": "string",
  "upload": {
    "filename": "string",
    "content_type": "string",
    "byte_size": 0,
    "checksum": "string"
  },
  "resource": "contacts",
  "parser": "default",
  "columns": {},
  "options": {
    "list_ids": [
      0
    ]
  },
  "dry_run": false,
  "idempotency_key": "string"
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_manage_template

TOOLnitro_manage_template

Create, update, or clone a reusable email template. Brand theme applied automatically. For composing new emails to send, use nitro_compose_campaign instead. For edits to existing sections, prefer section_updates: target by section id, use text_patch for exact literal copy changes, and shallow-merge props/styles for visual or non-copy attribute changes. Copy changes and full sections enter the composition contract before persistence. New copy and full redesigns always enter the composition contract before persistence. composition_mode="intent" returns the current intent-scoped brand, memory, source, binding, and design context; the calling agent writes the sections, can validate without persistence, then calls this same tool with composition_mode="draft". The returned optional_server_authoring_call explicitly requests metered composition_mode="generate", which composes, validates, and persists one draft only. Contract-loop states return as normal tool results with composition_status and isError=false.

For a fresh reusable design, next_call.input is the selected complete baseline and composition_contract.creative_routes is the one compact route menu. Preserve and fill that baseline by default. To select another ready route, start a fresh intent with its creative_route_id; a route missing frozen evidence returns the exact facts it needs instead of substituting another layout. Full section authoring remains an intentional escape hatch under the same bindings and validator.

For image-led routes, follow next_call.image_choice exactly. Prefer a described brand-library asset, then an exact operator asset; otherwise obtain an exact verified vendor-site asset, generate an asset in the host and ingest it, or retrieve an exact public stock/Unsplash asset. Reissue intent with the exact image_url fact and what the image shows. Brand memory may guide tone and search terms but never proves an image URL or its contents; Nitrosend never browses or invents one during composition.

Modes (auto-detected):

  • Create/redesign — complete the returned authoring contract with subject and sections.
  • Targeted update — provide template_id + section_updates for an exact mechanical edit. Use if_version for optimistic concurrency.
  • Clone unchanged — provide based_on to copy an existing template. Creative overrides enter the authoring contract.

Mutation safety: every create, clone, targeted update, and full update persistence call requires idempotency_key. Every contract draft next_call carries one stable persistence key; use it unchanged through draft repairs and exact persistence retries. Validate next_calls may carry rotating validation-round keys. Reuse a contract-free caller key only for an exact retry.

Body

application/json
sectionsArray<object>

Array of section objects: {id?, type, props, styles?}. Read nitro://schema for full prop specs. Persisted sections receive stable top-level ids for future section_updates targeting.

Section types and key props:

  • header — {variant, wordmark_text, logo_url, logo_alt, logo_width, background_color}
  • text — {content (HTML string)}
  • image — {src, alt, href, width}
  • button — {text, href, background_color, text_color, section_background_color, align, border_radius, inner_padding, font_weight, font_family, text_transform}. background_color is the button fill; section_background_color is the surrounding band.
  • columns — {columns: [{width, sections: [...]}]} — nested sections inside columns
  • product — {name, price, image_url, href, description}
  • social — {links: [{platform, url}], align}
  • divider — {color, width, padding}
  • spacer — {height}
  • footer — {unsubscribe_text}. Nitrosend fills the canonical company name and physical address from the active Brand; callers cannot override legal identity.

Image URL props accept public URLs or nitro_ingest media_url/image_url values (never raw signed_id); upload local files via nitro_ingest first.

section_updatesArray<object>

Small update shortcut for existing sections. Prefer targeting by stable section id from nitro_query/template reads; fall back to 0-based index, or type plus optional 0-based occurrence. Shallow-merges visual/non-copy props and styles, or uses text_patch for an exact literal copy edit. Copy-bearing updates enter the composition contract before persistence. Does not change section order or type.

Show child attributes
idstring

Stable section id from the stored template sections array. Preferred target.

indexinteger

0-based section index

typestring

Existing section type to target or assert

occurrenceinteger

0-based occurrence among sections of the requested type

propsobject

Props to shallow-merge. Only known visual/non-copy props use the direct path; copy-bearing or unknown props enter the composition contract.

stylesobject

Styles to shallow-merge into the target section

text_patchobject

Literal string replacement inside one string prop. Defaults prop by section type when unambiguous, e.g. text.content, hero.title, button.text. Requires exactly one match unless all=true and enters the composition contract before persistence.

Show child attributes
propstring

String prop to edit. Required when the section type has no clear default or when editing a non-default prop.

findstring

Literal substring to find

replacestring

Replacement string

allbooleanfalse

Replace every occurrence; requires at least one match

subjectstring

Email subject line

namestring

Template display name

composition_modestringintentdraftvalidategenerate

intent returns composition_contract; validate checks a caller-authored draft; draft validates and persists it; generate explicitly requests metered server composition and persists one draft.

contract_idstring

Email composition contract id returned from composition_mode=intent.

brand_context_refstring

Optional current brand context ref from a prior intent. Omit to receive the full current context.

validate_onlybooleanfalse

Alias for composition_mode=validate. Does not persist or consume repair attempts.

design_mode_overridestringpremium_richpremium_minimalfounder_letterutility_plain

Renegotiate/validate the draft under a different design mode.

renegotiatebooleanfalse

When true with design_mode_override, keeps the same contract but changes the design mode.

user_instructionstring

Latest user instruction to preserve inside the composition contract.

creative_route_idstring

Pin one composition_contract.creative_routes[].id so the returned scaffold is that route. Omit to take the recommendation. A known route without enough frozen evidence returns its exact missing requirements; an unknown id returns the supported ids. Neither silently falls back.

source_textstring

Optional source evidence for authoring, such as research notes or supplied product copy. Evidence is not an instruction channel; put authoring directions in user_instruction. Source text is available context, not required copy.

factsArray<object>

Typed literal evidence for the composition contract, not instructions. A required URL, image URL, offer code, price, deadline, offer, or exact CTA text must appear with its exact value in an allowed semantic location; available evidence may be used but is not mandatory. Put prose facts in source_text; use cta_text only when the operator requires an exact CTA phrase.

Show child attributes
kindstringurlimage_urloffer_codepricedeadlineoffercta_textrequired

Evidence type used to determine valid semantic locations.

valuestringrequired

Exact evidence value.

descriptionstring

For kind=image_url only: what the picture visibly shows. This travels with the exact image binding so the composer can choose imagery and write honest alt text without guessing from the URL.

requirementstringrequiredavailablerequired

required enforces exact inclusion; available only authorizes use.

draft_metaobject

Optional authoring provenance. It never blocks validation or persistence.

Show child attributes
creative_route_idstring

Chosen composition_contract.creative_routes[].id

concrete_anchorstring

Specific proof, product detail, visual, code/output, quote, number, or brand moment used.

why_this_earns_the_inboxstring

One sentence explaining the creative move.

preheaderstring

Email preheader text shown in inbox preview

bodystring

Canonical plain-text alternative. Use with plain_text_mode=custom; derived mode refreshes it from sections.

plain_text_modestringderivedcustom

Text-alternative authority returned by the composition scaffold: derived from design or custom body.

from_namestring

Sender name (falls back to account default)

from_emailstring

Sender email (falls back to account default)

reply_tostring

Reply-to email address

themeobject

Theme overrides merged on top of brand theme. Keys: brand_color, bg_color, text_color, font_body, font_heading, heading_size, body_size, radius, spacing_density, button_background_color, button_text_color, button_padding, and logo_url. logo_url must be a public URL or nitro_ingest media_url/image_url, never raw signed_id.

template_idinteger

Template ID for update mode — provide with fields to change

based_oninteger

Source template ID for clone mode — creates a copy

if_versioninteger

Optimistic concurrency — rejects update if template version mismatches

goalstring

Goal for the template authoring contract

dry_runbooleanfalse

Validate and preview without persisting

idempotency_keystring

Required for every non-dry-run persistence mutation, including create, clone, targeted section update, and full update. Draft next_calls retain one stable contract persistence key; validate next_calls may rotate validation-round keys. Reuse a contract-free caller key only for an exact retry.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_manage_template
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_manage_template",
    "arguments": {
        "sections": [
          {}
        ],
        "section_updates": [
          {
            "id": "string",
            "index": 0,
            "type": "string",
            "occurrence": 0,
            "props": {},
            "styles": {},
            "text_patch": {
              "prop": "string",
              "find": "string",
              "replace": "string",
              "all": false
            }
          }
        ],
        "subject": "string",
        "name": "string",
        "composition_mode": "intent",
        "contract_id": "string",
        "brand_context_ref": "string",
        "validate_only": false,
        "design_mode_override": "premium_rich",
        "renegotiate": false,
        "user_instruction": "string",
        "creative_route_id": "string",
        "source_text": "string",
        "facts": [
          {
            "kind": "url",
            "value": "string",
            "description": "string",
            "requirement": "required"
          }
        ],
        "draft_meta": {
          "creative_route_id": "string",
          "concrete_anchor": "string",
          "why_this_earns_the_inbox": "string"
        },
        "preheader": "string",
        "body": "string",
        "plain_text_mode": "derived",
        "from_name": "string",
        "from_email": "string",
        "reply_to": "string",
        "theme": {},
        "template_id": 0,
        "based_on": 0,
        "if_version": 0,
        "goal": "string",
        "dry_run": false,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_manage_template", {
  "sections": [
    {}
  ],
  "section_updates": [
    {
      "id": "string",
      "index": 0,
      "type": "string",
      "occurrence": 0,
      "props": {},
      "styles": {},
      "text_patch": {
        "prop": "string",
        "find": "string",
        "replace": "string",
        "all": false
      }
    }
  ],
  "subject": "string",
  "name": "string",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "preheader": "string",
  "body": "string",
  "plain_text_mode": "derived",
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "theme": {},
  "template_id": 0,
  "based_on": 0,
  "if_version": 0,
  "goal": "string",
  "dry_run": false,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_manage_template", arguments={
  "sections": [
    {}
  ],
  "section_updates": [
    {
      "id": "string",
      "index": 0,
      "type": "string",
      "occurrence": 0,
      "props": {},
      "styles": {},
      "text_patch": {
        "prop": "string",
        "find": "string",
        "replace": "string",
        "all": false
      }
    }
  ],
  "subject": "string",
  "name": "string",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "preheader": "string",
  "body": "string",
  "plain_text_mode": "derived",
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "theme": {},
  "template_id": 0,
  "based_on": 0,
  "if_version": 0,
  "goal": "string",
  "dry_run": false,
  "idempotency_key": "string"
})
Request Body
{
  "sections": [
    {}
  ],
  "section_updates": [
    {
      "id": "string",
      "index": 0,
      "type": "string",
      "occurrence": 0,
      "props": {},
      "styles": {},
      "text_patch": {
        "prop": "string",
        "find": "string",
        "replace": "string",
        "all": false
      }
    }
  ],
  "subject": "string",
  "name": "string",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "preheader": "string",
  "body": "string",
  "plain_text_mode": "derived",
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "theme": {},
  "template_id": 0,
  "based_on": 0,
  "if_version": 0,
  "goal": "string",
  "dry_run": false,
  "idempotency_key": "string"
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_compose_flow

destructive
TOOLnitro_compose_flow

Create or replace an automation flow from trigger + steps array. Creates a draft — use nitro_control_delivery to approve and activate. Any newly authored email step always enters the composition contract before persistence. composition_mode="intent" returns the current intent-scoped brand, memory, lifecycle, source, binding, and design context; the calling agent writes the steps, can validate without persistence, then calls this same tool with composition_mode="draft". The returned optional_server_authoring_call explicitly requests metered composition_mode="generate", which composes, validates, and persists one draft only. Contract-loop states return as normal tool results with composition_status and isError=false.

For fresh flow emails, each next_call.input email design uses the selected complete baseline and composition_contract.creative_routes is the one compact route menu. Preserve and fill those email baselines by default while authoring the required flow graph. To select another ready route, start a fresh intent with its creative_route_id; a route missing frozen evidence returns the exact facts it needs instead of substituting another layout. Full section authoring remains an intentional escape hatch under the same bindings and validator.

For image-led routes, follow next_call.image_choice exactly. Prefer a described brand-library asset, then an exact operator asset; otherwise obtain an exact verified vendor-site asset, generate an asset in the host and ingest it, or retrieve an exact public stock/Unsplash asset. Reissue intent with the exact image_url fact and what the image shows. Brand memory may guide tone and search terms but never proves an image URL or its contents; Nitrosend never browses or invents one during composition.

SMS-only flows and rename-only patches do not need email authoring context.

Modes: create (author a complete new graph), replace (author the complete graph of an existing draft; requires confirm, flow_id, and expected_draft_revision_id), patch (rename and/or update selected email actions by action_name + if_version). A patch preserves every unmentioned node and operational field. Create and replace contracts expose a complete authorable graph: their lifecycle scaffold is guidance, not a frozen section count, cadence, or topology. Step types: email (subject + design or body), sms (body), wait (duration in seconds), split (filters + yes/no branches, nested splits allowed), emit_event (fire event for contact to trigger other flows), webhook (url + optional method/headers/body), subscribe (opt-in contact to channel), unsubscribe (opt-out contact from channel).

Mutation safety: create, rename patch, and replace persistence all require idempotency_key. Use the exact stable key supplied by every draft next_call through repairs and exact persistence retries. Validate next_calls may carry rotating validation-round keys. Reuse a contract-free caller key only for an exact retry.

Body

application/json
namestring

Flow name (required for create mode)

modestringcreatereplacepatchcreate

create: new complete graph; replace: complete existing draft graph; patch: name and/or selected email actions

flow_idinteger

Required for replace/patch modes

expected_updated_atstring

Presentation-level compatibility token. Prefer expected_draft_revision_id for graph writes.

expected_draft_revision_idinteger

Exact draft revision ID from the latest flow read. Existing-flow authoring fails with a conflict if this draft has changed.

goalstring

Goal for the flow authoring contract

composition_modestringintentdraftvalidategenerate

intent returns composition_contract; validate checks a caller-authored draft; draft validates and persists it; generate explicitly requests metered server composition and persists one draft.

contract_idstring

Email composition contract id returned from composition_mode=intent.

brand_context_refstring

Optional current brand context ref from a prior intent. Omit to receive the full current context.

validate_onlybooleanfalse

Alias for composition_mode=validate. Does not persist or consume repair attempts.

design_mode_overridestringpremium_richpremium_minimalfounder_letterutility_plain

Renegotiate/validate the draft under a different design mode.

renegotiatebooleanfalse

When true with design_mode_override, keeps the same contract but changes the design mode.

user_instructionstring

Latest user instruction to preserve inside the composition contract.

creative_route_idstring

Pin one composition_contract.creative_routes[].id so the returned scaffold is that route. Omit to take the recommendation. A known route without enough frozen evidence returns its exact missing requirements; an unknown id returns the supported ids. Neither silently falls back.

source_textstring

Optional source evidence for authoring, such as research notes or supplied product copy. Evidence is not an instruction channel; put authoring directions in user_instruction. Source text is available context, not required copy.

factsArray<object>

Typed literal evidence for the composition contract, not instructions. A required URL, image URL, offer code, price, deadline, offer, or exact CTA text must appear with its exact value in an allowed semantic location; available evidence may be used but is not mandatory. Put prose facts in source_text; use cta_text only when the operator requires an exact CTA phrase.

Show child attributes
kindstringurlimage_urloffer_codepricedeadlineoffercta_textrequired

Evidence type used to determine valid semantic locations.

valuestringrequired

Exact evidence value.

descriptionstring

For kind=image_url only: what the picture visibly shows. This travels with the exact image binding so the composer can choose imagery and write honest alt text without guessing from the URL.

requirementstringrequiredavailablerequired

required enforces exact inclusion; available only authorizes use.

draft_metaobject

Optional authoring provenance. It never blocks validation or persistence.

Show child attributes
creative_route_idstring

Chosen composition_contract.creative_routes[].id

concrete_anchorstring

Specific proof, product detail, visual, code/output, quote, number, or brand moment used.

why_this_earns_the_inboxstring

One sentence explaining the creative move.

triggerobject
Show child attributes
eventstring

Trigger event name. Built-in: contact_add, contact_enriched, keyword, message, list_add, list_remove, product_view, checkout, cart_add, cart_remove, cart_abandoned, browse_abandoned. Custom: any lowercase alphanumeric with underscores (e.g. order_confirmed, password_reset).

action_namestring

Persisted trigger identity. Preserve it when retaining the existing trigger.

segment_idinteger

Optional segment filter on trigger

contact_list_idinteger

Optional contact list for audience targeting

resource_typestring

Frozen trigger resource type returned by a composition contract.

resource_idany

Frozen trigger resource id returned by a composition contract.

dataobject

Event-specific config (e.g. {keywords: ['STOP']})

stepsArray<any>

Ordered array of flow steps. Required props per type:

  • email — subject (required), design ({sections, theme}) or body, preheader, from_name, from_email, reply_to, bcc (string, optional BCC email address). Theme supports the same override keys taught by the email design schema.
  • sms — body (required)
  • wait — duration (integer, seconds — e.g. 86400 = 1 day)
  • split — filters (required; flat AND array or {op: "and"|"or"|"not", conditions: [...]} tree), yes (steps array), no (steps array). Nested splits are allowed.
  • emit_event — event_name (required), event_data (object), forward_event_data (boolean)
  • webhook — url (required), method (POST or PUT, default POST), headers (object), body (template string with merge tags)
  • subscribe — channel (phone, email, or all — default phone). Subscribes the contact.
  • unsubscribe — channel (phone, email, or all — default phone). Unsubscribes the contact.
dry_runbooleanfalse

Preview graph without persisting

idempotency_keystring

Required for every non-dry-run persistence mutation, including create, rename patch, and replace. Draft next_calls retain one stable contract persistence key; validate next_calls may rotate validation-round keys. Reuse a contract-free caller key only for an exact retry.

confirmbooleanfalse

Required for complete-graph replace mode

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_compose_flow
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_compose_flow",
    "arguments": {
        "name": "string",
        "mode": "create",
        "flow_id": 0,
        "expected_updated_at": "string",
        "expected_draft_revision_id": 0,
        "goal": "string",
        "composition_mode": "intent",
        "contract_id": "string",
        "brand_context_ref": "string",
        "validate_only": false,
        "design_mode_override": "premium_rich",
        "renegotiate": false,
        "user_instruction": "string",
        "creative_route_id": "string",
        "source_text": "string",
        "facts": [
          {
            "kind": "url",
            "value": "string",
            "description": "string",
            "requirement": "required"
          }
        ],
        "draft_meta": {
          "creative_route_id": "string",
          "concrete_anchor": "string",
          "why_this_earns_the_inbox": "string"
        },
        "trigger": {
          "event": "string",
          "action_name": "string",
          "segment_id": 0,
          "contact_list_id": 0,
          "resource_type": "string",
          "data": {}
        },
        "steps": [],
        "dry_run": false,
        "idempotency_key": "string",
        "confirm": false
      }
  }
}
const result = await client.callTool("nitro_compose_flow", {
  "name": "string",
  "mode": "create",
  "flow_id": 0,
  "expected_updated_at": "string",
  "expected_draft_revision_id": 0,
  "goal": "string",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "trigger": {
    "event": "string",
    "action_name": "string",
    "segment_id": 0,
    "contact_list_id": 0,
    "resource_type": "string",
    "data": {}
  },
  "steps": [],
  "dry_run": false,
  "idempotency_key": "string",
  "confirm": false
});
result = await session.call_tool("nitro_compose_flow", arguments={
  "name": "string",
  "mode": "create",
  "flow_id": 0,
  "expected_updated_at": "string",
  "expected_draft_revision_id": 0,
  "goal": "string",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "trigger": {
    "event": "string",
    "action_name": "string",
    "segment_id": 0,
    "contact_list_id": 0,
    "resource_type": "string",
    "data": {}
  },
  "steps": [],
  "dry_run": false,
  "idempotency_key": "string",
  "confirm": false
})
Request Body
{
  "name": "string",
  "mode": "create",
  "flow_id": 0,
  "expected_updated_at": "string",
  "expected_draft_revision_id": 0,
  "goal": "string",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "trigger": {
    "event": "string",
    "action_name": "string",
    "segment_id": 0,
    "contact_list_id": 0,
    "resource_type": "string",
    "data": {}
  },
  "steps": [],
  "dry_run": false,
  "idempotency_key": "string",
  "confirm": false
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_compose_campaign

destructive
TOOLnitro_compose_campaign

Compose an email or SMS campaign draft. This is the default tool when users want to draft or write a campaign; delivery is a separate explicit action. Creates a draft — use nitro_control_delivery to approve and send. Modes: create (new campaign), patch (update provided fields on an existing draft campaign), replace (replace draft campaign content/audience/schedule — requires confirm: true + campaign_id). Replace clears omitted audience and schedule instead of preserving stale targeting. Patch/replace cannot change the campaign channel; create a new campaign to switch between email and SMS. Campaigns are broadcasts to subscribed audiences. For receipts, confirmations, password resets, OTPs, or one-off lifecycle notifications, use nitro_send_message with data.* merge tags. For repeatable lifecycle automation, use nitro_compose_flow with a real event trigger. Newly authored email copy or design always enters the composition contract before persistence. composition_mode: "intent" returns the current intent-scoped brand, memory, source, binding, and design context. Fill next_call, optionally check it with composition_mode: "validate", then persist with composition_mode: "draft". Or explicitly use the returned optional_server_authoring_call for metered composition_mode: "generate"; Nitrosend then composes, validates, and persists one draft without sending or scheduling. Supplying creative fields without a contract returns that intent contract instead of silently bypassing it.

For fresh marketing email, next_call.input is the selected complete baseline and composition_contract.creative_routes is the one compact route menu. Preserve and fill that baseline by default. To select another ready route, start a fresh intent with its creative_route_id; a route missing frozen evidence returns the exact facts it needs instead of substituting another layout. Full section authoring remains an intentional escape hatch under the same bindings and validator.

For image-led routes, follow next_call.image_choice exactly. Prefer a described brand-library asset, then an exact operator asset; otherwise obtain an exact verified vendor-site asset, generate an asset in the host and ingest it, or retrieve an exact public stock/Unsplash asset. Reissue intent with the exact image_url fact and what the image shows. Brand memory may guide tone and search terms but never proves an image URL or its contents; Nitrosend never browses or invents one during composition.

Cloning an existing template without creative overrides preserves its already-authored content and does not require recomposition. State-free dry_run previews and non-creative operational edits do not create a contract.

SMS mode: channel: "sms" + body (required)

Nitrosend compiles the brief and validates/persists, while the calling agent writes the draft. Contract-loop states return as normal tool results with composition_status and isError=false. Preserve explicit user constraints: exact copy requests, URLs, offers, product details, sender fields, audience, schedule, tone, and legal copy. Each composition_contract.bindings entry teaches whether a typed value is required or available, its allowed semantic paths, and its exact preferred_reference. Copy that preferred_reference object unchanged when using the binding; only required bindings must appear. SMS campaigns are exempt from email composition contracts.

Mutation safety: every non-dry-run persistence call requires an idempotency_key. Reuse the same key only for an exact retry; changed input with the same key is rejected.

Body

application/json
namestring

Campaign name

modestringcreatepatchreplacecreate

create: new campaign; patch: update provided fields on an existing draft campaign; replace: replace existing draft content/audience/schedule and requires confirm: true. Replace clears omitted audience/schedule. Patch/replace cannot change channel.

campaign_idinteger

Required for patch/replace modes

channelstringemailsmsemail

Auto-detected as 'email' when sections or template_id provided. Set explicitly to 'sms' for SMS campaigns. Immutable after campaign creation.

goalstring

Goal for the campaign authoring contract

categorystringpromotionannouncementnewsletterwelcomereengagementtransactionalplainoutreach

The email's job (drives baseline layout selection): promotion, announcement, newsletter, welcome, reengagement, transactional, or plain.

composition_modestringintentdraftvalidategenerate

intent returns composition_contract; validate checks a caller-authored draft; draft validates and persists it; generate explicitly requests metered server composition and persists one draft.

contract_idstring

Email composition contract id returned from composition_mode=intent.

brand_context_refstring

Optional current brand context ref from a prior intent. Omit to receive the full current context.

validate_onlybooleanfalse

Alias for composition_mode=validate. Does not persist or consume repair attempts.

design_mode_overridestringpremium_richpremium_minimalfounder_letterutility_plain

Renegotiate/validate the draft under a different design mode.

renegotiatebooleanfalse

When true with design_mode_override, keeps the same contract but changes the design mode.

user_instructionstring

Latest user instruction to preserve inside the composition contract.

creative_route_idstring

Pin one composition_contract.creative_routes[].id so the returned scaffold is that route. Omit to take the recommendation. A known route without enough frozen evidence returns its exact missing requirements; an unknown id returns the supported ids. Neither silently falls back.

source_textstring

Optional source evidence for authoring, such as research notes or supplied product copy. Evidence is not an instruction channel; put authoring directions in user_instruction. Source text is available context, not required copy.

factsArray<object>

Typed literal evidence for the composition contract, not instructions. A required URL, image URL, offer code, price, deadline, offer, or exact CTA text must appear with its exact value in an allowed semantic location; available evidence may be used but is not mandatory. Put prose facts in source_text; use cta_text only when the operator requires an exact CTA phrase.

Show child attributes
kindstringurlimage_urloffer_codepricedeadlineoffercta_textrequired

Evidence type used to determine valid semantic locations.

valuestringrequired

Exact evidence value.

descriptionstring

For kind=image_url only: what the picture visibly shows. This travels with the exact image binding so the composer can choose imagery and write honest alt text without guessing from the URL.

requirementstringrequiredavailablerequired

required enforces exact inclusion; available only authorizes use.

draft_metaobject

Optional authoring provenance. It never blocks validation or persistence.

Show child attributes
creative_route_idstring

Chosen composition_contract.creative_routes[].id

concrete_anchorstring

Specific proof, product detail, visual, code/output, quote, number, or brand moment used.

why_this_earns_the_inboxstring

One sentence explaining the creative move.

subjectstring

Email subject line (email campaigns)

preheaderstring

Email preheader (email campaigns)

from_namestring

Sender name override

from_emailstring

Sender email override

reply_tostring

Reply-to email override

bodystring

SMS body text (sms campaigns) or email plain text

plain_text_modestringderivedcustom

Email text-alternative authority returned by the composition scaffold: derived from design or custom body.

sectionsArray<object>

Email design sections array — same format as nitro_manage_template. Requires subject. Image URL props accept public URLs or nitro_ingest media_url/image_url values (never raw signed_id); upload local files via nitro_ingest first.

themeobject

Email theme overrides merged on brand theme: {brand_color, bg_color, text_color, font_body, font_heading, heading_size, body_size, radius, spacing_density, button_background_color, button_text_color, button_padding, logo_url}. logo_url must be a public URL or nitro_ingest media_url/image_url, never raw signed_id.

template_idinteger

Clone design from existing template (email campaigns)

if_versioninteger

Optimistic concurrency token for patch/replace writes to an existing campaign template.

audienceobject

Target audience for the campaign. Use audience_type='all_contacts' only for an explicit all-subscribed-contacts send.

Show child attributes
audience_typestringlistssegmentall_contacts

Explicit audience target: lists, segment, or all_contacts

contact_list_idsArray<integer>

Send to contacts in these lists (union with dedup)

contact_list_idinteger

Deprecated — use contact_list_ids. Send to contacts in this list

segment_idinteger

Filter trigger to contacts matching this segment

exclude_segment_idsArray<integer>

Suppress contacts matching any of these segments (warmup suppression). Pass [] to clear; omit in patch mode to preserve.

exclude_contact_list_idsArray<integer>

Suppress contacts who are members of any of these lists (warmup suppression). Pass [] to clear; omit in patch mode to preserve.

scheduled_atstring<date-time>

ISO 8601 delivery time (e.g. '2026-03-01T10:00:00Z'). Omit for manual send.

dry_runbooleanfalse

Preview campaign without creating (default: false)

idempotency_keystring

Required for every non-dry-run persistence mutation, including SMS create, unchanged-template clone, patch, and replace. Contract draft next_calls supply the exact stable key. Reuse a contract-free caller key only for an exact retry.

confirmbooleanfalse

Required for replace mode

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_compose_campaign
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_compose_campaign",
    "arguments": {
        "name": "string",
        "mode": "create",
        "campaign_id": 0,
        "channel": "email",
        "goal": "string",
        "category": "promotion",
        "composition_mode": "intent",
        "contract_id": "string",
        "brand_context_ref": "string",
        "validate_only": false,
        "design_mode_override": "premium_rich",
        "renegotiate": false,
        "user_instruction": "string",
        "creative_route_id": "string",
        "source_text": "string",
        "facts": [
          {
            "kind": "url",
            "value": "string",
            "description": "string",
            "requirement": "required"
          }
        ],
        "draft_meta": {
          "creative_route_id": "string",
          "concrete_anchor": "string",
          "why_this_earns_the_inbox": "string"
        },
        "subject": "string",
        "preheader": "string",
        "from_name": "string",
        "from_email": "string",
        "reply_to": "string",
        "body": "string",
        "plain_text_mode": "derived",
        "sections": [
          {}
        ],
        "theme": {},
        "template_id": 0,
        "if_version": 0,
        "audience": {
          "audience_type": "lists",
          "contact_list_ids": [
            0
          ],
          "contact_list_id": 0,
          "segment_id": 0,
          "exclude_segment_ids": [
            0
          ],
          "exclude_contact_list_ids": [
            0
          ]
        },
        "scheduled_at": "2024-01-15T09:30:00Z",
        "dry_run": false,
        "idempotency_key": "string",
        "confirm": false
      }
  }
}
const result = await client.callTool("nitro_compose_campaign", {
  "name": "string",
  "mode": "create",
  "campaign_id": 0,
  "channel": "email",
  "goal": "string",
  "category": "promotion",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "subject": "string",
  "preheader": "string",
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "body": "string",
  "plain_text_mode": "derived",
  "sections": [
    {}
  ],
  "theme": {},
  "template_id": 0,
  "if_version": 0,
  "audience": {
    "audience_type": "lists",
    "contact_list_ids": [
      0
    ],
    "contact_list_id": 0,
    "segment_id": 0,
    "exclude_segment_ids": [
      0
    ],
    "exclude_contact_list_ids": [
      0
    ]
  },
  "scheduled_at": "2024-01-15T09:30:00Z",
  "dry_run": false,
  "idempotency_key": "string",
  "confirm": false
});
result = await session.call_tool("nitro_compose_campaign", arguments={
  "name": "string",
  "mode": "create",
  "campaign_id": 0,
  "channel": "email",
  "goal": "string",
  "category": "promotion",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "subject": "string",
  "preheader": "string",
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "body": "string",
  "plain_text_mode": "derived",
  "sections": [
    {}
  ],
  "theme": {},
  "template_id": 0,
  "if_version": 0,
  "audience": {
    "audience_type": "lists",
    "contact_list_ids": [
      0
    ],
    "contact_list_id": 0,
    "segment_id": 0,
    "exclude_segment_ids": [
      0
    ],
    "exclude_contact_list_ids": [
      0
    ]
  },
  "scheduled_at": "2024-01-15T09:30:00Z",
  "dry_run": false,
  "idempotency_key": "string",
  "confirm": false
})
Request Body
{
  "name": "string",
  "mode": "create",
  "campaign_id": 0,
  "channel": "email",
  "goal": "string",
  "category": "promotion",
  "composition_mode": "intent",
  "contract_id": "string",
  "brand_context_ref": "string",
  "validate_only": false,
  "design_mode_override": "premium_rich",
  "renegotiate": false,
  "user_instruction": "string",
  "creative_route_id": "string",
  "source_text": "string",
  "facts": [
    {
      "kind": "url",
      "value": "string",
      "description": "string",
      "requirement": "required"
    }
  ],
  "draft_meta": {
    "creative_route_id": "string",
    "concrete_anchor": "string",
    "why_this_earns_the_inbox": "string"
  },
  "subject": "string",
  "preheader": "string",
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "body": "string",
  "plain_text_mode": "derived",
  "sections": [
    {}
  ],
  "theme": {},
  "template_id": 0,
  "if_version": 0,
  "audience": {
    "audience_type": "lists",
    "contact_list_ids": [
      0
    ],
    "contact_list_id": 0,
    "segment_id": 0,
    "exclude_segment_ids": [
      0
    ],
    "exclude_contact_list_ids": [
      0
    ]
  },
  "scheduled_at": "2024-01-15T09:30:00Z",
  "dry_run": false,
  "idempotency_key": "string",
  "confirm": false
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_manage_domains

destructiveopen-world
TOOLnitro_manage_domains

Manage sending domains — add, verify, check DNS, list, and remove. Add returns every required customer-facing sending record. Apex receiving MX is exposed only after a forward-all route exists, so one-click setup cannot replace an existing mailbox provider without downstream delivery. check_dns validates customer-facing sending records, Nitro-owned delegate targets, and tracking HTTPS readiness.

Body

application/json
operationstringaddverifycheck_dnslistremoverequired

Which domain operation to perform:

  • add — params: {domain_name (required, e.g. "send.acme.com"), author_domain (optional, e.g. "acme.com")}. Registers the technical sending domain with the email provider and returns DNS records. Managed SES also prepares the aligned visible From domain when the sending domain is a subdomain. Apex receiving MX is omitted unless forward-all is already active. Idempotent: calling add on a pending domain re-returns the DNS records.
  • verify — params: {domain_name (required)}. Checks with the email provider after every customer-facing sending record has propagated. Also runs independent DNS validation and returns per-record dns_health. Route-gated apex receiving MX is outside sender verification. If verified, completes the domain_verified onboarding step and unlocks sending. If still pending, returns the DNS records again so you can re-show them to the user.
  • check_dns — params: {domain_name (required)}. Runs independent DNS validation plus live HTTPS readiness for branded tracking. Does not call the email provider. Useful for diagnosing missing or incorrect customer-facing records, Nitro-managed delegate targets, and tracking TLS failures before verify. Every customer-facing sending record must pass; apex receiving MX is returned only after forward-all is active.
  • list — no params needed. Returns all account domains with their verification status and DNS records. Includes dns_health, dmarc_policy, domain_limit (from tier), and domains_used count.
  • remove — params: {domain_name (required), unpair (optional)}. Deletes the domain. Requires confirm: true. If the domain is paired, the first attempt explains whether its counterpart will also be removed; ask the user to confirm that exact outcome, then retry with unpair: true.
paramsobject

Operation-specific parameters.

Show child attributes
domain_namestring

Technical sending domain to manage (e.g. 'send.acme.com'). Required for add, verify, remove.

author_domainstring

Optional visible From domain to authorize for managed SES (e.g. 'acme.com'). Must be the organizational domain of domain_name.

unpairboolean

For remove only. After the paired-domain warning has been shown and its exact outcome confirmed, set true to remove the selected domain and tear down its identity pair.

confirmbooleanfalse

Required for remove operation (destructive)

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_manage_domains
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_manage_domains",
    "arguments": {
        "operation": "add",
        "params": {
          "domain_name": "string",
          "author_domain": "string",
          "unpair": true
        },
        "confirm": false
      }
  }
}
const result = await client.callTool("nitro_manage_domains", {
  "operation": "add",
  "params": {
    "domain_name": "string",
    "author_domain": "string",
    "unpair": true
  },
  "confirm": false
});
result = await session.call_tool("nitro_manage_domains", arguments={
  "operation": "add",
  "params": {
    "domain_name": "string",
    "author_domain": "string",
    "unpair": true
  },
  "confirm": false
})
Request Body
{
  "operation": "add",
  "params": {
    "domain_name": "string",
    "author_domain": "string",
    "unpair": true
  },
  "confirm": false
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_configure_account

idempotent
TOOLnitro_configure_account

Read or configure sender defaults (from_name, from_email, reply_to) and test email recipients. Use nitro_get_status for account identity, dashboard links, readiness, and blockers. from_email must be authorized by a verified sending domain.

Parameters

from_namestringargument

Sender display name (e.g. 'Acme Marketing')

from_emailstringargument

Visible From address. May use the apex domain when an aligned sending subdomain authorizes it.

reply_tostringargument

Reply-to email address

test_email_recipientsArray<string>argument

Saved email addresses for test sends (max 5). Pass empty array to clear.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_configure_account
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_configure_account",
    "arguments": {
        "from_name": "string",
        "from_email": "string",
        "reply_to": "string",
        "test_email_recipients": [
          "user@example.com"
        ]
      }
  }
}
const result = await client.callTool("nitro_configure_account", {
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "test_email_recipients": [
    "user@example.com"
  ]
});
result = await session.call_tool("nitro_configure_account", arguments={
  "from_name": "string",
  "from_email": "string",
  "reply_to": "string",
  "test_email_recipients": [
    "user@example.com"
  ]
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_review_delivery

read-onlyidempotent
TOOLnitro_review_delivery

Read-only review of email/SMS content and delivery readiness for templates, flows, and campaigns. Returns validation, spam score for email, SMS segment info, preflight checks, and editor/preview URLs. Flow review requires an exact revision_id. This never approves delivery and never sends test messages.

Parameters

target_typestringtemplateflowcampaignrequiredargument

Entity type to review

target_idinteger>= 1requiredargument

Entity ID to review

revision_idinteger>= 1argument

Required for flows. Exact immutable flow revision to review.

contact_idinteger>= 1argument

Optional contact ID for merge-tag personalization during review

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_review_delivery
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_review_delivery",
    "arguments": {
        "target_type": "template",
        "target_id": 1,
        "revision_id": 1,
        "contact_id": 1
      }
  }
}
const result = await client.callTool("nitro_review_delivery", {
  "target_type": "template",
  "target_id": 1,
  "revision_id": 1,
  "contact_id": 1
});
result = await session.call_tool("nitro_review_delivery", arguments={
  "target_type": "template",
  "target_id": 1,
  "revision_id": 1,
  "contact_id": 1
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_send_test_message

destructiveidempotentopen-world
TOOLnitro_send_test_message

Send a real test message for an existing template, campaign, or flow step. Supports email and SMS targets. This never sends to a campaign audience, never approves delivery, and never schedules or launches a campaign. For the common "send a test of the last campaign" workflow, pass latest_campaign: true. If a flow has multiple message steps, pass action_id or template_id from nitro_review_delivery review_steps. Retry safety: pass the same idempotency_key on retry to avoid duplicate test messages.

Parameters

target_typestringtemplateflowcampaignargument

Target entity type. Use with target_id unless latest_campaign or template_id is used.

target_idinteger>= 1argument

Target entity ID. Use with target_type.

latest_campaignbooleanfalseargument

Use the most recently created campaign in this brand.

template_idinteger>= 1argument

Template to test directly, or the specific flow/campaign template to choose.

action_idinteger>= 1argument

Flow action ID to test when a flow has multiple message steps.

revision_idinteger>= 1argument

Required for flow targets. Exact immutable flow revision to test.

channelstringautoemailsmsautoargument

Channel to test. Use auto unless a standalone template is ambiguous.

contact_idinteger>= 1argument

Contact ID for recipient and merge-tag personalization. If present, this contact supplies the recipient address/phone.

toArray<string>argument

Explicit test recipients. Use email addresses for email targets and E.164 phone numbers for SMS targets.

dry_runbooleanfalseargument

Validate target and recipients without sending.

idempotency_keystringargument

Required for live test sends. Reuse the same stable key on retry to prevent duplicate delivery.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_send_test_message
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_send_test_message",
    "arguments": {
        "target_type": "template",
        "target_id": 1,
        "latest_campaign": false,
        "template_id": 1,
        "action_id": 1,
        "revision_id": 1,
        "channel": "auto",
        "contact_id": 1,
        "to": [
          "string"
        ],
        "dry_run": false,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_send_test_message", {
  "target_type": "template",
  "target_id": 1,
  "latest_campaign": false,
  "template_id": 1,
  "action_id": 1,
  "revision_id": 1,
  "channel": "auto",
  "contact_id": 1,
  "to": [
    "string"
  ],
  "dry_run": false,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_send_test_message", arguments={
  "target_type": "template",
  "target_id": 1,
  "latest_campaign": false,
  "template_id": 1,
  "action_id": 1,
  "revision_id": 1,
  "channel": "auto",
  "contact_id": 1,
  "to": [
    "string"
  ],
  "dry_run": false,
  "idempotency_key": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_control_delivery

destructiveopen-world
TOOLnitro_control_delivery

Manage delivery lifecycle for flows and campaigns. State: draft -> approve -> live/schedule <> pause, cancel -> archive. Flow approve/reject/live require exact revision_id; resume never publishes a draft. Use archive for cleanup history, or delete confirmed never-sent drafts.

Parameters

target_typestringflowcampaignrequiredargument

Entity type

target_idinteger>= 1requiredargument

Entity ID

operationstringapproverejectliveschedulepauseresumecancelarchiverestoredeleterequiredargument

Lifecycle operation. approve runs preflight. schedule is campaign-only (requires scheduled_at). delete requires confirm: true and only applies to never-sent non-live drafts/archives.

scheduled_atstring<date-time>argument

Required for schedule operation (ISO 8601 datetime)

revision_idinteger>= 1argument

Required for flow approve, reject, and live. Must be the exact current draft revision. Omit for pause/resume.

confirm_send_to_allbooleanargument

Required when making a campaign live or scheduled with audience_type='all_contacts'. Forces an explicit all-subscribed-contacts confirmation.

confirmbooleanargument

Required for operation='delete'.

idempotency_keystringargument

Optional retry key for campaign live sends. Reuse the same key after a timeout to recover the same delivery progress.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_control_delivery
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_control_delivery",
    "arguments": {
        "target_type": "flow",
        "target_id": 1,
        "operation": "approve",
        "scheduled_at": "2024-01-15T09:30:00Z",
        "revision_id": 1,
        "confirm_send_to_all": true,
        "confirm": true,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_control_delivery", {
  "target_type": "flow",
  "target_id": 1,
  "operation": "approve",
  "scheduled_at": "2024-01-15T09:30:00Z",
  "revision_id": 1,
  "confirm_send_to_all": true,
  "confirm": true,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_control_delivery", arguments={
  "target_type": "flow",
  "target_id": 1,
  "operation": "approve",
  "scheduled_at": "2024-01-15T09:30:00Z",
  "revision_id": 1,
  "confirm_send_to_all": true,
  "confirm": true,
  "idempotency_key": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_get_insights

read-onlyidempotent
TOOLnitro_get_insights

Get email analytics with trends, benchmarks, and recommendations.

Parameters

scopestringaccountflowcampaignmessagerequiredargument

Scope of insights: account-wide, per flow, per campaign, or per message

entity_idinteger>= 1argument

Required for flow/campaign/message scope

periodstring7d30d90d30dargument

Time period for metrics (default 30d)

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_get_insights
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_get_insights",
    "arguments": {
        "scope": "account",
        "entity_id": 1,
        "period": "30d"
      }
  }
}
const result = await client.callTool("nitro_get_insights", {
  "scope": "account",
  "entity_id": 1,
  "period": "30d"
});
result = await session.call_tool("nitro_get_insights", arguments={
  "scope": "account",
  "entity_id": 1,
  "period": "30d"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_configure_providers

idempotent
TOOLnitro_configure_providers

Configure BYO email provider credentials or check provider status.

Parameters

operationstringconfigurestatusrequiredargument

configure sets BYO provider credentials; status checks current provider health

providerstringmailgunsespostmarkresendsendgridargument

Email provider (required for configure)

api_keystringargument

Provider API key (required for configure, never returned in responses)

api_secretstringargument

Optional provider secret (never returned in responses)

regionstringargument

Provider region where required, or the Mailgun sending domain

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_configure_providers
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_configure_providers",
    "arguments": {
        "operation": "configure",
        "provider": "mailgun",
        "api_key": "string",
        "api_secret": "string",
        "region": "string"
      }
  }
}
const result = await client.callTool("nitro_configure_providers", {
  "operation": "configure",
  "provider": "mailgun",
  "api_key": "string",
  "api_secret": "string",
  "region": "string"
});
result = await session.call_tool("nitro_configure_providers", arguments={
  "operation": "configure",
  "provider": "mailgun",
  "api_key": "string",
  "api_secret": "string",
  "region": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_set_memory

idempotent
TOOLnitro_set_memory

Read or update the AI memory document. Operations: read (get current), update (replace entirely), patch (replace a ## section by heading), append (add text to end).

Parameters

operationstringreadupdatepatchappendrequiredargument

read: get current document. update: replace entirely. patch: replace a ## section by heading. append: add text to end.

documentstringargument

Full markdown document (required for update).

headingstringargument

Section heading to patch (e.g. 'Brand Goals'). Required for patch operation. Matches ## headings.

contentstringargument

New content for the section (patch) or text to append (append).

dry_runbooleanfalseargument
idempotency_keystringargument

Required for non-dry-run append. Reuse the same key only for an exact retry. Update and patch are set operations and may omit it.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_set_memory
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_set_memory",
    "arguments": {
        "operation": "read",
        "document": "string",
        "heading": "string",
        "content": "string",
        "dry_run": false,
        "idempotency_key": "string"
      }
  }
}
const result = await client.callTool("nitro_set_memory", {
  "operation": "read",
  "document": "string",
  "heading": "string",
  "content": "string",
  "dry_run": false,
  "idempotency_key": "string"
});
result = await session.call_tool("nitro_set_memory", arguments={
  "operation": "read",
  "document": "string",
  "heading": "string",
  "content": "string",
  "dry_run": false,
  "idempotency_key": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_manage_billing

open-world
TOOLnitro_manage_billing

Manage subscription billing and Nitrosend balance — check status, start a human checkout, poll payment, and list plans.

  • status — no params. Returns current subscription, plan, and account tier.
  • checkout — params: {plan_id (required)}. Creates the account provider's human approval URL. The agent CANNOT pay or approve directly — tell the operator to open the URL.
  • checkout_status — no params. Poll whether subscription is active after checkout.
  • plans — no params. Lists available paid plans with pricing.
  • add_funds — params: {amount_cents, currency, idempotency_key}. Creates a one-time checkout URL for the operator. It does not charge.
  • funding_purchase_status — params: {purchase_id}. Reads one local Add funds purchase.

Body

application/json
operationstringstatuscheckoutcheckout_statusplansadd_fundsfunding_purchase_statusrequired

Billing operation to perform

paramsobject

Operation-specific parameters.

Show child attributes
plan_idinteger

Plan ID (required for checkout)

amount_centsinteger

Integer amount in minor currency units

currencystring

Three-letter funding currency

idempotency_keystring

Stable key for this Add funds request

purchase_idinteger

Local funding purchase ID

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_manage_billing
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_manage_billing",
    "arguments": {
        "operation": "status",
        "params": {
          "plan_id": 0,
          "amount_cents": 0,
          "currency": "string",
          "idempotency_key": "string",
          "purchase_id": 0
        }
      }
  }
}
const result = await client.callTool("nitro_manage_billing", {
  "operation": "status",
  "params": {
    "plan_id": 0,
    "amount_cents": 0,
    "currency": "string",
    "idempotency_key": "string",
    "purchase_id": 0
  }
});
result = await session.call_tool("nitro_manage_billing", arguments={
  "operation": "status",
  "params": {
    "plan_id": 0,
    "amount_cents": 0,
    "currency": "string",
    "idempotency_key": "string",
    "purchase_id": 0
  }
})
Request Body
{
  "operation": "status",
  "params": {
    "plan_id": 0,
    "amount_cents": 0,
    "currency": "string",
    "idempotency_key": "string",
    "purchase_id": 0
  }
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_send_message

destructiveidempotentopen-world
TOOLnitro_send_message

Send a transactional email or SMS to a single recipient immediately. No campaign, no audience, no approval required. Use for: receipts, password resets, OTPs, order confirmations, system notifications. NOT for marketing broadcasts to lists/segments — use nitro_compose_campaign. NOT for automated sequences triggered by events — use nitro_compose_flow. Retry safety: pass the same idempotency_key on retry to avoid duplicate sends.

Parameters

channelstringemailsmsrequiredargument

Delivery channel

tostringrequiredargument

Recipient email address or E.164 phone number

subjectstringargument

Email subject line (required for email)

bodystringargument

Message body. Required for SMS. Optional plain text for email.

template_idintegerargument

Load email design from an existing template (email only)

dataobjectargument

Transactional merge variables. Use in email templates as {{ data.order_id }} or nested paths like {{ data.customer.name }}.

idempotency_keystringargument

Required for live sends. Reuse the same stable key on retry to prevent duplicate delivery.

dry_runbooleanfalseargument

Validate and preview without sending

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_send_message
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_send_message",
    "arguments": {
        "channel": "email",
        "to": "string",
        "subject": "string",
        "body": "string",
        "template_id": 0,
        "data": {},
        "idempotency_key": "string",
        "dry_run": false
      }
  }
}
const result = await client.callTool("nitro_send_message", {
  "channel": "email",
  "to": "string",
  "subject": "string",
  "body": "string",
  "template_id": 0,
  "data": {},
  "idempotency_key": "string",
  "dry_run": false
});
result = await session.call_tool("nitro_send_message", arguments={
  "channel": "email",
  "to": "string",
  "subject": "string",
  "body": "string",
  "template_id": 0,
  "data": {},
  "idempotency_key": "string",
  "dry_run": false
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_inbox

read-onlyidempotent
TOOLnitro_inbox

Read the agent inbox queue and mailbox. Commands: list_queue, get_item, validate_reply, list_mailbox, get_thread, get_thread_page, get_message_body. Follow the exact next_calls returned by get_thread when older messages or a truncated sanitized body are available.

Parameters

commandstringlist_queueget_itemvalidate_replylist_mailboxget_threadget_thread_pageget_message_bodyrequiredargument

Inbox read command

action_item_idintegerargument

Queue item id for get_item or validate_reply

conversation_idintegerargument

Conversation id for thread, body, or reply validation commands

before_occurred_atstringargument

Exact ISO 8601 thread cursor returned by get_thread or get_thread_page

before_message_idintegerargument

Exact thread cursor message id returned with before_occurred_at

message_idintegerargument

Conversation message id for get_message_body

offsetinteger>= 0argument

Exact sanitized-body character offset returned by get_thread or get_message_body

statestringquarantineneeds_humanagent_readyhandledneeds_attentionallargument

Optional queue state filter; default needs_attention

statusstringopenclosedarchivedargument

Optional mailbox conversation status filter for list_mailbox

querystringargument

Optional mailbox search across subject/preview plus exact addresses

inbox_idintegerargument

Optional mailbox inbox id filter

pageintegerargument

Page number, default 1

perintegerargument

Results per page, max 50

brand_context_refstringargument

Optional verified current brand context ref for get_item/get_thread. Omit on first read; oversized context returns an exact paged resource instead of partial JSON.

reply_context_digeststringargument

Current reply_context.context_digest required by validate_reply.

subjectstringargument

Optional reply subject for validate_reply

bodystringargument

Plain text reply body for validate_reply

htmlstringargument

Optional HTML reply body for validate_reply

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_inbox
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_inbox",
    "arguments": {
        "command": "list_queue",
        "action_item_id": 0,
        "conversation_id": 0,
        "before_occurred_at": "string",
        "before_message_id": 0,
        "message_id": 0,
        "offset": 0,
        "state": "quarantine",
        "status": "open",
        "query": "string",
        "inbox_id": 0,
        "page": 0,
        "per": 0,
        "brand_context_ref": "string",
        "reply_context_digest": "string",
        "subject": "string",
        "body": "string",
        "html": "string"
      }
  }
}
const result = await client.callTool("nitro_inbox", {
  "command": "list_queue",
  "action_item_id": 0,
  "conversation_id": 0,
  "before_occurred_at": "string",
  "before_message_id": 0,
  "message_id": 0,
  "offset": 0,
  "state": "quarantine",
  "status": "open",
  "query": "string",
  "inbox_id": 0,
  "page": 0,
  "per": 0,
  "brand_context_ref": "string",
  "reply_context_digest": "string",
  "subject": "string",
  "body": "string",
  "html": "string"
});
result = await session.call_tool("nitro_inbox", arguments={
  "command": "list_queue",
  "action_item_id": 0,
  "conversation_id": 0,
  "before_occurred_at": "string",
  "before_message_id": 0,
  "message_id": 0,
  "offset": 0,
  "state": "quarantine",
  "status": "open",
  "query": "string",
  "inbox_id": 0,
  "page": 0,
  "per": 0,
  "brand_context_ref": "string",
  "reply_context_digest": "string",
  "subject": "string",
  "body": "string",
  "html": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_inbox_action

destructive
TOOLnitro_inbox_action

Mutate an agent inbox item or mailbox thread. Commands: send_reply, send_reply_test, mark_handled, request_human, release_to_agent, mark_quarantine.

Parameters

commandstringsend_replysend_reply_testmark_handledrequest_humanrelease_to_agentmark_quarantinerequiredargument

Inbox action command

action_item_idintegerargument

Queue item id for queue-gated commands

conversation_idintegerargument

Mailbox conversation id for reply commands

subjectstringargument

Optional reply subject for send_reply or send_reply_test

bodystringargument

Plain text reply body for send_reply or send_reply_test

htmlstringargument

Optional HTML reply body for send_reply or send_reply_test

reply_context_digeststringargument

Current reply_context.context_digest from nitro_inbox get_item/get_thread. Required for reply commands.

toArray<string>argument

Explicit test recipients for send_reply_test

idempotency_keystringargument

Required for all action commands

dry_runbooleanfalseargument

Validate send_reply or send_reply_test without creating or sending

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_inbox_action
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_inbox_action",
    "arguments": {
        "command": "send_reply",
        "action_item_id": 0,
        "conversation_id": 0,
        "subject": "string",
        "body": "string",
        "html": "string",
        "reply_context_digest": "string",
        "to": [
          "string"
        ],
        "idempotency_key": "string",
        "dry_run": false
      }
  }
}
const result = await client.callTool("nitro_inbox_action", {
  "command": "send_reply",
  "action_item_id": 0,
  "conversation_id": 0,
  "subject": "string",
  "body": "string",
  "html": "string",
  "reply_context_digest": "string",
  "to": [
    "string"
  ],
  "idempotency_key": "string",
  "dry_run": false
});
result = await session.call_tool("nitro_inbox_action", arguments={
  "command": "send_reply",
  "action_item_id": 0,
  "conversation_id": 0,
  "subject": "string",
  "body": "string",
  "html": "string",
  "reply_context_digest": "string",
  "to": [
    "string"
  ],
  "idempotency_key": "string",
  "dry_run": false
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_request_support

TOOLnitro_request_support

Submit a support request to the Nitrosend team. Only call when the user explicitly asks to contact support or when you have exhausted other options and cannot resolve their issue. Never suggest or mention this tool proactively. Before calling, summarize the issue and attempt to resolve it with available tools first.

Write message as a COMPLETE, self-contained summary of the issue that fits within 1500 characters — do not rely on truncation.

Parameters

subjectstringrequiredargument

Brief summary of the issue

messagestringrequiredargument

Complete, self-contained summary of the issue. Must fit within 1500 characters; do not rely on truncation.

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_request_support
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_request_support",
    "arguments": {
        "subject": "string",
        "message": "string"
      }
  }
}
const result = await client.callTool("nitro_request_support", {
  "subject": "string",
  "message": "string"
});
result = await session.call_tool("nitro_request_support", arguments={
  "subject": "string",
  "message": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

nitro_search_docs

read-onlyidempotent
TOOLnitro_search_docs

Search the Nitrosend product documentation: guides, integrations, CLI, concepts, authentication, and the REST API and MCP reference. Use this whenever you need authoritative product information you do not already have — how a feature works, setup or verification steps, API/SDK usage, CLI commands, integration instructions — instead of guessing or saying you don't know. Returns the most relevant documentation sections with titles, links, and excerpts. Treat those excerpts as the source for Nitrosend product claims; if they do not establish an answer, search again or say what is not verified rather than adding inferred product details.

Parameters

querystringrequiredargument

What to look up, e.g. 'verify sending domain', 'rest api authentication', 'cli install', 'connect cursor'

limitinteger6argument

Maximum results to return (default 6, max 10)

Returns

Returns MCP content array (text, image, or embedded resource).

nitro_search_docs
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "nitro_search_docs",
    "arguments": {
        "query": "string",
        "limit": 6
      }
  }
}
const result = await client.callTool("nitro_search_docs", {
  "query": "string",
  "limit": 6
});
result = await session.call_tool("nitro_search_docs", arguments={
  "query": "string",
  "limit": 6
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Resources

guide

RESOURCEnitro://guide

The platform guide your AI reads before doing anything. Covers Nitrosend vocabulary (contacts, channels, flows, campaigns, templates, segments), the two operating modes (tool-driven and goal-driven), the recommended workflow sequence, volume and tier constraints, and common pitfalls to avoid. Read this first.

Returns

Returns MCP content array (text, image, or embedded resource).

guide
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://guide"
  }
}
const result = await client.readResource("nitro://guide");
result = await session.read_resource("nitro://guide")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

account

RESOURCEnitro://account

Live snapshot of the current account context: account, brand, sender identity, dashboard links, tier (free / paid / trusted), email and SMS volume used vs caps, onboarding checklist progress, contact and list counts, and active flow/campaign summary.

Returns

Returns MCP content array (text, image, or embedded resource).

account
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://account"
  }
}
const result = await client.readResource("nitro://account");
result = await session.read_resource("nitro://account")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

schema

RESOURCEnitro://schema

Machine-readable schema for composing emails and flows. Includes every email section type (header, text, image, button, columns, product, social, divider, spacer, footer) with required and optional props, all flow step types with their parameters, trigger event names, and the full list of segment filter names and predicates.

Returns

Returns MCP content array (text, image, or embedded resource).

schema
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://schema"
  }
}
const result = await client.readResource("nitro://schema");
result = await session.read_resource("nitro://schema")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

brand-kit

RESOURCEnitro://brand-kit

The selected brand's Brand Kit identity. Returns brand_color, text_color, bg_color, font_heading, font_body, logo_url, company_name, company_description, physical_address, screenshot_url when a website screenshot exists, and the brand voice document. For local logo files, use nitro_ingest with image_data or upload reservation before setting logo_url. Creative intent contracts already include the canonical authoring context; read this resource for manual edits or deeper inspection.

Returns

Returns MCP content array (text, image, or embedded resource).

brand-kit
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://brand-kit"
  }
}
const result = await client.readResource("nitro://brand-kit");
result = await session.read_resource("nitro://brand-kit")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

providers

RESOURCEnitro://providers

Current email provider configuration and health. Shows whether the account uses Nitrosend's managed SES or a BYO provider (Mailgun, SES, Postmark, Resend, SendGrid), domain verification status for each sending domain, and the active sending mode (sandbox vs production).

Returns

Returns MCP content array (text, image, or embedded resource).

providers
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://providers"
  }
}
const result = await client.readResource("nitro://providers");
result = await session.read_resource("nitro://providers")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

config

RESOURCEnitro://config

Account-level sender defaults: from_name, from_email, reply_to, and saved test email recipients. These are applied automatically to campaigns and flows when per-message overrides are not specified.

Returns

Returns MCP content array (text, image, or embedded resource).

config
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://config"
  }
}
const result = await client.readResource("nitro://config");
result = await session.read_resource("nitro://config")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

email-design

RESOURCEnitro://email-design

Deep email design reference for campaign, template, or flow email sections. Composition contracts already include selected design capsules; read this only when deeper archetype, color, imagery, whitespace, footer, or section-translation context is needed.

Returns

Returns MCP content array (text, image, or embedded resource).

email-design
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://email-design"
  }
}
const result = await client.readResource("nitro://email-design");
result = await session.read_resource("nitro://email-design")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

email-marketing

RESOURCEnitro://email-marketing

Deep email marketing reference for campaign, template, or flow email content. Composition contracts already include selected marketing capsules; read this only when deeper strategy, audience, lifecycle, copy, deliverability, compliance, or intent context is needed.

Returns

Returns MCP content array (text, image, or embedded resource).

email-marketing
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://email-marketing"
  }
}
const result = await client.readResource("nitro://email-marketing");
result = await session.read_resource("nitro://email-marketing")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

lifecycle

RESOURCEnitro://lifecycle

Canonical machine-readable lifecycle flow catalog. Includes priority order, goal aliases, real trigger events, trigger gating requirements, revenue rationale, and structured cadence for welcome, abandoned cart, browse abandonment, post-purchase, win-back, re-engagement, and newsletter flows.

Returns

Returns MCP content array (text, image, or embedded resource).

lifecycle
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://lifecycle"
  }
}
const result = await client.readResource("nitro://lifecycle");
result = await session.read_resource("nitro://lifecycle")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

docs

RESOURCEnitro://docs

The Nitrosend product documentation map: every guide, integration, CLI, concept, authentication, and REST API / MCP reference page with its path and summary. Use the nitro_search_docs tool to search the full documentation content for how-to and reference answers.

Returns

Returns MCP content array (text, image, or embedded resource).

docs
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://docs"
  }
}
const result = await client.readResource("nitro://docs");
result = await session.read_resource("nitro://docs")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

example-email

RESOURCEnitro://examples/email

A complete working email design showing every section type in context — header with logo, hero image, text blocks, buttons, two-column product grid, social links, divider, spacer, and footer with unsubscribe. Use as a copy-paste starting point or reference for prop names, style overrides, and column nesting.

Returns

Returns MCP content array (text, image, or embedded resource).

example-email
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://examples/email"
  }
}
const result = await client.readResource("nitro://examples/email");
result = await session.read_resource("nitro://examples/email")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

example-flow

RESOURCEnitro://examples/flow

A complete automation flow example demonstrating all step types: email with inline design, SMS, wait (duration in seconds), split with filter conditions and yes/no branches, emit_event, webhook, subscribe, and unsubscribe. Shows trigger configuration, branching structure, and merge-tag usage.

Returns

Returns MCP content array (text, image, or embedded resource).

example-flow
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://examples/flow"
  }
}
const result = await client.readResource("nitro://examples/flow");
result = await session.read_resource("nitro://examples/flow")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

example-campaign

RESOURCEnitro://examples/campaign

Complete campaign examples for both email and SMS channels. Shows audience targeting with contact_list_ids and segment_id, scheduled delivery with scheduled_at, inline email design with sections, and SMS body composition.

Returns

Returns MCP content array (text, image, or embedded resource).

example-campaign
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://examples/campaign"
  }
}
const result = await client.readResource("nitro://examples/campaign");
result = await session.read_resource("nitro://examples/campaign")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

knowledge-index

RESOURCEnitro://knowledge/index

Index of built-in email marketing knowledge topics. Returns a list of available slugs with titles and short descriptions. Use a slug with nitro://knowledge/{slug} to read the full topic content. Topics cover deliverability, subject lines, segmentation, automation best practices, and compliance.

Returns

Returns MCP content array (text, image, or embedded resource).

knowledge-index
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://knowledge/index"
  }
}
const result = await client.readResource("nitro://knowledge/index");
result = await session.read_resource("nitro://knowledge/index")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

memory

RESOURCEnitro://memory

The operator's persistent AI memory document. Contains business goals, target audience, preferred email strategy, tone of voice notes, and any other context the operator has saved. Creative intent contracts already include the authoritative memory projection; read this resource for explicit inspection or memory management. Managed via the nitro_set_memory tool.

Returns

Returns MCP content array (text, image, or embedded resource).

memory
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://memory"
  }
}
const result = await client.readResource("nitro://memory");
result = await session.read_resource("nitro://memory")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

history

RESOURCEnitro://history

Unified account history combining notification events and MCP tool audit entries. Includes deliverability warnings, auto-pauses, suppressions, and tool-call audit records with timestamps, correlation IDs, payload summaries, and rollback eligibility.

Returns

Returns MCP content array (text, image, or embedded resource).

history
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://history"
  }
}
const result = await client.readResource("nitro://history");
result = await session.read_resource("nitro://history")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

fields

RESOURCEnitro://fields

Per-account contact field catalog grouped by category (contact, custom, enrichment, engagement, tag). Each entry includes key, category, field_type, label, promoted flag, and fill_rate (percentage of contacts with a value, null when not yet computed). Read this for field and segment-filter inspection. The authoring intent's merge grammar is authoritative for recipient-copy bindings; field-catalog membership alone does not make an entry safe or portable email content.

Returns

Returns MCP content array (text, image, or embedded resource).

fields
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://fields"
  }
}
const result = await client.readResource("nitro://fields");
result = await session.read_resource("nitro://fields")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

authoring-context

RESOURCEnitro://authoring-context/{ref}{?cursor}

Lossless paged read of the exact canonical brand authoring packet named by a composition contract. Start at its supplied ref URI, follow each exact next_uri, concatenate chunk.text in offset order, and verify packet_digest before filling that contract's draft call. A stale ref never returns current content under the old address.

Parameters

refstringrequiredpath
?cursorstringrequiredpath

Returns

Returns MCP content array (text, image, or embedded resource).

authoring-context
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://authoring-context/{ref}{?cursor}"
  }
}
const result = await client.readResource("nitro://authoring-context/{ref}{?cursor}");
result = await session.read_resource("nitro://authoring-context/{ref}{?cursor}")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

outreach-campaign

RESOURCEnitro://outreach/campaigns/{campaign_id}

Bounded discovery-campaign detail: target profile, criterion coverage, spend budgets, funnel counters, source progress, degradation, and activation-ready inventory. Use nitro_manage_outreach for intent, estimate, start, pause, resume, cancel, and summary status.

Parameters

campaign_idstringrequiredpath

Returns

Returns MCP content array (text, image, or embedded resource).

outreach-campaign
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://outreach/campaigns/{campaign_id}"
  }
}
const result = await client.readResource("nitro://outreach/campaigns/{campaign_id}");
result = await session.read_resource("nitro://outreach/campaigns/{campaign_id}")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

knowledge-topic

RESOURCEnitro://knowledge/{slug}

Full content for a single knowledge topic. Pass a slug from the knowledge index (e.g. nitro://knowledge/deliverability). Returns a markdown document with actionable guidance your AI can apply when composing emails, building flows, or advising on strategy.

Parameters

slugstringrequiredpath

Returns

Returns MCP content array (text, image, or embedded resource).

knowledge-topic
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://knowledge/{slug}"
  }
}
const result = await client.readResource("nitro://knowledge/{slug}");
result = await session.read_resource("nitro://knowledge/{slug}")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

prompt

RESOURCEnitro://prompts/{name}

Rendered prompt template by name. Returns structured workflow instructions that guide the AI through multi-step tasks like onboarding a new account, running a campaign review, or setting up a welcome series. Each prompt includes context requirements, step sequence, and expected tool calls.

Parameters

namestringrequiredpath

Returns

Returns MCP content array (text, image, or embedded resource).

prompt
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "nitro://prompts/{name}"
  }
}
const result = await client.readResource("nitro://prompts/{name}");
result = await session.read_resource("nitro://prompts/{name}")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Prompts

audience-analysis

PROMPTaudience-analysis

Analyse audience segments and engagement

Parameters

goalstringrequiredargument

What you want to learn or achieve, e.g. 'find disengaged subscribers', 'segment by purchase history', 'identify VIP customers'

Returns

Returns MCP content array (text, image, or embedded resource).

audience-analysis
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "audience-analysis",
    "arguments": {
        "goal": "<goal>"
      }
  }
}
const result = await client.getPrompt("audience-analysis", {
  goal: "<goal>",
});
result = await session.get_prompt("audience-analysis", arguments={
    "goal": "<goal>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

build-email

PROMPTbuild-email

Compose a marketing email

Parameters

goalstringrequiredargument

What the email is for, e.g. 'announce our spring sale', 'weekly newsletter', 'event invitation', 'product launch'

Returns

Returns MCP content array (text, image, or embedded resource).

build-email
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "build-email",
    "arguments": {
        "goal": "<goal>"
      }
  }
}
const result = await client.getPrompt("build-email", {
  goal: "<goal>",
});
result = await session.get_prompt("build-email", arguments={
    "goal": "<goal>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

build-flow

PROMPTbuild-flow

Create an automated email flow from scratch

Parameters

goalstringrequiredargument

What the flow should achieve, e.g. 'welcome series for new signups', 'abandoned cart recovery', 're-engage inactive subscribers'

Returns

Returns MCP content array (text, image, or embedded resource).

build-flow
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "build-flow",
    "arguments": {
        "goal": "<goal>"
      }
  }
}
const result = await client.getPrompt("build-flow", {
  goal: "<goal>",
});
result = await session.get_prompt("build-flow", arguments={
    "goal": "<goal>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

diagnose-deliverability

PROMPTdiagnose-deliverability

Diagnose and fix email deliverability issues

Returns

Returns MCP content array (text, image, or embedded resource).

diagnose-deliverability
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "diagnose-deliverability",
    "arguments": {}
  }
}
const result = await client.getPrompt("diagnose-deliverability");
result = await session.get_prompt("diagnose-deliverability")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

flow-review

PROMPTflow-review

Review and optimise an existing flow

Parameters

flow_idstringargument

ID of the flow to review. If omitted, lists active flows for the user to choose.

Returns

Returns MCP content array (text, image, or embedded resource).

flow-review
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "flow-review",
    "arguments": {
        "flow_id": "<flow_id>"
      }
  }
}
const result = await client.getPrompt("flow-review", {
  flow_id: "<flow_id>",
});
result = await session.get_prompt("flow-review", arguments={
    "flow_id": "<flow_id>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

lifecycle-setup

PROMPTlifecycle-setup

Review a brand site and draft the key lifecycle automation flows

Parameters

website_urlstringargument

Brand website to review and scrape, e.g. https://example.com

test_recipientstringargument

Email address that should receive flow test messages

Returns

Returns MCP content array (text, image, or embedded resource).

lifecycle-setup
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "lifecycle-setup",
    "arguments": {
        "website_url": "<website_url>",
        "test_recipient": "<test_recipient>"
      }
  }
}
const result = await client.getPrompt("lifecycle-setup", {
  website_url: "<website_url>",
  test_recipient: "<test_recipient>",
});
result = await session.get_prompt("lifecycle-setup", arguments={
    "website_url": "<website_url>",
    "test_recipient": "<test_recipient>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

onboard-brand-kit

PROMPTonboard-brand-kit

Set up Brand Kit identity for a new brand

Returns

Returns MCP content array (text, image, or embedded resource).

onboard-brand-kit
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "onboard-brand-kit",
    "arguments": {}
  }
}
const result = await client.getPrompt("onboard-brand-kit");
result = await session.get_prompt("onboard-brand-kit")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

weekly-report

PROMPTweekly-report

Generate a weekly performance report

Returns

Returns MCP content array (text, image, or embedded resource).

weekly-report
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "weekly-report",
    "arguments": {}
  }
}
const result = await client.getPrompt("weekly-report");
result = await session.get_prompt("weekly-report")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}