Skip to main content
Glama
522,894 tools. Updated 2026-09-06 13:24

"Resend" matching MCP tools:

  • WORKFLOW: Step 2 of 4 - Continue infrastructure design conversation Send a user message to the active InsideOut session and receive the assistant reply. The response contains a clean message from Riley - display it to the user. ⚠️ CRITICAL: DO NOT answer Riley's questions yourself! Forward questions to the user and wait for their response. NEVER fabricate or assume the user's answer, even if you think you know what they would say. Examples of questions Riley asks that YOU MUST forward to the user: - 'Any questions or tweaks to these details?' - 'Ready for the cost estimate?' - 'Do you want to change the stack/config?' - 'Ready to proceed to Terraform?' When Riley asks ANY question, STOP and wait for the user's answer! 📋 WORKFLOW PHASES: The typical flow is conversation → tfgenerate → tfdeploy When terraform_ready=true appears in THIS tool's response, THEN you can call tfgenerate. ⚠️ DO NOT call tfgenerate until this tool returns! Wait for the response first. 🎯 KEY SIGNALS IN RESPONSE: - `[TERRAFORM_READY: true]` → NOW you can call tfgenerate - `[[BUTTON_TF_APPLY: ...]]` → Deployment is ready! Ask user if they want to deploy, then use tfdeploy - `[[BUTTON_TF_DESTROY: ...]]` → User confirmed destroy intent! Ask user to confirm, then use tfdestroy - `[[BUTTON_TF_PLAN: ...]]` → User wants to preview changes! Use tfplan to run a plan, then tfdeploy with plan_id to apply REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: timeout (integer) - seconds to wait for response. For Cursor, use 50 (default). Max 55. OPTIONAL: project_context (string) - Only pass genuinely NEW project details the user shares after convoopen. Do NOT resend context already provided in convoopen — Riley remembers it. Do NOT scan files or directories to gather this — only use what the user explicitly tells you. Example: user reveals a new constraint like 'we also need HIPAA compliance' mid-conversation. 💡 TIP: Use convostatus to check progress anytime. Examine workflow.usage prompt for more guidance.
    ConnectorNo auth
  • WORKFLOW: Step 2 of 4 - Continue infrastructure design conversation Send a user message to the active InsideOut session and receive the assistant reply. The response contains a clean message from Riley - display it to the user. ⚠️ CRITICAL: DO NOT answer Riley's questions yourself! Forward questions to the user and wait for their response. NEVER fabricate or assume the user's answer, even if you think you know what they would say. Examples of questions Riley asks that YOU MUST forward to the user: - 'Any questions or tweaks to these details?' - 'Ready for the cost estimate?' - 'Do you want to change the stack/config?' - 'Ready to proceed to Terraform?' When Riley asks ANY question, STOP and wait for the user's answer! 📋 WORKFLOW PHASES: The typical flow is conversation → tfgenerate → tfdeploy When terraform_ready=true appears in THIS tool's response, THEN you can call tfgenerate. ⚠️ DO NOT call tfgenerate until this tool returns! Wait for the response first. 🎯 KEY SIGNALS IN RESPONSE: - `[TERRAFORM_READY: true]` → NOW you can call tfgenerate - `[[BUTTON_TF_APPLY: ...]]` → Deployment is ready! Ask user if they want to deploy, then use tfdeploy - `[[BUTTON_TF_DESTROY: ...]]` → User confirmed destroy intent! Ask user to confirm, then use tfdestroy - `[[BUTTON_TF_PLAN: ...]]` → User wants to preview changes! Use tfplan to run a plan, then tfdeploy with plan_id to apply REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: timeout (integer) - seconds to wait for response. For Cursor, use 50 (default). Max 55. OPTIONAL: project_context (string) - Only pass genuinely NEW project details the user shares after convoopen. Do NOT resend context already provided in convoopen — Riley remembers it. Do NOT scan files or directories to gather this — only use what the user explicitly tells you. Example: user reveals a new constraint like 'we also need HIPAA compliance' mid-conversation. 💡 TIP: Use convostatus to check progress anytime. Examine workflow.usage prompt for more guidance.
    ConnectorNo auth
  • Confirma o numero do dono com o codigo OTP de 6 digitos que chegou no WhatsApp dele apos o `provision`. OBRIGATORIO antes de enviar/agendar: ate verificar, `send`/`reply`/`schedule` retornam 403 owner_not_verified. Se o codigo expirou ou errou demais, chame de novo apos pedir um novo (resend) ao operador.
    ConnectorNo auth
  • Deploy a v2 app: an HTML document plus a capability manifest, hosted at its own URL. A redeploy only needs the content that changed. Every content field is optional when `app_id` is given, and an omitted one keeps what is live: omit `manifest` for an HTML-only change, omit `html` for a manifest-only change, omit `assets` to keep the current files. This is the cheap path and the default, because an omitted field costs no output tokens at all: a one-line colour change does not resend the whole document, and a manifest edit does not resend it either. A field only needs sending when its content differs from what is live. `assets: []` is the explicit way to clear the asset set, and omitting all three is refused, since there would be nothing to change. The extension keys used most often: app metadata; collections, with per-collection write, update, read and delete role lists, where write gates creates and also gates updates unless an update list is declared; externalHosts, a fetch allowlist; cdn, to allow CDN scripts and styles; capabilities, for Permissions-Policy opt-ins; embeds, an iframe frame-src allowlist; notify, for email-on-row rules; webhooks, for signed HTTP POST on-row rules; and agentTasks, to queue work for an agent running on the owner's own machine, described as a prompt rather than as code. The manifest grammar is documented in the Homespun guide that get_skill returns. Pass no `app_id` to create, which mints a slug and URL and requires both `html` and `manifest`, or pass `app_id` to redeploy an existing app. Supply the HTML inline as `html`, or as `html_path`, an absolute path read on the MCP-server host, which is the relay for a hosted connector or the CLI host for a locally-run one, and not the remote agent's machine; it avoids retransmitting a large HTML file on every deploy, only a locally-run connector can read it, and inline `html` wins if both are given. `dry_run:true` (alias `check`) validates only: it runs the full manifest and asset validation, the redeploy compat gate and the schedule-timezone advisory, then returns { ok, warnings, compat?, breaks? } without creating a version or mutating anything, and it resolves omitted fields the same way a real deploy would, so it reports on exactly the deploy that would run. A redeploy is refused with manifest_incompatible_redeploy, unless force:true, when it would strand rows already written (dropping a collection, tightening a schema, flipping appendOnly), or when it would widen what the app's install screen discloses: a collection's read reaching further than the live manifest, a capability added, cdn turned on, or a host added to externalHosts, embeds or a webhook target. The break quotes the sentence a user would now be asked to approve. Taking access away never prompts: dropping a role, dropping a capability, host or webhook, turning cdn off, or adding update:[\"creator\"] to a write:[\"anyone\"] collection, all redeploy clean. A removed collection is detached rather than deleted. Images, fonts, audio, video and data files ship with the app in the same call via `assets[]`. Each is validated and stored app-scoped and served at its `path` on the app's own origin, so the HTML references it by a stable same-origin path such as `<img src=\"frames/000.jpg\">`; media and font paths support HTTP Range for seeking. A redeploy's assets replace the previous version's set when sent, carry over when omitted, and are cleared by `assets: []`. Returns { app_id, slug, url, version, visibility, created } on create, or { app_id, version, compat, breaks? } on redeploy.
    ConnectorNo auth
  • Create a Keelen account (or start agent login) — emails a 6-digit code. UNAUTHENTICATED — the only tool besides verify_email that works before a bearer key is configured. `email` is where the code is sent. Flow: signup(email) -> the user reads the 6-digit code from their inbox -> verify_email(email, code) returns a reveal-once API key -> save it as this server's `Authorization: Bearer <api_key>` header in your MCP client config -> reconnect -> get_onboarding_status() to continue setup. The code expires in 15 minutes; call signup again to resend. Response is uniform whether or not the email already has an account (enumeration-safe), so signup doubles as agent LOGIN. Rate-limited per IP and per email. ASK THE USER for `email` in chat and WAIT for their answer before calling this. Do NOT infer it from your client profile, the logged-in account, git config, or any other ambient source; if you already hold a candidate, echo it back and get an explicit yes first. Because this call doubles as LOGIN, a guessed address signs the user in to whatever workspace owns it, and the rest of setup then mints an API key on, and creates a project in, an account they did not choose.
    ConnectorNo auth

Matching MCP Servers

Matching MCP Connectors

  • Send, track, and manage transactional emails at scale

  • NextBento is a production-ready Next.js 16 SaaS boilerplate with Supabase auth (OAuth, magic link, email/password), Stripe subscriptions, owner/admin/member teams, Resend email, programmatic SEO templates, and 8 AI skills.

  • Append many rows to a workspace's table surface in ONE call — the bulk version of create_row. Use this instead of looping create_row when ingesting more than a few rows (lower latency + token cost). Pass `rows` as an array of `{ data: {...} }` objects, each `data` a column-name → value map (same shape create_row takes). Up to 500 rows per call. ALL-OR-NOTHING: if any row fails the whole batch is rolled back, so on error you can safely resend the entire batch. Targets one surface for the whole batch (`surface_slug`, or the workspace's primary table surface). `auto_create_columns: true` appends a text column for every unmapped key across the batch (one schema extension). Returns `{ created, rows, created_columns }`.
    ConnectorNo auth
  • Update many existing rows in ONE call — the bulk version of update_row. Use this instead of looping update_row when changing more than a few rows (much lower latency + token cost for sheet edits). Pass `updates` as an array of `{ id, data }`: `id` is the row id (from get_rows / query_rows), `data` is a column-name → value map of just the cells to change. Each row's data is MERGED into the existing row (last-write-wins per field), so you only send the cells you're changing. Up to 500 rows per call. ALL-OR-NOTHING: if any id is missing or in another workspace the whole batch is rejected and nothing is written, so on error you can safely resend the entire batch. Values are coerced to each column's type. Returns `{ updated, rows }`.
    ConnectorNo auth
  • Upload or attach a user-supplied or externally-designed image (bring-your-own asset) to a post: the creator's own visual (a product shot, their actual work, a card designed elsewhere) instead of an AI-generated image (niche_render_image_card photo, paid) or a flat brand card. Free, with no image-generation spend. For a visual-product maker the real piece is the sale. Input modes, in order of preference: (1) `upload_ref`, the FAST path for an agent that built the asset itself and can run a shell: POST the raw file to `/asset/upload` (multipart/form-data, your bearer token) to get back an `upload_ref`, then pass it here. The bytes travel over HTTP and never round-trip through the model as base64, so it's effectively instant for a real graphic. (2) `image_url`, a fetchable https URL (the server fetches + stores it; for an asset that already lives on the web). (3) `image: {mime_type, data_base64}`, inline base64, fine for small images only. (4) `image_chunk`, the no-shell FALLBACK: upload bounded chunks of base64. It still re-types the bytes through the model (slow), so use it only when the agent has no shell to curl with. Split the file's bytes into ~32-48KB pieces, base64 EACH independently, send in order, each with a `sha256` of that piece's raw bytes so the server catches a mis-transcribed chunk and has you resend just that one (this is what makes the slow path reliable). Omit upload_id on the first chunk; the response returns one to pass on the rest. Set `final:true` on the last chunk (optionally with `total_sha256`); that call assembles, validates, and attaches. The cell's output must already exist (use niche_add_output first if needed). Sets it as the post's image; publishes with the caption. A dimension_note warns if the image's aspect won't fit the cell. Undo-able (the prior image is kept in history).
    ConnectorNo auth
  • Resend a hotel reservation confirmation email. Use either the confirmation number from a successful lookup_booking call, or the guest's full name and email address when they do not know their confirmation number, card last four, or check-in date. The email contains the hotel confirmation number the guest can then use with lookup_booking or cancel_booking. Recovery requests never reveal whether a reservation matched. The confirmation is sent only to the email address already on the booking record; there is no recipient override. Email changes are handled at https://stayker.com/service.
    ConnectorNo auth
  • Create and activate a campaign on a lead list. You supply name, offer, leads[], sequence[] (per step: subject, body, delayDays), sendWindow, timezone, stopOnReply — the platform does not write copy. Steps schedule up front; suppressed leads are skipped. Returns { campaignId }. Campaigns send real mail, so a launch identical to one this account made in the last 60 seconds is REFUSED with 409 { code:'duplicate_campaign', existingCampaignId } rather than contacting the same prospects twice — check that campaign instead of relaunching. Resend the same idempotencyKey to retry a call whose response you lost: that replays the original result instead of being refused. Campaigns that differ in any field, and deliberate relaunches after the window, are never blocked.
    Connector
    Destructive
    No auth
  • Downgrade: release your N NEWEST live mailboxes now and lower the billed quantity. Inputs: count, acknowledged (must be true — this is a quoted, irreversible-this-cycle consent: the release is immediate for provisioning but there is NO mid-cycle credit; the lower price takes effect next renewal, minimum 5 mailboxes / $99). Returns { releasedCount, failedCount, unreleased, billing, deduplicated } where billing is the new projected monthly. `releasedCount` is what COMPLETED and can be less than the `count` you asked for; `failedCount` is how many the provider refused, which are STILL LIVE and still billed, and `unreleased` names those addresses — read them before concluding a downgrade landed. `deduplicated: true` means this call did NOT re-perform the downgrade — every count above describes an EARLIER call's already-recorded outcome under the same idempotencyKey, not new work done just now. This can be true even after the 30-day idempotency window itself has expired: the underlying release record persists independently, so a reused key still reports no re-release rather than silently starting a fresh one. `count` is RELATIVE — it releases that many MORE mailboxes, it does not set your fleet to that size — and release cannot be undone through this API, so ALWAYS pass an idempotencyKey: the FIRST call under a key resolves WHICH mailboxes to release and records that exact set, so every later call carrying the SAME key can only ever finish that same set. A same-key retry re-attempts the stragglers and can never release a mailbox outside them, whatever `count` you send with it (the recorded set wins over a changed count); a retry WITHOUT a key always releases another `count`. A genuine SECOND downgrade is therefore a NEW key — reusing an old one can only ever finish what that key already asked for. A call that came back with failedCount above zero did NOT finish, so its key is not frozen: resend the identical request with the same key until failedCount is 0 — from then on that key replays the finished result and releases nothing further. If a call returns 409 a release is already running for this account: wait, then re-read infrastructure_status before deciding whether to retry. To ADD mailboxes use setup_infrastructure / configure_byo_domain (request_managed_mailboxes).
    Connector
    Destructive
    No auth
  • Create, update (edit), move/reschedule, shift, reflect, or manage a block's checklist — bulk/batch, one or many in a single call. Pass `ops`, an array where each item has an `op` (create | update | move | shift | reflect | checklist) plus that op's fields; a single edit is just a 1-item array. Times are 24-hour HH:MM; for an event crossing midnight set endNextDay=true. `reflect` records how a PAST planned event actually went (kept | skipped | changed | added, with an optional actual time) — it never renames or re-times the plan; target one occurrence of a recurring event by its `seriesId@YYYY-MM-DD` id. `checklist` manages a block's microtasks: pass `items` to set/replace the ordered list (a template edit — whole series, or one occurrence with scope 'this'), or `check`/`uncheck` (by item id or exact text) to tick them off for a single occurrence; the current microtasks + each one's done state come back on a get_schedule read as the event's `checklist`. For a recurring event choose a `scope`: 'all' (default), 'future', or 'this' (the last two need `occurrenceDate`). To re-time an existing event use `move` (new start/date, duration kept) or `shift` (relative nudge by `byMinutes`); use `update` only to also rename, re-kind, re-area, or resize (change `end`). If you know the duration but not a conflict-free time (or only a rough window), use `schedule` instead of a create. By default the whole batch is atomic: if ANY op fails validation (e.g. a conflict), nothing is written and the failing ops are returned as errors — fix and resend. Pass `partial: true` for best-effort (apply what's valid). Ops apply in order as one transaction and are checked against each other: two creates can't double-book a slot, and an earlier move frees a slot a later op can reuse. Target each event id at most once per batch. Reference an area/activity type by id or by `areaName`/`activityTypeName`; create new ones first with manage_categories. If the user has a Google Calendar connected, creating or editing a calendar-linked event (or one created under their default sync calendar) also pushes the change to Google — the same as editing on the dial; don't edit an event get_schedule/find_event marked `readOnly` (it's from a calendar the user doesn't own and the change would silently revert). To remove events or clear a day use delete_events. The response reports `applied`, `failed`, `skipped` (validated but not written because the atomic batch was rejected), and per-op `results` (each with its 0-based `index`).
    ConnectorOAuth
  • Returns instructions for creating a DPF account, verifying its email, resending the verification code, or resetting a forgotten password — it never performs these itself and never asks for a password. A password typed into this chat would sit in the conversation transcript, so every action instead returns the DPF website's own form, or a curl command that reads the password from a shell variable the user sets themselves in their own terminal. Hand the command to the user to run — do not run it yourself even if you have shell access, since composing the export line would require seeing the password. action "register": requires email, firstName, lastName, and termsAccepted: true (only after the user has explicitly agreed to the DPF Terms of Service and Privacy Policy in this conversation). action "verify": confirm the 6-digit code DPF emailed after registration (requires otp). action "resend": re-send that code if it never arrived. action "forgot-password": request a password-reset code (requires email). action "reset-password": submit that code and set a new password (requires otp).
    ConnectorOAuth
  • Relays a message you sealed locally with /svc/msg2-sdk.mjs (seal(mailbox, inner) → {ephemeralPubKey, viewTag, ct}). This tool cannot encrypt for you: sending plaintext here would expose it to the relay, so it only accepts the sealed triple. Replay-idempotent (a resend returns duplicate:true). The message appears in the public feed at releaseAt. If you cannot run the SDK, use v1 (POST /api/messages/send) and know that v1 is plaintext.
    ConnectorNo auth
  • Configure ONE step of a marketplace's setup wizard. CRITICAL: configuring the SUMMARY step FINISHES + ACTIVATES the marketplace — in AUTO product mode that publishes EVERY matching product to the LIVE channel (spends budget), so to test safely set MANUAL mode FIRST (set_marketplace_product_mode) and submit one item with run_marketplace_item_action; check activationBehavior in get_marketplace before finishing. Marketplaces are set up step by step IN ORDER: call this repeatedly, targeting each step the previous result reported as nextStepType, until nextStepType is null (setup complete). Identify the step by step_index (from get_marketplace steps[].index) — REQUIRED to disambiguate when two steps share a step_type (e.g. two 'form' steps: Identifiers and Offer Features); step_type alone targets the FIRST step of that type. Configuring out of order or before prerequisites are met returns 'prerequisite_not_met' / 'step_not_available' (e.g. category mapping precedes the attribute step). PAYLOAD: for a form / order-settings step, payload = {items: {fieldCode: value, ...}} built from that step's fields (get_marketplace steps[].fields — each field is {code, label, type, required, options, optionsSource, htmlAttributes, value, help}); send ONLY the fields you want to change — the others keep their current value and nothing is deleted. A dropdown/options field takes the option's VALUE — options is a list of {value, label} rows, so send options[].value (e.g. external_product_id: "ean" for the Ean source attribute), NEVER a row's position in that list; read steps[].fields[].options first. If a field arrives with optionsPending=true its option list is not known yet (usually because the channel connection does not exist); finish the auth step and re-read get_marketplace rather than guessing a value. A REQUIRED field with an empty value is yours to fill even when htmlAttributes look pre-filled — the server only supplies it when it can resolve it from the connection, and it says so in the error when it cannot. Structured steps use their own payload: the product-filter step accepts attribute_filter (the condition tree as a JSON string, or "" to clear it), category_filter (a JSON string {categories_operator, categories:[...]}), and the flag export_out_of_stock ("0"|"1"); send ONLY what changes — it merges over the current filter, so the untouched flags/filters are kept. To include or exclude out-of-stock products use the export_out_of_stock flag — NEVER put a qty/stock condition in attribute_filter (it is an invalid state and is rejected). (export_children_as_parent and export_removed_products are managed in the Koongo UI and CANNOT be set here — sending either is rejected.) category-mapping and mapping-table likewise take their own payload. Returns {integrationId, stepType, status, ready, lastStep, nextStepType, oauthUrl, transitions[], message}. When transitions[] reports a product export/generation (e.g. moving into the summary/preview), that runs ASYNC — poll marketplace_status until productsRefreshing AND productsSubmitting are false before reading get_marketplace_report (its dataCheckErrors = the KOONGO DATA CHECK) or trusting counts. status: 'saved' (applied; transitions[] lists automation that ran), 'oauth_required' or 'credentials_in_ui' (a CONNECTION step — see below; TERMINAL, do not retry), 'prerequisite_not_met' / 'step_not_available', or 'validation_failed' (the message lists the field problems — unknown field, value outside its options, non-numeric value, or missing required field — fix them using the step's fields). CATEGORY ATTRIBUTES MAY BE DEFERRED: on channels whose attributes depend on the mapped categories, saving the product-filter step starts that download in the BACKGROUND instead of doing it inline. You can tell: transitions[] then says the download was started (and does NOT claim the attributes were fetched or an export ran), and categoryAttributeWarmup is present with pending:true. Do not call the refresh tool and do not read the attribute list yet — poll marketplace_status until the block is absent or reports state 'ready'. The attributes are pulled in automatically when it finishes; state 'failed' means call refresh_marketplace_category_attributes once. CONNECTION IS NOT CONFIGURABLE HERE: the connection/auth step (credentials, API keys, OAuth, auth settings) can NEVER be set through MCP — this is intentional and permanent for security, not a limitation to work around. When a step returns 'oauth_required' or 'credentials_in_ui', that status is FINAL for that step: do NOT resend it, do NOT guess field codes or a payload, do NOT keep retrying — the result will not change (it is not transient and not a validation error you can fix). Hand the returned oauthUrl (OAuth) or editUrl (credentials, entered in the Koongo UI) to the USER, then STOP and wait; once they finish, re-check marketplace_status (isConnected) and continue with the NEXT step. marketplace_id is from list_marketplaces / create_marketplace. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
    ConnectorOAuth
  • Configure ONE step of an ad's setup wizard. CRITICAL: configuring the SUMMARY step FINISHES + ACTIVATES the ad — in AUTO product mode that publishes EVERY matching product to the LIVE channel (spends budget), so to test safely set MANUAL mode FIRST (set_ad_product_mode) and submit one item with run_ad_item_action; check activationBehavior in get_ad before finishing. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces, and have no order sync. Ads are set up step by step IN ORDER: call this repeatedly, targeting each step the previous result reported as nextStepType, until nextStepType is null (setup complete). Identify the step by step_index (from get_ad steps[].index) — REQUIRED to disambiguate when two steps share a step_type (e.g. two 'form' steps); step_type alone targets the FIRST step of that type. Configuring out of order or before prerequisites are met returns 'prerequisite_not_met' / 'step_not_available' (e.g. category mapping precedes the attribute step). PAYLOAD: for a form / order-settings step, payload = {items: {fieldCode: value, ...}} built from that step's fields (get_ad steps[].fields — each field is {code, label, type, required, options, optionsSource, htmlAttributes, value, help}); send ONLY the fields you want to change — the others keep their current value and nothing is deleted. A dropdown/options field takes the option's VALUE — options is a list of {value, label} rows, so send options[].value, NEVER a row's position in that list; If a field arrives with optionsPending=true its option list is not known yet (usually because the channel connection does not exist); finish the auth step and re-read get_ad rather than guessing a value. A REQUIRED field with an empty value is yours to fill even when htmlAttributes look pre-filled — the server only supplies it when it can resolve it from the connection, and it says so in the error when it cannot. read steps[].fields[].options first. Structured steps use their own payload: the product-filter step accepts attribute_filter (the condition tree as a JSON string, or "" to clear it), category_filter (a JSON string {categories_operator, categories:[...]}), and the flag export_out_of_stock ("0"|"1"); send ONLY what changes — it merges over the current filter, so the untouched flags/filters are kept. To include or exclude out-of-stock products use the export_out_of_stock flag — NEVER put a qty/stock condition in attribute_filter (it is an invalid state and is rejected). (export_children_as_parent and export_removed_products are managed in the Koongo UI and CANNOT be set here — sending either is rejected.) category-mapping and mapping-table likewise take their own payload. Returns {integrationId, stepType, status, ready, lastStep, nextStepType, oauthUrl, transitions[], message}. When transitions[] reports a product export/generation (e.g. moving into the summary/preview), that runs ASYNC — poll ad_status until productsRefreshing AND productsSubmitting are false before reading get_ad_report (its dataCheckErrors = the KOONGO DATA CHECK) or trusting counts. status: 'saved' (applied; transitions[] lists automation that ran), 'oauth_required' or 'credentials_in_ui' (a CONNECTION step — see below; TERMINAL, do not retry), 'prerequisite_not_met' / 'step_not_available', or 'validation_failed' (the message lists the field problems — unknown field, value outside its options, non-numeric value, or missing required field — fix them using the step's fields). CATEGORY ATTRIBUTES MAY BE DEFERRED: on channels whose attributes depend on the mapped categories, saving the product-filter step starts that download in the BACKGROUND instead of doing it inline. You can tell: transitions[] then says the download was started (and does NOT claim the attributes were fetched or an export ran), and categoryAttributeWarmup is present with pending:true. Do not call the refresh tool and do not read the attribute list yet — poll ad_status until the block is absent or reports state 'ready'. The attributes are pulled in automatically when it finishes; state 'failed' means call refresh_ad_category_attributes once. CONNECTION IS NOT CONFIGURABLE HERE: the connection/auth step (credentials, API keys, OAuth, auth settings) can NEVER be set through MCP — this is intentional and permanent for security, not a limitation to work around. When a step returns 'oauth_required' or 'credentials_in_ui', that status is FINAL for that step: do NOT resend it, do NOT guess field codes or a payload, do NOT keep retrying — the result will not change (it is not transient and not a validation error you can fix). Hand the returned oauthUrl (OAuth) or editUrl (credentials, entered in the Koongo UI) to the USER, then STOP and wait; once they finish, re-check ad_status (isConnected) and continue with the NEXT step. ad_id is from list_ads / create_ad. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
    ConnectorOAuth
  • [chieflab_* alias of chiefmo_send_approved_email] Send an approved launch email through the email sending rail (current adapter: resend). USE WHEN the user has approved an email publishAction from chiefmo_launch_product and you need to fire the send. Strict approval gate (same shape as chiefmo_publish_approved_post). `from` MUST be on a domain verified at the adapter (resend.com) — check chieflab_list_email_senders first. Single recipient or short list (≤50). Money/external-system action — once sent cannot be unsent.
    ConnectorNo auth
  • Use this when the signed-in user asks about pending parent invites, share codes, or whether their parent invite has been accepted yet. Returns each pending invite with hours_until_expiry. RULE: if any invite has hours_until_expiry < 24 (and not expired), proactively offer to resend it via the resend-parent-invite flow. If expired, offer to send a fresh invite. Requires sign-in.
    ConnectorNo auth
  • USE WHEN any launch action carries a manualFallback brief — either because the channel has no automated provider at all (Product Hunt, Hacker News, Reddit, Discord, Slack, Indie Hackers, dev.to, YC Bookface, blog) OR because the channel HAS an automated provider but its connector isn't wired yet for this workspace (LinkedIn / X without a Zernio key; email without a Resend key + verified sender domain). Pattern: use the inline fallback NOW to ship the launch manually; connect the provider LATER (each fallback returns an upgradePath with the exact connector wiring) so the same action publishes automatically on the next launch. Returns: paste-ready title + body, per-channel checklist (best time, format, first-comment script), capture-URL-after instruction, measurement template for the 24h readback, and the optional upgradePath when automation is available. Converts a 'blocked' channel into a 5-minute human-in-the-loop ship. Approval-gated upstream: the originating publishAction must already be 'approved' on the reviewUrl before this tool returns the brief.
    ConnectorNo auth
  • Validate an IBAN and identify the institution that holds the account. Performs format check, country-specific length check, and ISO 7064 mod-97 checksum verification. Also returns COUNTRY-level banking rules for the IBAN's country prefix (national currency, SEPA status, expected format). CROSS-CHECKS THE BENEFICIARY BANK. Where the country's IBAN registry mask defines the bank identifier as four alpha characters (GB, NL, IE, RO, PK, MT, JO, QA, KW and others), `bank_identifier.resolved_institution` names the institution that actually holds the account, read out of the IBAN itself. Call this whenever the user supplies an IBAN AND names a beneficiary bank or BIC — if the two disagree, that mismatch is a far better explanation for a rejected or returned payment than anything you can infer, and it is invisible without this call. `valid: true` means the check digits are right and NOTHING MORE — not that the account exists, is open, or belongs to the named beneficiary or the named bank. Never rule out the account details on the strength of it when diagnosing a failed payment (see `verification_note`). An IBAN encodes country + bank + account number and carries NO currency information. `country_currency` is the country's national currency, NOT this account's denomination — never infer a currency mismatch or a "resend in X" recommendation from it (see `currency_note` in the response). Examples: iban_validate("DE89370400440532013000") iban_validate("GB29 NWBK 6016 1331 9268 19")
    ConnectorNo auth