Send email and read templates, marketing contacts, lists, stats, bounces and unsubscribes.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
UPSERTS marketing contacts (creates new ones, updates existing ones by email) and optionally adds them to lists. This is an ASYNC job — returns { job_id } you can poll. SendGrid: PUT /v3/marketing/contacts.
Contacts to add or update (each needs an `email`; custom fields pass through).
List ids to add these contacts to.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
UPSERTS marketing contacts (creates new ones, updates existing ones by email) and optionally adds them to lists. This is an ASYNC job — returns { job_id } you can poll. SendGrid: PUT /v3/marketing/contacts.
| Argument | Type | Description |
|---|---|---|
| contacts* | array | Contacts to add or update (each needs an `email`; custom fields pass through). |
| list_ids | array | List ids to add these contacts to. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"contacts"
],
"properties": {
"contacts": {
"type": "array",
"items": {
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Contact email address (required — the primary identifier for the contact)."
},
"last_name": {
"type": "string",
"description": "Contact last name."
},
"first_name": {
"type": "string",
"description": "Contact first name."
}
},
"description": "A marketing contact. `email` is required; first_name/last_name are optional. Any additional keys are passed through as custom-field values (use the custom field's id or reserved name as the key).",
"additionalProperties": {}
},
"minItems": 1,
"description": "Contacts to add or update (each needs an `email`; custom fields pass through)."
},
"list_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "List ids to add these contacts to."
}
}
}Get the total number of Marketing Campaigns contacts on your account. Returns { contact_count, billable_count }. SendGrid: GET /v3/marketing/contacts/count.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Get global email statistics over a date range (delivered, opens, clicks, bounces, spam reports, etc.). Returns an array of { date, stats: [{ metrics: {...} }] }. SendGrid: GET /v3/stats.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Number of results to return. |
| offset | integer | Number of results to skip (for pagination). |
| end_date | string | End date in YYYY-MM-DD format (defaults to today). |
| start_date* | string | Start date in YYYY-MM-DD format (required). |
| aggregated_by | string | How to group the returned statistics. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"start_date"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of results to return."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of results to skip (for pagination)."
},
"end_date": {
"type": "string",
"description": "End date in YYYY-MM-DD format (defaults to today)."
},
"start_date": {
"type": "string",
"description": "Start date in YYYY-MM-DD format (required)."
},
"aggregated_by": {
"enum": [
"day",
"week",
"month"
],
"type": "string",
"description": "How to group the returned statistics."
}
}
}Get a single transactional email template by id, including its versions (subject + content). SendGrid: GET /v3/templates/{template_id}.
| Argument | Type | Description |
|---|---|---|
| template_id* | string | The template id (dynamic template ids start with "d-"). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"template_id"
],
"properties": {
"template_id": {
"type": "string",
"description": "The template id (dynamic template ids start with \"d-\")."
}
}
}List bounced email addresses (the bounce suppression list). Returns an array of { created, email, reason, status }. SendGrid: GET /v3/suppression/bounces.
| Argument | Type | Description |
|---|---|---|
| string | Filter to a specific bounced email address. | |
| limit | integer | Number of bounces to return (1–500). |
| offset | integer | Number of bounces to skip (for pagination). |
| end_time | integer | End of the time range, as a Unix timestamp (seconds). |
| start_time | integer | Start of the time range, as a Unix timestamp (seconds). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"email": {
"type": "string",
"description": "Filter to a specific bounced email address."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Number of bounces to return (1–500)."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of bounces to skip (for pagination)."
},
"end_time": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "End of the time range, as a Unix timestamp (seconds)."
},
"start_time": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Start of the time range, as a Unix timestamp (seconds)."
}
}
}List globally-unsubscribed email addresses (the global suppression list). Returns an array of { created, email }. SendGrid: GET /v3/suppression/unsubscribes.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Number of records to return. |
| offset | integer | Number of records to skip (for pagination). |
| end_time | integer | End of the time range, as a Unix timestamp (seconds). |
| start_time | integer | Start of the time range, as a Unix timestamp (seconds). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of records to return."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of records to skip (for pagination)."
},
"end_time": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "End of the time range, as a Unix timestamp (seconds)."
},
"start_time": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Start of the time range, as a Unix timestamp (seconds)."
}
}
}List your Marketing Campaigns contact lists, each with its id, name, and contact_count. Returns { result: [...], _metadata }. SendGrid: GET /v3/marketing/lists.
| Argument | Type | Description |
|---|---|---|
| page_size | integer | Number of lists per page (1–1000, default 100). |
| page_token | string | Pagination token from a previous response's _metadata. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"type": "integer",
"default": 100,
"maximum": 1000,
"minimum": 1,
"description": "Number of lists per page (1–1000, default 100)."
},
"page_token": {
"type": "string",
"description": "Pagination token from a previous response's _metadata."
}
}
}List your transactional email templates (Dynamic and/or Legacy). Returns { result: [...], _metadata } — use _metadata.next / page_token to paginate. SendGrid: GET /v3/templates.
| Argument | Type | Description |
|---|---|---|
| page_size | integer | Number of templates per page (1–200, default 50). |
| page_token | string | Pagination token from a previous response's _metadata. |
| generations | string | Which template generation(s) to return (default: dynamic). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page_size": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "Number of templates per page (1–200, default 50)."
},
"page_token": {
"type": "string",
"description": "Pagination token from a previous response's _metadata."
},
"generations": {
"enum": [
"legacy",
"dynamic",
"legacy,dynamic"
],
"type": "string",
"default": "dynamic",
"description": "Which template generation(s) to return (default: dynamic)."
}
}
}Health check — verifies the API key works and returns the scopes (permissions) granted to it. SendGrid: GET /v3/scopes.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Look up marketing contacts by exact email address (a read-only lookup — mutates nothing). Returns { result: { "<email>": { contact: {...} } } }. SendGrid: POST /v3/marketing/contacts/search/emails.
| Argument | Type | Description |
|---|---|---|
| emails* | array | One or more exact email addresses to look up. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"emails"
],
"properties": {
"emails": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "One or more exact email addresses to look up."
}
}
}SENDS A REAL EMAIL immediately via SendGrid. Provide `from_email` and one or more `to` recipients, plus EITHER a subject + content OR a `template_id` (dynamic template ids start with "d-", pass values via dynamic_template_data). Returns { status: "accepted", message_id }. SendGrid: POST /v3/mail/send.
| Argument | Type | Description |
|---|---|---|
| cc | array | CC recipient email addresses. |
| to* | array | One or more recipient email addresses. |
| bcc | array | BCC recipient email addresses. |
| content | string | The email body. Required unless template_id is provided. |
| subject | string | Email subject line. Required unless a template_id supplies it. |
| reply_to | string | Reply-To email address. |
| from_name | string | Sender display name. |
| from_email* | string | Sender email address (must be a verified sender/domain). |
| template_id |
| string |
| A template id to render (dynamic template ids start with "d-"). When set, `content` is omitted. |
| content_type | string | MIME type of the body content (default text/html). |
| dynamic_template_data | object | Key/value data merged into a dynamic template's handlebars variables. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"from_email",
"to"
],
"properties": {
"cc": {
"type": "array",
"items": {
"type": "string"
},
"description": "CC recipient email addresses."
},
"to": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "One or more recipient email addresses."
},
"bcc": {
"type": "array",
"items": {
"type": "string"
},
"description": "BCC recipient email addresses."
},
"content": {
"type": "string",
"description": "The email body. Required unless template_id is provided."
},
"subject": {
"type": "string",
"description": "Email subject line. Required unless a template_id supplies it."
},
"reply_to": {
"type": "string",
"description": "Reply-To email address."
},
"from_name": {
"type": "string",
"description": "Sender display name."
},
"from_email": {
"type": "string",
"description": "Sender email address (must be a verified sender/domain)."
},
"template_id": {
"type": "string",
"description": "A template id to render (dynamic template ids start with \"d-\"). When set, `content` is omitted."
},
"content_type": {
"enum": [
"text/plain",
"text/html"
],
"type": "string",
"default": "text/html",
"description": "MIME type of the body content (default text/html)."
},
"dynamic_template_data": {
"type": "object",
"description": "Key/value data merged into a dynamic template's handlebars variables.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
}
}