A Gmail outbox for your agent.
Your agent queues the emails over MCP. You press Start. Gmail sends them under a daily cap until the list is done.
- v0.2.0
- Runs on your computer
- Send-only Gmail access
- AGPL-3.0
From prompt to sent mail
Your agent queues it
One MCP call to TinyMails on your computer. The campaign arrives paused.
The test lands in your inbox
The real email, sent to you alone.
You press Start
Read the test first. The campaign waits, paused.
The queue paces itself
25 a day, inside your hours, 30 to 45 seconds apart. At the cap it waits, then carries on by itself.
Stored on your computer
TinyMails keeps contacts, history and tokens local. Gmail gets the emails you send. Your agent sees what you give it.
- No inbox access
- No tracking pixels
- No automatic follow-ups
- No TinyMails account
Start with one prompt
Queue an email campaign for me with TinyMails. Do not start it. TinyMails is a local Gmail outbox for agents: https://github.com/Gauthi3r/tinymails 1. Check that it is running: curl -s http://127.0.0.1:3210/api/health If it is not installed, clone the repository, run "npm install" and then "npm start". It needs Node.js 22 or newer. 2. Use its MCP tools if you have them: list_accounts, queue_campaign, send_test. If you cannot use MCP in this session, use the local API shown below each step. The MCP address, to add for next time: http://127.0.0.1:3210/mcp 3. List the Gmail accounts: list_accounts, or GET http://127.0.0.1:3210/api/accounts If none is listed, stop and ask me to connect one in TinyMails Settings. If several are listed, ask me which one to send from. 4. Ask me for the contact list and the message if I have not given them to you. The message is plain text and can use {firstName} and {company}. A contact with no first name gets "there", and one with no company gets "your company". 5. Queue the campaign with queue_campaign. Without MCP, send one request, without an Origin header: POST http://127.0.0.1:3210/api/campaigns Content-Type: application/json {"name": "...", "subject": "...", "body": "...", "accountIds": ["<id from step 3>"], "dailyCap": <the account's dailyCap>, "delayMinSeconds": <the account's>, "delayMaxSeconds": <the account's>, "recipients": [{"email": "...", "firstName": "...", "company": "..."}]} Send every contact as it is. TinyMails removes invalid, duplicate and do-not-contact addresses itself. The campaign arrives paused, and "excluded" lists each refused address with its reason. If a request fails, show me the error and stop. 6. Send me the test: send_test, or POST http://127.0.0.1:3210/api/campaigns/<campaign id>/test-send It sends the real email to my own Gmail address only, and it unlocks Start. 7. Tell me how many recipients were queued, list every excluded address with its reason, and tell me the test is in my inbox. Then stop. I will read the test and press Start myself in TinyMails. Never call start_campaign or /start.
git clone https://github.com/Gauthi3r/tinymails.git cd tinymails npm install npm start
Needs Node.js 22 and a Google OAuth client you create once. Read the setup steps
Questions
- Which agents can use it?
- An agent on your computer that speaks MCP or can run commands. Agents that run in the cloud cannot reach it.
- Is there an MCP server?
- Yes. While TinyMails runs, it serves one at 127.0.0.1:3210/mcp. Read the agent guide
- Can my agent send without me?
- Over MCP it can queue, test and pause, but not start, unless you allow it in Settings. An agent that runs commands can still reach the local API, so use one you trust.
- Does the queue go on by itself?
- Yes. At the daily cap or outside your hours it waits, then carries on. After you pause it, restart TinyMails or Gmail reports a problem, you press Start again.