SMTP2GO MCP

Live

API KEY

EMAIL DELIVERY

Communication

SMTP2GO handles the sending, the bounces, and the delivery record for your product email. SMTP2GO MCP gives your agent authenticated access scoped to the user who authorized it.

  • Acts as the user: access and write actions stay tied to the SMTP2GO account that authorized the agent.
  • Credentials stay vaulted: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: permissions enforced. 90-day audit trail.
SMTP2GO MCP
agent · Acme Q3
Run
Why did last night's receipts batch bounce?
S
smtp2go_execute_request
103ms
SMTP2GO agent
31 of 402 receipts hard-bounced, all on one customer domain rejecting mail from unlisted senders.
Sources: 402 sends, 31 bounces
smtp2gomcp
2 calls
18:29
Message Claude...

Tools your messaging agent reaches for on SMTP2GO MCP, scoped per user.

CALL ANY TOOL
Email delivery through SMTP2GO's MCP server: discover API endpoints, then execute requests for sends, delivery history, and suppression lists.
smtp2gomcp_execute_request
Execute request
Executes an SMTP2GO API request using a given HAR (HTTP Archive) request object: the method, url, headers, query string, and body describing the call to make. Use 'list-endpoints', 'get-endpoint', and 'search-endpoints' first to discover the correct path, method, and parameters.
Parameters
Name
Type
Required
Description
harRequest
object
Required
HAR request object describing the API call to execute.
smtp2gomcp_get_endpoint
Get endpoint
smtp2gomcp_get_server_variables
Get server variables
smtp2gomcp_list_endpoints
List endpoints
smtp2gomcp_search_endpoints
Search endpoints
Build your Agent
Drop the toolkit in, point it at the user, and your messaging agent can use SMTP2GO from the first run.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// SMTP2GO MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["smtp2gomcp"], toolNames: [
"smtp2gomcp_execute_request",
"smtp2gomcp_get_endpoint",
"smtp2gomcp_get_server_variables"
] },
pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Why did last night's receipts batch bounce?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// SMTP2GO MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["smtp2gomcp"], toolNames: [
"smtp2gomcp_execute_request",
"smtp2gomcp_get_endpoint",
"smtp2gomcp_get_server_variables"
] },
pageSize: 100,
});

const openai = new OpenAI();
const res = await openai.responses.create({
model: "gpt-5",
tools: tools.map((t) => t.openai),
input: "Why did last night's receipts batch bounce?",
});
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// SMTP2GO MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["smtp2gomcp"], toolNames: [
"smtp2gomcp_execute_request",
"smtp2gomcp_get_endpoint",
"smtp2gomcp_get_server_variables"
] },
pageSize: 100,
});

const anthropic = new Anthropic();
const msg = await anthropic.messages.create({
model: "claude-opus-4-6",
max_tokens: 1024,
tools: tools.map((t) => t.anthropic),
messages: [{ role: "user", content: "Why did last night's receipts batch bounce?" }],
});
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// SMTP2GO MCP tools, scoped to the signed-in user
const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["smtp2gomcp"], toolNames: [
"smtp2gomcp_execute_request",
"smtp2gomcp_get_endpoint",
"smtp2gomcp_get_server_variables"
] },
pageSize: 100,
});

const agent = new Agent({
name: "smtp2gomcp_agent",
model: "gemini-2.5-pro",
instruction: "Act as the messaging agent for the signed-in user.",
tools,
});
await agent.run("Why did last night's receipts batch bounce?");
Try these prompts
Paste any prompt into your agent to start using SMTP2GO.
Delivery triage
Copy the prompt
Copied
Why did last night's receipts batch bounce?
Copy the prompt
Copied
List hard bounces from the past week by domain.
Copy the prompt
Copied
Show the current suppression list count.
Sending
Copy the prompt
Copied
Send a test receipt to my address.
Copy the prompt
Copied
Send the maintenance notice to the ops distribution list.
Copy the prompt
Copied
Retry the failed sends from this morning's batch.
Account checks
Copy the prompt
Copied
Which sender domains are verified?
Copy the prompt
Copied
How much of this month's send allowance is used?
Copy the prompt
Copied
List the API endpoints this MCP server exposes.
SEE HOW AUTH WORKS
Users authorize SMTP2GO once. Their credentials stay vaulted, every call is checked, and every action is logged.
1
Authorize
Your user connects
SMTP2GO MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
SMTP2GO MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
SMTP2GO MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
SMTP2GO MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
Same per-user auth pattern across other agents and MCP connectors. Working code, live demos, fork what fits.
Support and Ops Teams
Email-to-calendar agent
Reads scheduling intent out of Gmail threads, resolves the times everyone actually has free, and creates the event on the user's own Google Calendar. No shared service account.
Engineering Teams
DevOps assistant agent
Polls GitHub for failing checks and stale PRs, opens Linear issues for the ones that need work, and posts a daily digest to Slack. It acts as the engineer, not a shared service account.
Engineering Teams
Engineering standup agent
Pulls commits from GitHub and GitLab, tracks issue movement in Jira, and posts a per-engineer standup brief to Slack. Each engineer's activity is read on their own delegated OAuth.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
Test other agents
Same per-user auth pattern across other agents and MCP connectors. Working code, live demos, fork what fits.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.
ENGINEERING
DevOps assistant agent
Poll GitHub for failing checks and stale pull requests, open Linear issues for the ones that need work, and digest to Slack.
ENGINEERING
Engineering standup agent
Pull commits from GitHub and GitLab, track Jira issue movement, and post a per-engineer standup brief to Slack.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared token looks fine in a demo. In production every call looks like a service account. Scalekit resolves the real user credential so attribution, audit, and scope stay accurate.
// shared token
audit → bot_service_account
user_filter → broken

// scalekit
audit → user_abc
scope → enforced ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
SMTP2GO today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access SMTP2GO as the user or as a shared key?
As the user. Each member authorizes once and Scalekit resolves their credential at request time. Audit logs attribute every action to that user, not a shared service account.
Where is the SMTP2GO api key credential stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent is allowed to do in SMTP2GO?
Yes. Pass a tool name filter to listScopedTools so the messaging agent only sees the subset you authorize. Pre-API-call scope checks block out-of-policy actions before the request reaches SMTP2GO.
What happens when a user revokes SMTP2GO access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
The MCP server is a generic request executor. Can I still limit it?
Yes, and you should. SMTP2GO's MCP exposes endpoint discovery plus a request executor, so scope the agent with a tool name filter and keep the executor out of agents that only need delivery reporting. Scalekit blocks out-of-scope calls before they reach SMTP2GO.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""smtp2gomcp"": {
""url"": ""https://mcp.scalekit.com/smtp2gomcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.smtp2gomcp]
url = ""https://mcp.scalekit.com/smtp2gomcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""smtp2gomcp"": {
""url"": ""https://mcp.scalekit.com/smtp2gomcp"",
""type"": ""http""
}
}
}