Announcing CIMD support for MCP Client registration
Learn more

SMTP2GO MCP vs SMTP2GO API for AI Agents (2026)

TL;DR

  • SMTP2GO's official MCP server is not a semantic tool server. It exposes four read-only spec tools (list-endpoints, get-endpoint, search-endpoints, get-server-variables) and one generic executor, execute-request, that takes a HAR request object.
  • Capability coverage is identical on both paths, because execute-request reaches any v3 endpoint the key permits. The difference is granularity: one write tool that does everything, versus 74 typed tools where sending and suppression are separate callable units.
  • Neither path uses OAuth. SMTP2GO authenticates with an API key sent as X-Smtp2go-Api-Key or as a bearer token, so isolation is a key-per-tenant problem, not a token-per-user problem.
  • Scalekit ships both as connectors against one vault, so the choice does not change your auth infrastructure.

Why this choice is not obvious

Your agent sends invoices, password resets, or incident digests, and SMTP2GO is the delivery path. You go looking for an integration and find two first-party options: a remote MCP server documented under the AI section of SMTP2GO's developer docs, and the v3 REST API you have probably already called from a backend service.

They are not two views of the same thing. One hands your agent a live map of the API plus a generic request runner. The other hands it named actions with fixed schemas. That difference decides how much damage a confused model can do at 2am.

What SMTP2GO MCP and the SMTP2GO API actually are

Both are maintained by SMTP2GO and both authenticate with the same credential. What differs is the shape of the surface your agent sees.

SMTP2GO MCP

The official SMTP2GO MCP server is a remote Streamable HTTP endpoint that initializes as SMTP2GO-API-Docs. Clients such as Claude Code, Codex, Cursor, and Gemini CLI connect to it directly, with no local bridge process.

Four of its five tools are read-only and describe the API surface. The fifth, execute-request, performs real calls, including sending mail, from a HAR object carrying method, url, headers, query string, and body. SMTP2GO notes that the discovery tools may be reachable without authentication, while execute-request requires the key in the X-Smtp2go-Api-Key header. A standard Authorization: Bearer header also works, added so Claude Desktop connectors, which cannot send custom headers, can authenticate.

SMTP2GO API

SMTP2GO's v3 REST API is JSON in, JSON out, with a global base URL that routes to the nearest of the US, EU, and AU endpoints. It covers sending (single, batch up to 1,000 messages, and raw MIME), activity search, delivery statistics, templates, suppressions, sender verification, webhooks, SMTP users, API keys, and subaccounts.

Authentication is an API key, passed either as an api_key body field or as the X-Smtp2go-Api-Key header. There is no OAuth flow and no user-level identity. Each key carries its own permitted endpoint list, its own optional rate limit, and a status of allowed, blocked, or sandbox. Parent accounts act on children by passing subaccount_id.

Comparing them where it matters for agents

Four dimensions decide this for a production agent: what it can call, how it authenticates, what you maintain, and which workload each path fits.

What your agent can send and read

Because execute-request is generic, there is no capability gap in the usual sense. The gap is granularity.

Capability
SMTP2GO MCP server
SMTP2GO API as typed tools
Send a transactional email
Generic executor, after discovery of /email/send
smtp2go_send_email with a validated schema
Batch send up to 1,000 messages
Generic executor, after discovery
smtp2go_send_email_batch
Send a pre-assembled MIME message
Generic executor, after discovery
smtp2go_send_mime_email
Schedule and cancel future sends
Generic executor, after discovery
smtp2go_search_scheduled_emails, smtp2go_remove_scheduled_emails
Search delivery activity
Generic executor, after discovery
smtp2go_search_activity, with a per-call region override
Deliverability reporting
Generic executor, after discovery
smtp2go_email_bounces_report, smtp2go_email_summary_report

What your agent can configure and change

The same pattern holds for everything that mutates account state, with one row that behaves differently.

Capability
SMTP2GO MCP server
SMTP2GO API as typed tools
Template lifecycle
Generic executor, after discovery
smtp2go_add_email_template, smtp2go_search_email_templates
Suppression list changes
Generic executor, after discovery
smtp2go_add_suppression, smtp2go_remove_suppression
Sender verification
Generic executor, after discovery
smtp2go_add_sender_domain, smtp2go_add_single_sender_email
Account administration
Generic executor, after discovery
Typed tools for API keys, SMTP users, subaccounts
Restrict the agent to a subset of actions
Not at tool level; only the key's endpoint permissions apply
Yes, per tool name

The row that actually decides it

Read that last row against the first table. On the MCP path, sending an invoice and clearing a suppression entry are the same tool as far as your agent framework is concerned, so a tool allowlist cannot separate them.

Your only lever there is the key itself: SMTP2GO lets you restrict a key to specific endpoint paths, including wildcards such as /email/*, and set it to sandbox so nothing is delivered. That is real, and it is coarse. It lives in SMTP2GO's dashboard, not in your agent definition or your code review.

The auth path each one puts you on

Most tools in this series diverge here, with MCP forcing OAuth and the API allowing keys. SMTP2GO does not diverge. Both paths carry the same 32-character key with an api- prefix, in a header or in the body.

One consequence is pleasant: headless and scheduled agents work on both paths with no browser consent step, which is what a delivery platform needs. One is not: an API key is an account credential, so nothing in either path records which end user triggered a send.

The structural point that survives either choice

In a multi-tenant B2B agent, every customer brings their own SMTP2GO account and their own key. That is N credentials to store, rotate, and revoke.

MCP does not give you a vault. The REST API does not give you a vault. The credential layer is yours to build or to buy, and it is the same layer either way. Our write-up on access control for multi-tenant AI agents covers why this surfaces late rather than early.

What you own in production

The MCP server maintains the endpoint catalog for you. When SMTP2GO adds a parameter, get-endpoint reflects it with no release on your side. You own everything downstream: request construction, retries, pagination, and reading a 200 OK that still reports per-recipient failures.

The typed-tool path inverts that. Schemas are fixed and validated, so a malformed send fails before it reaches the wire, and tool names are stable enough to allowlist. In exchange, a new SMTP2GO capability is callable only once the tool exists.

Rate limits you will meet on both paths

The /activity/search endpoint is capped at 60 requests per minute. Sustained error responses can get your originating IP timed out for at least a minute, returning 429 Too Many Requests.

An agent that polls activity in a loop finds this quickly. Webhooks are the documented alternative for realtime data, and a per-key rate limit lets you cap one agent's send rate without changing the account default.

When to use the MCP server

Reach for it when a human is in the loop and the endpoint list is still a question:

  • A developer is working in Claude Code, Codex, or Cursor and wants to query sending stats, inspect bounces, or test a payload without writing client code.
  • You are prototyping and have not settled on which endpoints the agent needs.
  • The agent does exploratory reporting against a sandbox-mode key that cannot deliver real mail.
  • You want new SMTP2GO endpoints reachable the day they ship.

When to use the API as typed tools

Reach for typed tools when the send is real and the action list needs to be reviewable:

  • The agent sends production mail your customers receive, where a generic write tool is an incident waiting for a bad plan.
  • You need a fixed action list: this agent may call smtp2go_send_email and smtp2go_search_activity, nothing else.
  • The workflow is a deterministic pipeline, such as an offer letter routing agent or a support ticket automation agent sending through one template.
  • You run one agent across many tenants and need every call attributed to a specific connected account.

The credential problem that exists on both paths

The comparison above is about tool shape. The operating cost is about keys, and it is identical whichever path you pick.

One key per tenant is still N keys

SMTP2GO shows an API key exactly once, at creation. Navigate away and it is gone; you delete that key and make another. That single fact sets the contract for any system storing one: capture at creation, encrypt at rest, never log, and keep the value out of anything an LLM can read.

Then multiply by tenants. Fifty customers means fifty keys, fifty rotation schedules, and fifty revocation paths for the day a customer offboards. Once a credential string enters a context window, it can surface through a reasoning trace, a debug log, or a downstream tool's output. The challenge of credential ownership across agent tool-calling patterns becomes acute at this scale.

Where Scalekit fits

Scalekit ships SMTP2GO as two connectors: the SMTP2GO connector with 74 typed tools, and the SMTP2GO MCP connector wrapping the vendor server's five. Both are API Key connectors, so the vault, the tenant isolation, and the revocation path are the same whichever you choose.

Credentials never touch the agent runtime. Your code passes an identifier, and Scalekit resolves the connected account and injects the key server-side at request time.

Building an SMTP2GO agent with Scalekit

Create the connection once per environment in the dashboard under AgentKit, Connections, then paste the SMTP2GO key. The connection name you choose is what your code references from here on.

Install the SDK and set credentials

Both SDKs read the same three values, found in the dashboard under Developers, API Credentials.

# Python pip install scalekit-sdk-python # Node.js npm install @scalekit-sdk/node SCALEKIT_ENVIRONMENT_URL=<your-environment-url> SCALEKIT_CLIENT_ID=<your-client-id> SCALEKIT_CLIENT_SECRET=<your-client-secret>

Retrieve the tools this user is authorized to call

The agent does not load a connector catalog. It loads the tools the current identifier's connected account is authorized to call, which for a billing agent is a handful rather than 74.

import os from scalekit import ScalekitClient from scalekit.v1.tools.tools_pb2 import ScopedToolFilter scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) # connection_names is the Connection name from the dashboard, not a provider slug. scoped = scalekit_client.tools.list_scoped_tools( "acme_workspace", filter=ScopedToolFilter(connection_names=["smtp2go"]), page_size=50, ) for tool in scoped.tools: print(tool.name)

Scope is a function of identity, not connector configuration. Two tenants calling the same agent resolve to two connected accounts, and therefore two SMTP2GO accounts, with no branch in your code.

Wire the scoped tools into a LangChain agent

The LangChain adapter returns that same scoped set as StructuredTool objects, so the model never sees a tool this tenant has no credential for. For a deeper look at how LangChain tool calling works and where it stops, see our dedicated guide.

from langchain.agents import create_agent tools = scalekit_client.actions.langchain.get_tools( identifier="acme_workspace", connection_names=["smtp2go"], tool_names=["smtp2go_send_email", "smtp2go_search_activity"], page_size=50, ) agent = create_agent( model="anthropic:claude-sonnet-4-5", tools=tools, system_prompt=( "You send billing notifications through SMTP2GO. " "Always send from a verified sender address. " "Check delivery activity before resending anything." ), ) result = agent.invoke({ "messages": [{ "role": "user", "content": "Send the invoice reminder template to dana@example.com, then confirm it was accepted.", }] }) print(result["messages"][-1].content)

Execute a send directly in a deterministic pipeline

When the sequence is fixed, skip the reasoning loop. execute_tool runs the named tool against the connected account and returns the result plus an execution ID you can store next to your own audit record.

result = scalekit_client.actions.execute_tool( tool_input={ "sender": "Acme Billing <billing@acme.com>", "to": ["Dana Lee <dana@example.com>"], "template_id": "invoice-v2", "template_data": '{"first_name": "Dana", "invoice_id": "INV-2291"}', }, tool_name="smtp2go_send_email", connection_name="smtp2go", identifier="acme_workspace", ) print(result.execution_id) print(result.data)

Two schema details are worth knowing before the first call. SMTP2GO rejects a send unless at least one of html_body, text_body, or template_id is present, and the sender address must already be verified as a sender domain or a single sender email.

Call the MCP path from TypeScript

The MCP connector follows the vendor server's own two-step shape: search the spec, then execute. Note where the credential is not.

import { ScalekitClient } from '@scalekit-sdk/node' import 'dotenv/config' const scalekit = new ScalekitClient( process.env.SCALEKIT_ENVIRONMENT_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ) const identifier = 'acme_workspace' const endpoints = await scalekit.actions.executeTool({ connector: 'smtp2gomcp', identifier, toolName: 'smtp2gomcp_search_endpoints', toolInput: { pattern: 'email/send' }, }) console.log(endpoints.data) // The SMTP2GO key travels on the MCP session, not inside this HAR body. const sent = await scalekit.actions.executeTool({ connector: 'smtp2gomcp', identifier, toolName: 'smtp2gomcp_execute_request', toolInput: { harRequest: { method: 'POST', url: 'https://api.smtp2go.com/v3/email/send', headers: [{ name: 'Content-Type', value: 'application/json' }], queryString: [], postData: { mimeType: 'application/json', text: JSON.stringify({ sender: 'Acme Billing <billing@acme.com>', to: ['Dana Lee <dana@example.com>'], subject: 'Invoice INV-2291', text_body: 'Your invoice is ready.', }), }, }, }, }) console.log(sent.executionId)

Compare the two blocks. The typed call declares an intent a reviewer can read. The HAR call declares a URL string the model composed.

Scoping a multi-tool email agent with a Virtual MCP server

Most email agents are not email-only. They read a ticket, look up a record, then send. That is where a single generic executor compounds.

One server definition, per-user session tokens

A Virtual MCP server declares exactly which connections and which tools an agent role can see, then serves every tenant from one static endpoint. Identity arrives at runtime as a short-lived session token, minted per run, with a default expiry of about one hour.

from datetime import timedelta from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = scalekit_client.actions.mcp.create_config( name="billing-notifications-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="smtp2go", tools=["smtp2go_send_email", "smtp2go_search_activity"], ), ], ) config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url token = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier="acme_workspace", expiry=timedelta(minutes=30), ).token mcp_server = { "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token}"}, }

Setup happens once per agent role. Runtime is a token mint. The endpoint is static; the identity is not.

Why tool-level scoping matters more here

A Gmail connection might surface 30 tools where a summarizer needs one. SMTP2GO's typed connector surfaces 74, and the destructive ones sit beside the routine ones: removing a suppression re-enables delivery to an address that already bounced, and removing an API key cuts off every integration still using it.

Context cost follows the same curve. At roughly 200 tokens per tool definition, a 40-tool surface burns about 8,000 tokens before the agent does any work, and scoping to five or ten cuts that by around 80 percent. The fix is not better prompting. It is surface reduction. More on the tradeoff is in our note on when to use a Virtual MCP server.

Observability: who sent what, under which credential

A shared key answers none of the questions an auditor asks after a bad send. Every message looks like it came from the account, because it did.

What downstream tool-call logs give you

Scalekit records each tool call against the connected account that authorized it, so a send is attributable to a tenant and an identifier rather than to one shared credential, and execute_tool returns an execution ID you can carry into your own traces.

When a customer asks why their domain sent 4,000 messages on Tuesday, that record is the answer, and smtp2go_search_activity fills in what SMTP2GO saw at delivery time. The reasoning behind this model is in our post on agent tool observability.

Which one to build against

If a developer is exploring SMTP2GO interactively, or you want new endpoints reachable the moment they ship, the official MCP server is the faster path, and its discovery tools are genuinely useful.

If the agent sends mail your customers receive, build against typed tools. A reviewable action list is worth more than a generic executor on the day a model improvises. Either way the key is the same key, and neither path stores, rotates, or revokes it for you; that is infrastructure, and it decides whether the agent survives its second tenant.

Understanding the broader agent tool calling auth patterns, problems, and anti-patterns will help you make the right call for your production system. AgentKit pricing is on the Scalekit pricing page, and the full catalog is at agent connectors.

Talk to us

Building an SMTP2GO agent and weighing these two paths against your own tenancy model? Join the Scalekit Slack community and ask, or book time through the Talk to us page if you need an answer today.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.