turboSMTP ships a documented HTTP API alongside its relay: v2, described by a public OpenAPI 3.1.0 specification, with one sending endpoint and a management surface covering analytics, suppressions, subaccounts and validation. Five official SDKs are announced and four are published. The MCP story needs care: turboSMTP has documented an official @turbosmtp/mcp-server, named its tools and environment variables, and has not shipped it. Everything installable today is a community wrapper or a brokered surface.
Model Context Protocol gives an AI agent typed, permissioned access to a sending platform instead of a raw API key and a curl template. For a transactional relay the useful tools are narrow: send a message, read delivery metrics, check domain authentication. turboSMTP has specified exactly those in public, and has not shipped the server that implements them.
turboSMTP’s developers hub documents a planned @turbosmtp/mcp-server – run with npx, configured through TURBOSMTP_API_KEY and an optional TURBOSMTP_READ_ONLY flag, speaking JSON-RPC 2.0 over stdio, exposing send_transactional_email, fetch_delivery_metrics, validate_contact_list and audit_domain_authentication. The page states the server is in development, installation instructions pending release. Treat any tutorial offering an install command as fabricated until the npm package resolves.
Several listings call themselves “the turboSMTP MCP server” and only one is code you can run. Glama, mcp.so and MCPMarket all index the same community repository. Distinct implementations only:
First-party specification in the developers-hub repository, updated August 31, 2026. Four tools, stdio transport, read-only flag. Not on npm as of this review.
Node server with two tools: send an email, read sending statistics. Clone and build, no npm package. 11 commits, one maintainer, no release tags. A reference implementation, not infrastructure.
Hosted endpoint generated from Pipedream’s turboSMTP connector. No self-hosting, but authentication lives in your Pipedream account and the tools are whatever that connector exposes.
The official Zapier app. Send Email and Find Email Status, live since September 30, 2025, through Zapier’s MCP surface. The most production-ready path, because it rides a turboSMTP-maintained integration. Still 0 triggers: an agent can send, but cannot be woken by a delivery event.
Directory counts mislead here: the first-party entry is a specification, not a package, and most listings index one small Node repository. Asked “can an agent send through this account under a scoped credential today”, the honest answer is yes through Zapier, yes through a self-hosted community server if you read its code first, and not yet through anything first-party, where Brevo and MailerSend give you a supported upgrade path. Second-order risk: one credential pair covers the relay as well as the API, so any MCP server you hand a key to can also open an authenticated SMTP session. Scope with a subaccount, not with hope.
The API is small by design: one endpoint sends mail, everything else reports on it or manages the account around it. The fact that trips people up is that sending and management live on different hosts.
| Sending base URL | https://api.turbo-smtp.com/api/v2 |
| Sending base URL (EU) | https://api.eu.turbo-smtp.com/api/v2 |
| Management base URL | https://pro.api.serversmtp.com/api/v2 |
| Version | v2, OpenAPI 3.1.0 CURRENT |
| Response format | JSON |
| Sending endpoint | POST /mail/send – the only one |
| Pagination | Offset style: page and limit. No cursors, no link headers. |
| Date filtering | from / to in yyyy-mm-dd, plus timezone, filter_by, order_by, ordertype, smart_search |
| Max message size | 24 MB (OpenAPI spec) vs 30 MB (FAQ, relay path) |
| Message handle | mid, returned by /mail/send and used for per-message lookup |
The domain split is real, not a spec typo: the company markets on serversmtp.com, sending hosts live on turbo-smtp.com, management sits on pro.api.serversmtp.com. Configure two base URLs and move on. The EU host is confirmed by turboSMTP’s API reference and the Symfony Mailer bridge, but no public page explains how an account is placed in that region, confirm with support before hardcoding it into a deployment with residency obligations.
Two credential shapes exist and they are not interchangeable. Getting the split wrong produces a 401 on the one call that matters.
The production method. Two custom headers on every request, consumerKey and consumerSecret, generated in the dashboard under API Keys. Permanent until revoked, and the only credential accepted by POST /mail/send. It is also the pair used for SMTP AUTH against pro.turbo-smtp.com – one credential, two protocols, and the secret is shown exactly once, so capture it before closing the dialog.
The management method. POST /authorize exchanges account credentials for a token passed as an Authorization header, valid 2 hours by default or never expiring with no_expire: true; POST /deauthorize revokes it. This token drives analytics, suppressions, subaccounts and tools, and is rejected by the sending endpoint. The authorize endpoint is itself rate-limited, and the spec instructs callers to cache and reuse the token rather than minting one per request.
Because the Consumer pair authenticates both the API and the relay, revoking a key with DELETE /api/v2/user/consumerKeys/{key} silently breaks every mail client still using it, inventory the WordPress installs, CRMs and desktop clients holding it before you rotate. The converse is worse: a key leaked in a client-side bundle lets an attacker open an authenticated SMTP session and send from your verified domain. Mint a distinct key per consumer, and use subaccounts where you would otherwise reach for scopes; the primary key has no scoped-permission model.
This is the thinnest part of turboSMTP’s public documentation. The platform meters by plan volume rather than published throughput ceilings, and several figures competitors state as hard numbers simply do not exist here.
| Limit | Documented value | Notes |
|---|---|---|
| Emails per hour | Not published | The FAQ answers throughput qualitatively, deferring to connection speed and message weight. |
| Recipients per message | Not published | turboSMTP advises against CC/BCC mass mailing but states no cap. |
| Concurrent SMTP connections | Not published | Only the per-subaccount SMTP limit is documented, with no published default. |
| API requests per minute | Not published | Except that POST /authorize is explicitly rate-limited. |
| Max message size | 24 MB API / 30 MB relay | Two official sources disagree, and neither reconciles the other. |
| Plan volume caps | 200/day free · 15,000/mo Basic · up to 2.5M/mo Pro | Enterprise is 2.5M+ or on-demand. Volume, not rate, is the constraint. |
Build your own back-pressure rather than discover theirs. Base64 inflates a payload by roughly 33 percent, so the 24 MB API ceiling is reached by about 18 MB of raw attachments, size uploads against that, not the 30 MB headline. The one documented throughput lever is POST /subaccounts/{Id}/updatesubaccountsmtplimit, which caps a single subaccount, making subaccounts the de facto rate-limiting primitive: one per workload, each capped. If you need a published figure to design a queue against, SMTP2GO and Elastic Email document theirs more explicitly.
turboSMTP publishes SDKs under its own GitHub organisation: C# and PHP in November 2023, Python in 2024, and a Node/TypeScript package in 2026 that is the only one with webhook verification. Maintenance is uneven, and the Go entry is an announcement rather than a package.
| Language | Package | Install | Repo |
|---|---|---|---|
| C# / .NET | TurboSMTP | dotnet add package TurboSMTP | turboSMTP-csharp · Jan 2026 |
| JS / TypeScript | @turbosmtp/mail | npm install @turbosmtp/mail | turboSMTP-js · Aug 2026 |
| PHP | turbosmtp/turbosmtp-client | composer require turbosmtp/turbosmtp-client | turboSMTP-php · May 2025 |
| Python | turbosmtp | pip install turbosmtp | turboSMTP-python · Nov 2024 |
| Go | Announced, not released | Use the raw-HTTP example | Official Go walkthrough |
The Python SDK was last touched in November 2024, roughly 21 months stale, and it serves the language most likely to reach for it; the documented raw-HTTP pattern or plain smtplib against the relay is more predictable, since there is very little to wrap around one POST. The Node package is freshest and the only one parsing webhooks, but carries roughly 15 commits on main: pin an exact version, not a caret range.
The most significant non-first-party client is barely a community project: the Symfony Mailer bridge is maintained inside the Symfony organisation, at symfony/turbo-smtp-mailer. It exposes both transports through DSN – turbosmtp+smtp://KEY:SECRET@default and turbosmtp+api://KEY:SECRET@default – with EU variants and webhook parsing built in, and its release cadence follows Symfony’s rather than turboSMTP’s. It is also the only source outside turboSMTP documenting the EU relay host pro.eu.turbo-smtp.com. Beyond it the ecosystem is thin: no widely adopted Ruby, Java or Rust clients.
Fifteen resource groups cover the documented v2 surface. The canonical source is the OpenAPI document at turbo-smtp.yaml – generate a client from it rather than hand-writing one. Only the first row lives on the sending host.
| Resource | Methods | Description |
|---|---|---|
| Send email /mail/send | POST | The only sending endpoint. Takes from, to (comma-separated), cc, bcc, subject, content, html_content, headers, reference ID. Returns mid. |
| Authorize /authorize | POST | Exchange credentials for a key valid 2 hours, or non-expiring with no_expire. Rate-limited, cache it. |
| Deauthorize /deauthorize | POST | Revoke a previously issued API key. |
| Consumer keys /user/consumerKeys | GET, POST | List keys, or mint a new pair, the same credentials used for SMTP AUTH. |
| Consumer key /user/consumerKeys/{key} | DELETE | Revoke one key. Breaks any SMTP client still using that pair. |
| Analytics /analytics | GET | Delivery and engagement data by date range, timezone, status and smart search, with page/limit paging. |
| Analytics export /analytics/csv | GET | The same filtered result set as CSV. |
| Analytics (single) /analytics/{Id} | GET | Full event record for one message, the equivalent of Zapier’s Find Email Status. |
| Suppressions /suppressions | GET, POST | Read the suppression list (bounces, complaints, unsubscribes) or POST a filter to query it. |
| Suppressions import /suppressions/import | POST | Bulk-import addresses, the migration path from another provider. |
| Suppressions delete /suppressions/bulk_delete | POST | Remove entries individually or in bulk, after a recipient re-opts in. |
| Subaccounts /subaccounts | GET, POST, PATCH | Agency CRUD: subaccounts with their own credentials and reporting. On Basic and up since August 5, 2025. |
| Subaccount SMTP limit /subaccounts/{Id}/updatesubaccountsmtplimit | POST | Per-subaccount sending cap, the only documented throughput control. |
| Email validation /emailvalidation/… | GET, POST, DELETE | Single-address validation, list upload, batch validation, CSV export. Seven statuses including Valid, Invalid and Spamtrap. |
| Alerts /tools/alerts | GET, POST, PATCH, DELETE | Threshold alerts on bounce rate or volume, managed without the dashboard. |
Authentication is two custom headers, not Authorization, and recipients go in a comma-separated string, not an array.
curl -X POST https://api.turbo-smtp.com/api/v2/mail/send \
-H "Content-Type: application/json" \
-H "consumerKey: $TURBOSMTP_KEY" \
-H "consumerSecret: $TURBOSMTP_SECRET" \
-d '{
"from": "hello@your-company.com",
"to": "jane@example.com,john@example.com",
"subject": "New live training session",
"content": "Plain text fallback body.",
"html_content": "<p>HTML body</p>"
}'turboSMTP’s own published Python sample uses http.client.HTTPConnection – plaintext HTTP. Do not ship it verbatim; use HTTPSConnection.
import http.client, json
KEY = "<CONSUMER_KEY>"
SECRET = "<CONSUMER_SECRET>"
payload = {
"from": "hello@your-company.com",
"to": "jane@example.com,john@example.com",
"subject": "New live training session",
"content": "Plain text fallback body.",
"html_content": "<p>HTML body</p>",
}
headers = {"Content-Type": "application/json",
"consumerKey": KEY, "consumerSecret": SECRET}
# api.eu.turbo-smtp.com if your account is provisioned in the EU region
conn = http.client.HTTPSConnection("api.turbo-smtp.com")
conn.request("POST", "/api/v2/mail/send",
body=json.dumps(payload), headers=headers)
r = conn.getresponse()
print(r.status, r.read().decode("utf-8"))
conn.close()
# The relay alternative: smtplib.SMTP_SSL("pro.turbo-smtp.com", 465),
# then smtp.login(KEY, SECRET) - the same pair, never your account password.The @turbosmtp/mail package returns the message id you later pass to GET /analytics/{Id} on the management host, with the bearer token rather than this key pair.
// npm install @turbosmtp/mail
import { TurboSmtp } from "@turbosmtp/mail";
const mailer = new TurboSmtp({
key: process.env.TURBOSMTP_KEY!, // Consumer Key
secret: process.env.TURBOSMTP_SECRET!, // Consumer Secret
});
const { mid } = await mailer.send({
from: "Sender <noreply@example.com>",
to: "you@example.com",
subject: "Hello",
html: "<p>It works!</p>",
});
console.log("message id:", mid);
// Without the SDK: POST the same JSON to /api/v2/mail/send
// with the two headers. That is all it does.The first wall every integrator hits. POST /authorize returns a valid key that works against analytics, suppressions and subaccounts, so authentication looks correct, then /mail/send rejects it, because that endpoint accepts only the consumerKey and consumerSecret headers. Build two credential paths from the start.
Sending goes to api.turbo-smtp.com (or the EU variant); analytics, suppressions, subaccounts, validation and alerts go to pro.api.serversmtp.com. Because the brand and knowledgebase sit on serversmtp.com while the mail hosts sit on turbo-smtp.com, stale tutorials are easy to misread.
Webhooks were introduced in December 2019, the @turbosmtp/webhook package parses and verifies them, and the Symfony bridge handles them, so they are real. But the developers-hub webhooks page did not resolve at the paths checked for this review, leaving event names, payload fields, signature algorithm and retry policy unverified from a first-party source. Derive your handler from the Node package’s types or the Symfony parser, and validate against real traffic.
The FAQ says 30 MB per message; the OpenAPI spec says the total including attachments must be under 24 MB. Nothing reconciles them. Engineer against 24 MB on the API path, which base64 inflation puts at roughly 18 MB of raw attachments. The same drift affects the SPF include, where the marketing DNS guide and the knowledgebase disagree, re-read DNS values from your own dashboard.
Release notes are published on turboSMTP’s news feed at serversmtp.com/news. Nothing versioned is embedded in the API reference, so diffing the OpenAPI YAML is the only reliable way to catch a silent schema change.
Yes. The current version is v2, described by a public OpenAPI 3.1.0 document at serversmtp.com/turbo-api/turbo-smtp.yaml. Sending is a single JSON POST to https://api.turbo-smtp.com/api/v2/mail/send; analytics, suppressions, subaccounts, validation and alerts live on https://pro.api.serversmtp.com/api/v2. v1 was discontinued on April 1, 2022.
Generate the pair in the dashboard under API Keys, or with POST /api/v2/user/consumerKeys. The Consumer Secret is shown exactly once and cannot be retrieved later. The same pair authenticates the HTTP API and the SMTP relay on pro.turbo-smtp.com, so revoking a key also breaks any mail client using it.
POST https://api.turbo-smtp.com/api/v2/mail/send, or the api.eu.turbo-smtp.com host for EU accounts. It accepts from, to (comma-separated, not an array), cc, bcc, subject, content, html_content, custom headers and a reference ID, and returns a message id (mid) for lookup via /analytics/{Id}. It requires the Consumer Key/Secret headers and rejects the bearer token from /authorize.
Yes, they have existed since December 2019, and the official @turbosmtp/webhook package verifies and parses them, as does the Symfony Mailer bridge. But the first-party webhooks documentation page did not resolve at the paths checked for this review, so event names, payload schema, signature algorithm and retry policy are unverified here. Derive your handler from the Node package’s types or the Symfony bridge, and validate against live traffic first.
Both exist. Node/TypeScript is @turbosmtp/mail, the freshest official client (August 2026) and the only one with webhook support, roughly 15 commits on main, so pin an exact version. Python is pip install turbosmtp, last updated November 2024 and about 21 months stale; raw HTTP or plain smtplib against the relay is usually safer there. C# and PHP are also published, and the Go SDK is announced but not released.
Not one you can install. turboSMTP documents a planned @turbosmtp/mcp-server – four tools, stdio transport, a TURBOSMTP_READ_ONLY flag, but the page states it is in development, with installation instructions pending release. What works today: a community Node server at github.com/debba/turbosmtp-mcp-server (clone and build, no npm package), a hosted Pipedream endpoint, and the official Zapier app through Zapier’s MCP surface. Zapier is the most production-ready, because it rides a turboSMTP-maintained integration rather than a third-party wrapper.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.