confirm_actionLABSCO SUMMARY
Two switches decide how much autonomy this has.
The default is deliberately cautious — every send and publish returns a token and waits for confirm_action, which is the right posture for a tool that can email real people. Turning the guards off is a supported choice for scheduled runs, but it removes the last checkpoint, so make it consciously. The consent queue is the other thing that sets this apart from a transactional API: an agent cannot mail someone who has not agreed to hear from you, which is a policy enforced in the tool rather than in the prompt.
What it is
A local email server for agents. Templates, recipient groups, sender identities and message content stay on your machine. When an agent adds a recipient, that person gets a consent request and the email queues locally until they grant it — transactional messages such as one-time codes go out without waiting.
What you get
- Plain text, HTML or Markdown to one recipient or many
- Consent handled automatically: new recipients get the request, the message queues, and it sends the moment consent arrives
- Built-in templates for consentless transactional mail, such as one-time codes and order completion
- Custom templates with dynamic variables, an interactive preview while you iterate, and a test send to check the rendering before it goes anywhere
- Recipient groups and named sender identities, both referenced by name rather than by address
- Email health metrics
- A blog you can run from the same place: settings, custom domain, drafts, publish, preview and a broadcast to a group
- A confirmation gate on mutating tools — create, publish and send return a token first and only run after
confirm_action
Requirements
A GoodSender API key in GOODSENDER_API_KEY. Three ways to install: an MCPB bundle you open in a supporting client, a Docker image that serves Streamable HTTP on port 9889, or a downloaded binary for your platform referenced directly in the client config. GOODSENDER_DISABLE_ACTION_GUARDS=true removes the confirmation step for unattended runs, and GOODSENDER_TELEMETRY=false opts out of the usage metrics that are on by default.
Setup effort
Follow the published steps — Grab the goodsender.mcpb file from the latest release.
USE CASES
Sending a newsletter an agent assembled
Draft against a saved template, preview it, test-send to yourself, then release it to a group.
Building a recipient list without breaking the rules
Add people to a named group and let the consent request go out before any content does.
Sending a code or receipt immediately
Use a built-in transactional template that goes out without waiting on consent.
Running the whole thing unattended
Disable the action guards so scheduled work does not stall on a confirmation prompt.
Publishing and mailing a post in one go
Create the draft, check the signed preview, publish, and broadcast it to the group.
1 tool
Listed in project docs. Your client may show a different list.
BEFORE YOU INSTALL
What to know first
Tools you get
1 tool named in the project's documentation. The documentation names only confirm_action; the server also sends email and manages templates, recipient groups, sender identities and a blog. Mutating tools wait for confirm_action unless GOODSENDER_DISABLE_ACTION_GUARDS=true.
Requires
GOODSENDER_API_KEY in your environment
Where it runs
Both documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
Grab the goodsender.mcpb file from the latest release.
Double-click the goodsender.mcpb file to open it in your AI client.
MCP Clients
Claude Desktop, Cursor
{
"mcpServers": {
"GoodSender": {
"command": "<YOUR_PATH_TO_UNZIPPED_BINARIES>/goodsender-mcp-darwin-arm64",
"env": {
"GOODSENDER_API_KEY": "<YOUR_GOODSENDER_API_KEY>"
}
}
}
}Download binaries.zip from the latest release (github.com/good-sender/mcp/releases/latest), unzip it. <YOUR_PATH_TO_UNZIPPED_BINARIES> is that folder, and <YOUR_GOODSENDER_API_KEY> is the key from the GoodSender Console. This example is for Apple-silicon macOS; on other platforms reference the matching goodsender-mcp-* binary instead.