# io.github.codespar/mcp-sendgrid (npm · @codespar/mcp-sendgrid)

MCP server for SendGrid — global transactional + marketing email (Twilio-owned)

- Trust score: 69/100 (medium)
- Change this week: +23
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- npm · `@codespar/mcp-sendgrid`: 69/100 (this document), [markdown](https://verifymcp.io/servers/codespar-mcp-sendgrid/codespar-mcp-sendgrid.md), [page](https://verifymcp.io/servers/codespar-mcp-sendgrid/codespar-mcp-sendgrid)

## Channel facts

- Registry: `npm`
- Package: `@codespar/mcp-sendgrid`
- Version: `0.2.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-04.

- **Supply Chain Security**: 86/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 42 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 1836 tokens (~91/item across 20 items; 20 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 30/100
  - Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add codespar-mcp-sendgrid -- npx -y @codespar/mcp-sendgrid
```

### Codex

```bash
codex mcp add codespar-mcp-sendgrid -- npx -y @codespar/mcp-sendgrid
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "codespar-mcp-sendgrid": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@codespar/mcp-sendgrid"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add codespar-mcp-sendgrid --command npx --arg -y --arg @codespar/mcp-sendgrid
```

### Hermes

```yaml
mcp_servers:
  codespar-mcp-sendgrid:
    command: "npx"
    args: ["-y", "@codespar/mcp-sendgrid"]
```

### Other

```json
{
  "mcpServers": {
    "codespar-mcp-sendgrid": {
      "command": "npx",
      "args": [
        "-y",
        "@codespar/mcp-sendgrid"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-04 (score 69, +5)

- [functional improvement] Stability: unverified → 0.30

### 2026-08-02 (score 64, +59)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 5, −16)

- [functional regression] Tool coverage: 100 → unverified

### 2026-07-31 (score 21, +15)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 6, −40)

- [security regression] Malware scan: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (20)

### `send_mail` (~341 tokens)

Send an email via POST /mail/send. Supply at least one `personalization` with `to` recipients, a `from` address (falls back to SENDGRID_FROM_EMAIL), and either `content` blocks or a `template_id` with `dynamic_template_data`. Returns 202 on success.

Input parameters:

- `asm` (object): Unsubscribe group settings: { group_id, groups_to_display? }
- `attachments` (array): Attachments: [{ content (base64), type, filename, disposition?, content_id? }]
- `categories` (array): Up to 10 category tags for analytics
- `content` (array): Content blocks: [{ type: 'text/plain' | 'text/html', value }]. Omit if using template_id.
- `from` (object): Sender. { email, name? }. If omitted, SENDGRID_FROM_EMAIL is used.
- `mail_settings` (object): e.g. { sandbox_mode: { enable: true } }
- `personalizations` (array, required): Array of personalization objects. Each has `to` (array of {email,name}), optional `cc`, `bcc`, `subject`, `dynamic_template_data`, `substitutions`.
- `reply_to` (object): Optional reply-to. { email, name? }
- `send_at` (number): Unix timestamp to schedule send (must be within 72h)
- `subject` (string): Global subject (overridden by personalization.subject)
- `template_id` (string): Dynamic template id (starts with `d-`). Use with dynamic_template_data on each personalization.
- `tracking_settings` (object): Click / open / subscription tracking config

### `send_template` (~157 tokens)

Convenience wrapper for POST /mail/send with a dynamic template. Equivalent to send_mail with `template_id` set. Supply `to`, `template_id`, and `dynamic_template_data`; content is rendered from the template.

Input parameters:

- `dynamic_template_data` (object): Handlebars variables substituted into the template
- `from` (object): Sender { email, name? }. Falls back to SENDGRID_FROM_EMAIL.
- `subject` (string): Optional subject override (usually set inside the template)
- `template_id` (string, required): Dynamic template id (starts with `d-`)
- `to` (string, required): Recipient email (single address). Use send_mail for multiple/complex personalizations.
- `to_name` (string): Optional recipient display name

### `add_contact` (~94 tokens)

Upsert contacts in Marketing Campaigns via PUT /marketing/contacts. Matches on email. Returns a job_id — ingestion is async. Optionally assign to list_ids.

Input parameters:

- `contacts` (array, required): Contacts to upsert. Each: { email (required), first_name?, last_name?, phone_number?, country?, city?, custom_fields? }
- `list_ids` (array): Optional list UUIDs to add these contacts to

### `list_contacts` (~37 tokens)

List Marketing Campaigns contacts via GET /marketing/contacts. Returns up to 50 sample contacts; for full export use a Contacts Export job.

### `delete_contact` (~84 tokens)

Delete contacts by id via DELETE /marketing/contacts?ids=.... Pass a comma-separated list of contact UUIDs, or set delete_all_contacts=true to wipe all contacts (irreversible).

Input parameters:

- `delete_all_contacts` (boolean): If true, deletes ALL contacts. Ignores `ids`.
- `ids` (string): Comma-separated list of contact UUIDs to delete

### `search_contacts` (~64 tokens)

Search contacts with an SGQL query via POST /marketing/contacts/search. Example: `email LIKE '%@codespar.com' AND CONTAINS(list_ids, 'abc-123')`.

Input parameters:

- `query` (string, required): SGQL WHERE clause (SendGrid SQL-like syntax)

### `get_contact` (~46 tokens)

Retrieve a single Marketing Campaigns contact by id via GET /marketing/contacts/{id}. Returns full contact record including custom fields and list_ids.

Input parameters:

- `id` (string, required): Contact UUID

### `list_lists` (~69 tokens)

List all Marketing Campaigns contact lists via GET /marketing/lists. Returns list UUIDs, names, and contact_count. Supports pagination.

Input parameters:

- `page_size` (number): Results per page (default 100, max 1000)
- `page_token` (string): Pagination token from previous response

### `create_list` (~59 tokens)

Create a Marketing Campaigns contact list via POST /marketing/lists. Returns the new list UUID. Use the id with add_contact's list_ids to populate it.

Input parameters:

- `name` (string, required): List name (max 100 chars, must be unique)

### `delete_list` (~78 tokens)

Delete a Marketing Campaigns contact list via DELETE /marketing/lists/{id}. Contacts are NOT deleted by default — set delete_contacts=true to also remove contacts that belong ONLY to this list.

Input parameters:

- `delete_contacts` (boolean): If true, also delete contacts that are exclusive to this list (async job)
- `id` (string, required): List UUID

### `list_templates` (~78 tokens)

List transactional templates via GET /templates. By default returns dynamic templates (recommended); set generations='legacy' for legacy.

Input parameters:

- `generations` (string): Template generation filter (default `dynamic`)
- `page_size` (number): Results per page (1-200, default 10)
- `page_token` (string): Pagination token from previous response

### `create_template` (~60 tokens)

Create a transactional template via POST /templates. Returns a template_id. Add versions separately via /templates/{id}/versions.

Input parameters:

- `generation` (string): Template generation (recommend `dynamic`)
- `name` (string, required): Template name (max 100 chars)

### `list_suppressions` (~50 tokens)

List all suppressed recipients for an unsubscribe group via GET /asm/groups/{group_id}/suppressions. Returns an array of email strings.

Input parameters:

- `group_id` (number, required): Unsubscribe group id

### `add_suppression` (~65 tokens)

Add recipients to a suppression group via POST /asm/groups/{group_id}/suppressions. Future mail in this group will be blocked for these addresses.

Input parameters:

- `group_id` (number, required): Unsubscribe group id
- `recipient_emails` (array, required): Emails to suppress

### `list_unsubscribe_groups` (~68 tokens)

List all unsubscribe groups on the account via GET /asm/groups. Returns [{id, name, description, is_default, unsubscribes}]. Use the id with list_suppressions / add_suppression.

Input parameters:

- `id` (number): Optional: filter by a single group id

### `get_bounces` (~95 tokens)

Retrieve bounced recipients via GET /suppression/bounces. Returns [{email, created, reason, status}]. Filter by time window with start_time/end_time (Unix seconds).

Input parameters:

- `end_time` (number): Unix timestamp (seconds) upper bound
- `limit` (number): Max results to return
- `offset` (number): Offset for pagination
- `start_time` (number): Unix timestamp (seconds) lower bound

### `delete_bounce` (~60 tokens)

Remove a bounced address from the bounce suppression list via DELETE /suppression/bounces/{email}. Call this after the recipient confirms the underlying issue (e.g. mailbox full) is resolved.

Input parameters:

- `email` (string, required): Bounced email address to clear

### `cancel_scheduled_send` (~108 tokens)

Cancel or pause a scheduled send by batch_id via POST /user/scheduled_sends. A send_mail call with `send_at` + `batch_id` can be aborted until the send runs. Set status to 'cancel' or 'pause'.

Input parameters:

- `batch_id` (string, required): The batch_id that was attached to the scheduled /mail/send call
- `status` (string, required): `cancel` aborts; `pause` holds the batch (can be resumed by deleting the status)

### `get_event_webhook_settings` (~61 tokens)

Retrieve the Event Webhook configuration via GET /user/webhooks/event/settings. Returns {url, enabled, delivered, open, click, bounce, dropped, spam_report, unsubscribe, ...} — useful to verify which SendGrid events are being forwarded.

### `get_stats` (~95 tokens)

Global email stats via GET /stats. Returns sent/delivered/opens/clicks/bounces/spam_reports aggregated between start_date and end_date.

Input parameters:

- `aggregated_by` (string): Bucket size (default day)
- `categories` (string): Optional category filter (comma-separated if multiple)
- `end_date` (string): YYYY-MM-DD (default: today)
- `start_date` (string, required): YYYY-MM-DD (required)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/codespar-mcp-sendgrid/codespar-mcp-sendgrid#diagnostics

## Score history

- 2026-08-04: 69
- 2026-08-03: 64
- 2026-08-02: 64
- 2026-08-01: 5
- 2026-07-31: 21
- 2026-07-30: 6
- 2026-07-28: 46
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/@codespar/mcp-sendgrid
- Socket report: https://socket.dev/npm/package/@codespar/mcp-sendgrid
- Repository: https://github.com/codespar/mcp-dev-latam
- Changelog RSS feed: https://verifymcp.io/servers/codespar-mcp-sendgrid/codespar-mcp-sendgrid/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/codespar-mcp-sendgrid/codespar-mcp-sendgrid/changelog.json
- HTML version of this page: https://verifymcp.io/servers/codespar-mcp-sendgrid/codespar-mcp-sendgrid
