SendGrid

Live

BEARER TOKEN

EMAIL

Communication

SendGrid gives your agent authenticated access to email sending, templates, and deliverability data, with every send attributed to a real user.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
SendGrid
agent · Acme Q3
Run
How did the launch email perform?
S
sendgrid_get_stats
94ms
Email agent
42,100 delivered, 38.2% open, 6.1% click. 214 bounces concentrated on one legacy domain.
Sources: 1 campaign, Aug 12
sendgrid
42,100 delivered
18:29
Message Claude...

Tools your agent reaches for on SendGrid, scoped per user.

CALL ANY TOOL
Send email, manage templates and contact lists, and read deliverability stats with the signed-in user's own SendGrid access.
sendgrid_activate_template_version
Activate template version
Activate a specific version of a transactional template in SendGrid, identified by the parent template_id and the version_id. Activating a version deactivates any other currently active version for the same template, since only one version can be active at a time. Safe to re-run: activating an already-active version produces the same end state. Obtain the template_id and version_id from the 'List Templates', 'Get Template', or 'Create Template Version' tool. Returns the activated version object, including any warnings about the template. You can submit this request as one of your subusers by including their ID in the on_behalf_of field.
Parameters
Name
Type
Required
Description
template_id
string
Required
The ID (UUID) of the original transactional template that owns this version. Obtain this from the 'List Templates' tool's response.
version_id
string
Required
The ID (UUID) of the template version to activate. Obtain this from the 'List Templates', 'Get Template', or 'Create Template Version' tool's response.
on_behalf_of
string
Optional
Optional 'on-behalf-of' header value to make this call from a parent account on behalf of one of its Subusers or customer accounts. Use 'account-id ' for a customer account, or the Subuser's username for a Subuser. Uses the parent account's API key.
sendgrid_add_account_ips
Add account ips
sendgrid_add_ip_to_allow_list
List add ip to allow
sendgrid_create_account
Create account
sendgrid_create_mail_batch
Batch create mail
sendgrid_delete_account
Delete account
sendgrid_delete_contactdb_lists
Delete contactdb lists
sendgrid_delete_ip_pool_ip_address_management
Delete ip pool ip address management
sendgrid_delete_scheduled_send
Send delete scheduled
sendgrid_delete_spam_reports
Delete spam reports
sendgrid_duplicate_pre_built_design
Duplicate pre built design
sendgrid_get_account_state
Get account state
sendgrid_get_contactdb_custom_field
Get contactdb custom field
sendgrid_get_ip_pool_ip_address_management
Get ip pool ip address management
sendgrid_get_signed_event_webhook
Get signed event webhook
sendgrid_list_all_security_policies
List all security policies
sendgrid_list_click_tracking_stat
List click tracking stat
sendgrid_list_default_branded_link
List default branded link
sendgrid_list_ip_ips
List ip ips
sendgrid_list_reverse_dns
List reverse dns
sendgrid_list_subuser_branded_link
List subuser branded link
sendgrid_remove_account_ips
Remove account ips
sendgrid_resend_verified_sender
Resend verified sender
sendgrid_search_contact
Search contact
sendgrid_set_up_reverse_dns
Set up reverse dns
sendgrid_stop_ip_warm_up
Stop ip warm up
sendgrid_update_account_offering
Update account offering
sendgrid_update_contact
Update contact
sendgrid_update_ip
Update ip
sendgrid_update_sso_integration
Update sso integration

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
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);

// SendGrid tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["sendgrid"], toolNames: [
    "sendgrid_activate_template_version",
    "sendgrid_add_account_ips",
    "sendgrid_add_ip_to_allow_list"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Is the Salesforce sync healthy?" }] });
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);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["sendgrid"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Which data sources are connected?" }],
  tools,
});

// Execute the tool call with the user's vaulted SendGrid credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
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);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["sendgrid"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Pull open Zendesk tickets created this week." }],
  tools,
});

// Tool call runs with the user's vaulted SendGrid credential
await sk.tools.executeTool(msg.content, "user_123");
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);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["sendgrid"] }, pageSize: 100,
});

const agent = new Agent({
  name: "sendgrid_agent",
  model: "gemini-2.5-pro",
  instruction: "Work with SendGrid for the signed-in user.",
  tools,
});

await agent.run("What auth does the Shopify connector need?");
Try these prompts
Paste any prompt into your agent to get started.
Deliverability
Copy the prompt
Copied
How did last week's sends perform?
Copy the prompt
Copied
Show me the bounces grouped by domain.
Copy the prompt
Copied
Which IPs are in our warmup pool?
Campaigns
Copy the prompt
Copied
Send this announcement to the beta list.
Copy the prompt
Copied
List the dynamic templates available to me.
Copy the prompt
Copied
Activate the new version of this template.
List hygiene
Copy the prompt
Copied
List the addresses on the global suppression list.
Copy the prompt
Copied
Remove this contact from all lists.
Copy the prompt
Copied
Show me the contact lists and their sizes.
SEE HOW AUTH WORKS
Your users connect SendGrid once. Their credentials stay vaulted, every call is scope checked, and every send is logged.
1
Authorize
Your user connects
SendGrid
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
SendGrid
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
SendGrid
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
SendGrid
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
See the same per-user auth pattern across other connectors.
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.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's 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
See the same per-user auth pattern across other connectors.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
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 SendGrid token looks fine in a demo. In production every action looks like one service account, and you cannot tell who wired a source or ran a query. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
SendGrid today. Ten connectors 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
Can I stop the agent from sending while it still reads stats?
Yes. Scope the connection to the stats and list tools. Send stays unavailable, enforced before the API call rather than in a prompt.
How many SendGrid tools are available?
391, the largest connector in the catalogue, covering mail send, templates, contacts, IP management, subusers, and stats. The page shows a representative 30; the docs list all of them.
Who appears in the audit trail?
The user who triggered the agent. Scalekit resolves their credential rather than a shared API key.
Does this cover subuser accounts?
Yes, subject to the scope you grant on the connection.
How is the bearer token stored?
Encrypted per tenant with AES-256, resolved at request time, never placed in LLM context.
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"": {
""sendgrid"": {
""url"": ""https://mcp.scalekit.com/sendgrid"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.sendgrid]
url = ""https://mcp.scalekit.com/sendgrid""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""sendgrid"": {
""url"": ""https://mcp.scalekit.com/sendgrid"",
""type"": ""http""
}
}
}