Docs  Messages, email and business

Tools

Messages, email and business

Email, Discord, Telegram and the other channels, files handed over where you are, and drafts for your brand that wait for your yes.


What this family is for

These tools say things for you and hand over what Mori made: an email with the zip attached, a file on Telegram while you are on your phone, a note on Slack when a job ends. They also draft posts and ad campaigns for your business, which never go out on their own. Setting up the bots is on Discord, Telegram and your phone.

Email, and what sent means

send_email sends a real email in one step, attachments included, through the Gmail you are signed in to in Chrome, with an SMTP account you set up as the fallback. An attachment can be named by its path, its file name, or "the pdf you just made".

Only a confirmed send counts. Any other result means nothing was sent, and the reply says so plainly instead of saying done. When Gmail is not signed in, the fix is to sign in to Gmail in Chrome.

send_bulk_email sends the same email to up to 25 people, one at a time, with a sent or failed line for each. Mori shows you the whole list, the subject and the body first, and the tool refuses unless your latest message approves it.

Chats and channels

  • Discord: a person or a channel, named the way you name them. An unclear name comes back with the choices instead of a guess, and list_discord_targets shows everything the bot can reach.
  • Telegram: you, this chat, or a chat id. A Telegram bot cannot find someone by username or start a conversation, so the person has to message the bot first.
  • Slack, Matrix, Zulip, Signal, IRC and ntfy: send_channel_message, after list_channels says which are live.

The file tools hand over the real file in the chat you are in, which beats saying where it is saved. A failed send is never reported as sent.

Drafts for your brand

draft_social_post writes a post for your brand's account and puts it in the approval queue in Settings > Business. Nothing publishes until you approve it there, and it is for real, disclosed brand accounts through official channels only: never fake personas or bought engagement. business_status says which accounts are connected.

ads works in Creation's Ads tab: brand kits, campaigns with variants for each shape, imported numbers and tests. Publishing an ad or giving it a budget always asks you on a card naming the spend. See Ads.

Who can be sent to, and when

Sending is for the owner. Someone else who talks to your bot gets a conversation with the model alone, with no tools. A scheduled or unattended run never sends, and a run nobody is watching never drives your Chrome to send an email.

Permissions

Email, bulk email and the ads tool follow the Browser Control switch in Settings > Permissions, because email goes through your browser. Drafting a post follows File Writing. Discord, Telegram and channel messages run at the Standard and Full Agent levels whenever the bot behind them is connected. Listing targets and channels, the business status and the drafts queue always run, because they only read.

14  The toolsfrom the app itself

Each description below is the exact text her model reads when it decides which tool to call.

send_email

Send a real email in ONE step, attachments included. Use whenever asked to email something to an address. Transport is automatic on both macOS and Windows, the Gmail the user is already signed into in Chrome, with a configured SMTP account as a fallback, so NEVER tell them to set up SMTP or an app password; when a send fails for want of a session the fix is to open Chrome and sign into Gmail. ATTACHMENTS: pass any reference to the file as attachmentPath, a full path, a bare filename, or a phrase ('the pdf you just made'). Returns {ok, status, message}. ONLY status 'sent' means it was sent. EVERY OTHER STATUS MEANS IT WAS NOT SENT: never say 'sent' or 'done', and if ok is false nothing was sent whatever the message says. 'not_signed_in' and 'no_chrome': OUTPUT THE message FIELD WORD FOR WORD rather than summarising, a paraphrase once turned this into 'email isn't connected, log in', which is exactly wrong, and the fix for both is Chrome + Gmail, never an app password. 'attach_failed': the file was not found or could not be confirmed; report exactly what it says. 'unknown': the send could not be confirmed, which means it did not happen, say so plainly and offer to retry.

send_bulk_email

Send the SAME email to a LIST of recipients (up to 25 per run) through whichever transport this computer uses (macOS and Windows: the user's signed-in Gmail in Chrome, needing no setup; a configured SMTP account only as a fallback, and on Linux), sequential, throttled, with a per-recipient sent/failed ledger returned at the end. MANDATORY FLOW: (1) draft it, (2) show the user the FULL recipient list + subject + body and ask for approval, (3) ONLY after they explicitly say yes, call this tool. It will refuse if the user's latest message isn't an approval. Never call it unattended or on a schedule.

send_discord_message

Send a Discord message to a person or channel (works while the Discord bot is running). Use when the owner asks you to message / DM / tell / reply-to someone on Discord. Name the recipient however the owner did: @mention, username, display name, "#channel", a numeric ID, or "server/channel" when two servers share a channel name. If the name is ambiguous or unknown it tells you so and names the alternatives rather than guessing, call list_discord_targets to see everything reachable.

send_discord_file

DELIVER a FILE (zip, pdf, doc, image, spreadsheet, anything) to the owner over Discord, the reliable way to actually hand over something you built or found when the conversation is on Discord. Defaults to the CURRENT Discord chat, so you usually just pass the file. The file ref resolves like email attachments: a full path, a bare filename ('site.zip'), or a phrase like 'the zip you just made' / 'the file you just created'. Optionally add a short caption. Prefer this over email when the owner is on Discord, and use it instead of only saying a file is 'saved on disk'. Returns a confirmation; only claim it was sent when it confirms.

list_discord_targets

List every Discord channel and person this bot can actually reach right now, grouped by server. Use it BEFORE guessing a target, and whenever send_discord_message says a name is ambiguous or unknown, it shows the exact names to use, including the "server/channel" form that picks one when two servers have a channel of the same name.

send_telegram_message

Send a Telegram message. Use whenever the owner asks you to text/message/tell them or someone on Telegram, or to report back there when something finishes. Target: "me" for the owner, blank to answer in THIS Telegram chat, or a numeric chat id. A Telegram BOT cannot look someone up by @username or start a conversation, the person must message the bot first, so a name is refused rather than retried.

send_telegram_file

DELIVER a real file on Telegram, a zip, pdf, doc, image, anything you built or found. Same targeting as send_telegram_message ("me", blank for this chat, or a numeric chat id). Pass the file as a path, a name, or a phrase like "the zip you just made". Prefer this over describing where a file is saved: the owner is on their phone.

send_channel_message

Say something on Slack, Matrix, Zulip, Signal, IRC or ntfy, the hosted channels, as opposed to Discord (send_discord_message) and email (send_email). Use it whenever the owner asks you to post/tell/notify on one of those. The target is that platform's own id: a Slack channel id, a Matrix room id, a Zulip address like "stream:general:standup" (the topic is part of the address), an IRC channel like "#dev", an ntfy topic. Call list_channels first if you are not certain which channels are live or how to address one, a channel that is not connected is reported as such rather than silently dropped, and a failed send is NEVER reported as a sent one.

list_channels

Show every hosted messaging channel (Slack, Matrix, Zulip, Signal, IRC, ntfy, email) and its true state: no credentials, configured but switched off, on but not connected, or LIVE. Use before send_channel_message rather than guessing, and to answer "can you reach me on X".

draft_social_post

Draft a social-media post for the user's BRAND/BUSINESS account and add it to their approval queue. Use when they ask you to write or schedule a post, run their socials, or plan content. It does NOT publish, everything waits for the user's one-click approval in Settings → Business. Only for real, disclosed brand accounts via official channels, NEVER fake personas, bought engagement, or manipulation.

list_business_drafts

List the social posts currently in the approval queue, pending or approved. Use it to review what you have drafted before the user approves.

business_status

Report which of the user's business accounts are connected (X, Meta, LinkedIn, Stripe, Resend, Shopify) and how many drafts await approval. Use before business tasks so you know what is wired up.

ads

Ad campaigns in Creation > Ads: brand kits, campaigns with image and video variants (hooks, 1:1 4:5 9:16 16:9), CSV imports from Meta, Google Ads or TikTok, analysis computed only from imported data, A/B tests, paused drafts on Meta, Google and TikTok. publish and budget always ask the person on a card naming the spend.

phone_request

Ask the person's paired phone (Mori Link) for something only the phone has: a photo from its library, a photo taken now with its camera, its location, or a file. The phone shows your reason with Allow and Deny, and the person decides there. A picture or file comes back as a file path on this computer (then read_image or read_file); a location comes back as coordinates. Use it when the person asks for it ("take a picture of the receipt", "where am I") or when the task truly needs it, never to look around on your own.