Connect MailCheap over MCP and send a newsletter
· the plori team
Give a Plori agent one message. The agent connects MailCheap's MCP server. MailCheap (mailcheap.ai) is a newsletter service with a REST API. The agent reads a draft issue that already exists and sends a test email. Then it sends the issue to the newsletter's contacts.
This guide records the first issue of the Plori Engineering newsletter. The draft was already in MailCheap. The agent did not write it. Plori waited for the account owner before it enabled the server, before the test email, and before the send.
One run, from API key to sent issue
The model never sees the key. Plori waits for the owner before each write to MailCheap.
- 01
Connect
Key card, probe, approval
Probe ok
- 02
Read
Newsletter and draft
No approval needed
- 03
Test
Owner approves the call
send_test_email
- 04
Send
Owner approves the call
Status sent
What do you need?
- A Plori account and a Workspace. A Workspace holds the files of one project, its conversation, and its run history. The agent works in the Workspace.
- The Plori web app. The secret card and the approval cards appear there. Only the account owner can approve a card.
- A MailCheap newsletter with a draft campaign that is ready to send. Note the exact subject of the draft.
- A MailCheap full access API key. Create it on MailCheap's API keys page.
- The MailCheap MCP endpoint,
https://mailcheap.ai/mcp. It takes the key in this header:Authorization: Bearer <key>.
What prompt should you give Plori?
This is the message that the owner sent. To send your own issue, replace the newsletter name, the newsletter slug, and the subject. Keep these parts:
- the secure secret request
- the order of the steps
- the request to state the subject and the contact count before the send
- the last line
Send the first issue of our newsletter, Plori Engineering, which runs on MailCheap.
1. Connect the MailCheap MCP server at https://mailcheap.ai/mcp. It uses an API key sent as the header "Authorization: Bearer <key>". Ask me for the key with a secure secret request; do not ask me to paste it in chat.
2. With list_newsletters, confirm the newsletter "plori-engineering" exists. With get_campaign, read the draft campaign with the subject "Firecracker hosts: $179 a month on Vultr, $300 on AWS, $474 on Azure". Do not change its content, subject or preview text.
3. Send a test email of that campaign with send_test_email.
4. Then send the campaign to the newsletter's contacts with send_campaign. Before you call it, tell me the subject and how many contacts it goes to.
5. Reply with what you did: the campaign id, its status after sending, the test email result, and the recipient count.
Do not create, edit or delete any other campaign, contact, domain, key or newsletter setting.Why does the prompt name each tool?
The prompt names the MailCheap tool for each step. You can compare each approval card with
the prompt. The test email comes before the send. Before the agent calls send_campaign,
it must state the subject and the contact count. You can check both before you approve.
The last line forbids changes to any other campaign, contact, domain, key, or newsletter
setting.
How does the agent connect MailCheap?
The agent connects the server in three steps. The owner acts in two of them.
- The agent registers the server with its
mcp_registertool. - The agent asks for the key with a secure secret request. A secret card appears in the
Plori web app. The owner pastes the MailCheap key into the card. The model receives only
{set: true}. It never sees the key. - The agent probes the server, and the probe returns
ok. The agent then asks to enable the server. Plori shows an approval card with this question: "Enable this MCP server for this agent? Its tools become callable by the agent, authenticated with the stored credential." The owner approves the card in the web app.
After the approval, the agent can use the tools of the server. MailCheap exposes 44 tools.
When a server has five or more tools, Plori lists them through tool_search.
What did the real run do?
After the connection, the agent used four MailCheap tools in this order:
| Step | MailCheap tool | Approval |
|---|---|---|
| Check that the newsletter exists | list_newsletters |
None. Read-only tool. |
| Read the draft campaign | get_campaign |
None. Read-only tool. |
| Send a test email | send_test_email |
The owner approved the card. |
| Send the campaign to the contacts | send_campaign |
The owner approved the card. |
For send_test_email, Plori paused and showed an approval card that named the tool and
its arguments. The owner approved the card. MailCheap sent the test email to the address of
the MailCheap account owner at 14:45:13 UTC.
The agent then told the owner the subject and that the campaign goes to 1 contact. It
called send_campaign. Plori paused again, and the owner approved the card. MailCheap
reported the status sent at 14:45:56 UTC.
The agent's reply stated these results:
- The newsletter exists.
- The subject of the campaign.
- MailCheap sent the test email and recorded
testSentAt. - The campaign status is
sent. - The campaign had 1 recipient. MailCheap sent and delivered 1 email, and 0 failed.
MailCheap's statistics for the campaign after the send were: recipients 1, sent 1, delivered 1, opened 1, clicked 1, bounced 0, complained 0. The archive page of the issue went live on the newsletter's public site, plori-engineering.mailcheap.ai. The whole flow cost less than $0.10 in Plori credits.
The run proves one path. A Plori agent connected MailCheap with an API key and sent a draft issue that already existed. Plori paused each write until the owner approved it. The limits below list what the run does not prove.
What did the owner approve?
The owner approved three times: to enable the server, to send the test email, and to send
the campaign. The two reads, list_newsletters and get_campaign, ran without approval.
Approval cards are owner-only. The model that calls the tools cannot approve them. Plori pauses a write to an external system until the owner approves it or a standing approval covers it.
How do you check the send before you approve it?
- Read the approval card for
send_test_email. Check the tool name and the arguments. - Approve the card.
send_test_emailsends only to the address of the MailCheap account owner. - Open the test email. Read it.
- Wait for the agent to state the subject and the contact count.
- Do not approve
send_campaignuntil the subject and the contact count are correct. - Read the approval card for
send_campaign. Approve it. - Check the reply. The campaign status must be
sent. The failed count must be 0. - Open the archive page of the newsletter. Look for the issue.
A campaign that is already sending or sent returns a conflict error. This comes from
MailCheap's own description of send_campaign. A retry therefore does not send the
campaign twice.
What are the limits?
- The list had one contact, the owner. The run did not test delivery at scale, bounces, or complaints. The counts of 0 bounced and 0 complained come from one delivery. The counts of 1 opened and 1 clicked also come from that one contact.
- The run used only MailCheap's API-key connection. Plori registers a remote MCP server with a header secret. The run did not use MailCheap's OAuth sign-in for ChatGPT-style connectors.
- The agent did not write the issue. It read a draft that already existed. The run does not show how well an agent drafts an issue.
- The agent sent the issue at once. The run did not use
schedule_campaign. - The MailCheap key has full access. The last line of the prompt and the approval cards are the controls on what the agent changes in MailCheap.
Common questions about sending a newsletter with an AI agent
Can an AI agent send a newsletter issue? Yes, for an issue that already exists as a draft. In this run, a Plori agent connected the MailCheap MCP server, sent a test email, and sent the campaign to the 1 contact on the list. The owner approved the test email and the send. The agent did not write the issue.
Does the agent see the MailCheap API key?
No. The owner pastes the key into a secure secret card in the Plori web app. The model
receives only {set: true}. Plori authenticates the calls to the server with the stored
credential.
Can the agent send the campaign without my approval?
No. Plori pauses before a write to an external system until the account owner approves it,
on the card or through a standing approval the owner set earlier. The model that calls the
tools cannot approve. In this run, the read-only tools
list_newsletters and get_campaign ran without approval. send_test_email and
send_campaign waited for the owner.
Which MailCheap tools did the run use?
list_newsletters, get_campaign, send_test_email, and send_campaign. MailCheap
exposes 44 tools. Plori lists the tools of a server through tool_search when the server
has five or more.
Can the agent schedule an issue instead of sending it at once?
MailCheap has a schedule_campaign tool. This run did not use it, so this guide has no
evidence for scheduling.
What did the run cost? The whole flow cost less than $0.10 in Plori credits. See what a credit buys for how Plori bills.
Related
- Plori Engineering, the public site of the newsletter
- Workspaces, for what a Workspace holds and how approvals work
- What a credit buys, for what does and does not bill
Build it in plori
Open a Plori agent and paste the prompt. Add the MailCheap key only in the secret card, never in chat.
Review the prompt before sending.