Agents are first-class citizens.
Software that has to prove its own work needs more than a one-word verdict. All three OutSend surfaces — the REST API, the command line, and the MCP server — return the evidence behind an outcome rather than a verdict an agent has to take on faith.
$ outsend trace 10482
message 10482 person@example.com
09:14:02.114 queued accepted · idempotency-key password-reset-8f21c4
09:14:02.380 sent handed to AWS SES · us-east-1
09:14:03.921 delivery_delay 450 4.7.1 Not accepted, try again later
09:16:41.552 delivery 250 2.0.0 OK — accepted after retry
reputation isolated sender · unaffected by the deferralHumans and machines, equally served.
Not an API with a wrapper bolted on. Three interfaces over the same primitives, each shaped for how its caller actually works.
- APIShipped
World-class primitives
Stable, composable endpoints for sending, events, domains, and reputation controls — with idempotency keys, readable errors, and the provider's response on every event.
Read the docs - CLIShipped
Operational leverage
Scriptable setup, inspection, replay, migration, and diagnostics. Everything you can do by clicking, available to a shell script, a runbook, or a CI job.
Read the docs - MCPShipped
Native agent access
An MCP server agents connect to directly: send, inspect traces, explain failures, and propose remediation with structured, explainable outcomes.
Read the docs
It stops at the recommendation.
An agent can search the event log, correlate failures by provider, read the actual SMTP responses, and work out that seventeen password resets are sitting behind a temporary reputation deferral at one provider.
- Then it writes a plan and stops. Applying that plan is a separate, gated call that a person approves — and the approval is recorded against the plan id.
- Notice the last line of the transcript: the aggregate-only verdict is rejected. A single health number is exactly the thing an agent cannot reason about, so we do not return one.
$ outsend explain --since 09:00 --status failed
matched: 17 messages
provider concentration: Outlook
signal: temporary reputation deferral
evidence: event trace + provider response
uncertainty: 2 of 17 lack a provider response
recommended action: slow route, verify DKIM alignment
approval required: apply routing changeThe full surface.
Reading and diagnosing are safe and unbounded. Changing things is bounded, gated, and logged. That split is the whole design.
{
"mcpServers": {
"outsend": {
"command": "npx",
"args": ["-y", "@outsend/mcp"],
"env": { "OUTSEND_API_KEY": "..." }
}
}
}- send_email
- Sends a message. Requires an idempotency key for anything retryable.
- schedule_email
- Same, with a scheduled_at.
- cancel_scheduled
- Cancels a queued message before it goes.
- get_trace
- Full lifecycle of one message, every event with the provider's raw response.
- search_events
- Filter by type, recipient, domain, and time range.
- get_message
- The message itself: headers, bodies, stream, source.
- webhook_deliveries
- Attempts, response codes, and bodies for an endpoint.
- explain_failures
- Provider concentration, likely signal, supporting evidence, explicit uncertainty.
- check_reputation
- Reputation per domain and workspace, with the events that moved it.
- check_domain
- DNS record state, propagation, and SPF duplication.
- propose_remediation
- Returns a plan with an id. Changes nothing.
- apply_remediation
- Executes a plan. Requires human approval, recorded against the plan id.
Four rules the tooling has to obey.
- 01
Evidence, never a verdict
No tool returns a bare “delivered”. Every answer carries the receiving provider's own response, the events it was derived from, and what the tool could not determine. An agent that cannot show its working cannot be trusted with your mail.
- 02
Uncertainty is a field
If two of seventeen failures have no stored provider response, that appears in the response rather than being rounded away to make the answer look cleaner. Confident wrong answers are the failure mode worth engineering against.
- 03
Reading is unbounded, changing is gated
Inspection and diagnosis run freely. Routing changes, DNS edits, and account changes go through propose_remediation, which produces a plan a human reads and approves — with the approval logged against the plan id.
- 04
The same surface, self-hosted
The CLI and MCP server are part of the open core. Point them at your own instance with OUTSEND_BASE_URL and they behave identically. Agent tooling that only works against our cloud would be lock-in wearing a helpful hat.
Documentation
The rest of the platform
Sending
REST API, SMTP relay, scheduling, two streams.
Learn moreObservability
Every event, every payload, queryable.
Learn moreCampaigns
Segments, templates, warm-up ramps.
Learn moreContacts
Import, segment, and clean your list.
Learn moreDomains
DKIM, SPF, DMARC, and reputation isolation.
Learn moreStart sending
Verify a domain, send your first message, and read the trace it leaves behind — in about ten minutes.
Start sending
Point an agent at it.
Install the MCP server, ask it what happened to a message, and see how much of the answer is evidence.
Open core · never venture-backed · operated by Martin Business Consultants