SendGrid MCP Server
SendGrid MCP Server provides comprehensive access to SendGrid API v3 through 58 tools for email marketing, transactional email, template management, contacts, and analytics.
Marketing Automations: list, view, update, delete, create workflows; open creator/editor in browser.
Single Send Campaigns: list and view campaigns; open creator/stats pages.
Contacts: create, update, delete, list, search, paginate; manage custom fields and list assignments.
Email Lists: create, update, delete, list; add/remove contacts; open CSV uploader.
Segments & Custom Fields: list, update, delete segments; open segment creator; manage custom contact fields (Text, Number, Date).
Senders: list, create, delete verified senders.
Dynamic Templates: list, get, create, update, delete templates and versions; create full HTML template in one step; open visual editor; supports Handlebars, plain-text generation, test data previews.
Mail Sending: send transactional emails with full personalization; send using dynamic templates with substitution.
Statistics & Analytics: global stats and overviews; breakdowns by browser, client, device, country, mailbox provider, category, subuser; up to 13 months history aggregated day/week/month.
Utilities: get API permission scopes.
Safety & Integration: read-only safety mode blocks mutations by default (can be disabled); supports stdio and Streamable HTTP transports with token or OAuth 2.1 auth; browser integrations for automations, templates, campaigns, segments, and CSV uploads.
Provides comprehensive access to SendGrid's API v3 for email
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SendGrid MCP Servershow me the open rate for our last newsletter campaign"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SendGrid MCP Server
A Model Context Protocol (MCP) server that provides comprehensive access to SendGrid's API v3 for email marketing, transactional email operations, dynamic template management, and detailed analytics. Features 154 tools covering all aspects of email management and performance analysis.
Built and maintained by a SendGrid engineer, as an independent project — not an official SendGrid product.
See RELEASES.md for what's changed in the latest release.
Features
Marketing Automations: Create and manage email automation workflows
Single Send Campaigns: Manage one-time email campaigns with detailed performance tracking
Contact Management: Complete CRUD operations for contacts with advanced search and bulk operations
Email Statistics & Analytics: Multi-dimensional performance analysis across browsers, devices, geography, and email providers with 13-month historical data
Dynamic Segment Management: Create, update, and delete contact segments with complex filtering criteria that automatically refresh
Dynamic Template Management: Create, manage, and version HTML email templates with Handlebars support for personalization
Custom Fields Management: Define and manage additional contact data fields for enhanced targeting
Mail Sending: Send transactional emails via SendGrid with full personalization support
Sender Identity Management: Manage verified sender identities with authentication tracking
Suppression Lists: Manage bounces, spam reports, and unsubscribes for deliverability optimization
Account Settings: Access account details and configuration management
Browser Integration: Quick links to SendGrid web interface for visual operations
Read-Only Safety Mode: Secure operation mode prevents accidental data modification while maintaining full analytics access
Related MCP server: Campaign Monitor MCP
Supported MCP Clients
✅ Claude Desktop - Official desktop app ✅ Claude Code - Official CLI tool ✅ Claude custom connectors - via Streamable HTTP (see Install the server) ✅ OpenAI Responses API / Apps SDK - via Streamable HTTP ✅ MCP Market - Hosted, one-click deploy, no install required (see Install the server) ✅ Cline - VS Code extension ✅ Zed Editor - Modern code editor ✅ Continue - VS Code autopilot ✅ Codex CLI - via Streamable HTTP ✅ Any MCP-compatible client
Getting Started
Follow these steps in order — by the end you'll have the server installed (or deployed), your SendGrid API key set, and your MCP client connected.
This is the actual request path, whichever client you end up using — some launch the server locally over stdio, others reach it over the network via Streamable HTTP (MCP Market, self-hosted), which adds a choice of client auth on top:
┌──────────┐
│ Client │
└────┬─────┘
┌──────────────────────┴───────────────────┐
│ │
stdio (local subprocess) HTTP (network)
│ auth: none | token | oauth │
│ │
└──────────────────────┬───────────────────┘
▼
┌────────────────────┐
│ MCP Server │
│ (this repo) │
└─────────┬──────────┘
│ SENDGRID_API_KEY
│ (always required, any transport)
▼
┌────────────────────┐
│ SendGrid API │
└────────────────────┘SENDGRID_API_KEY is required no matter which path you take. READ_ONLY=true
(the default) is a further gate inside the MCP Server box — it blocks
create/update/delete/send tools once a request is already in, regardless of
which branch it arrived on. See Environment Variables
for the full list of what you can configure.
1. Install the server
Install it locally if your client launches it itself, or go remote if it connects over the network instead.
Local (stdio) — for Claude Desktop, Claude Code, Cline, Zed, Continue, or any client that runs the server as a subprocess:
npm install -g sendgrid-mcpThis installs the sendgrid-mcp command globally, which your MCP client will launch as a subprocess. Requires Node.js 20+.
Remote (HTTP) — nothing to install locally; pick one:
MCP Market deploys and hosts this server for you — nothing to install locally and no environment variables to manage on your machine. You still need a SendGrid API key; you'll enter it into MCP Market instead of your own shell/config.
From MCP Market's MCP Servers page, deploy a custom MCP from either source:
GitHub — select the GitHub source, choose Public or Private repo, paste the repo URL (
https://github.com/deyikong/sendgrid-mcp), and pick a server name.npm — select the npm source, enter the package name (
sendgrid-mcp), and pick a server name.

Either way, MCP Market builds and runs it for you; it shows up under
MCP Servers with a Running status once ready. Continue to
Configure your MCP client to set your
credentials and connect.
Run the server yourself and expose it over Streamable HTTP instead of letting
a client launch it locally — for Claude custom connectors, OpenAI's Responses
API mcp tool / Apps SDK, or any other remote client.
The MCP endpoint is POST /mcp; GET /health returns a status document for
load balancers. Requests are handled statelessly (no session id required),
which is what hosted clients expect.
none/token/oauth below are not alternate ways to connect — they're
three different locks on the one new door (HTTP), as shown in the
request-flow diagram above.
Quick start (local development)
export SENDGRID_API_KEY="SG.your_api_key_here"
export MCP_TRANSPORT=http
export MCP_AUTH_MODE=token
export MCP_AUTH_TOKEN="$(openssl rand -hex 32)"
sendgrid-mcpAuthentication
Set MCP_AUTH_MODE to one of:
Mode | Use for | Requires |
| Production / remote clients |
|
| Local dev, simple self-hosting |
|
| Loopback development only | — refuses to start on a public bind |
OAuth mode makes this server an OAuth 2.1 resource server. It does not issue or store credentials — it verifies access tokens minted by your existing identity provider (Auth0, Okta, Entra ID, Google, Stytch, …) against that provider's published JWKS.
export MCP_AUTH_MODE=oauth
export MCP_OAUTH_ISSUER="https://your-tenant.auth0.com"
export MCP_OAUTH_AUDIENCE="https://mcp.example.com"
export MCP_OAUTH_REQUIRED_SCOPES="sendgrid:read"
export MCP_PUBLIC_URL="https://mcp.example.com"SENDGRID_API_KEY (see the diagram in Getting Started)
is still required alongside these — OAuth only controls who can reach the server, not what the server
uses to talk to SendGrid.
The server publishes RFC 9728
Protected Resource Metadata at /.well-known/oauth-protected-resource, so
clients discover your authorization server automatically: an unauthenticated
request gets a 401 whose WWW-Authenticate header points at that document,
the client reads it, sends the user to your IdP to log in, and retries with the
resulting token.
Tokens are rejected (401) if expired, wrongly signed, or issued for a
different issuer or audience; a valid token missing a required scope gets 403.
Setting up your identity provider
Whichever provider you use, you're configuring the same three things: an issuer URL, an audience (a stable identifier for this API resource), and a scope clients will request. A few concrete walkthroughs:
Sign in to your Auth0 Dashboard and go to Applications → APIs → Create API.
Set an Identifier — this is your audience, e.g.
https://mcp.example.com. It doesn't need to resolve to anything; it just needs to be unique.Under the API's Permissions tab, add the scopes your server should require, e.g.
sendgrid:read,sendgrid:write.Your Issuer URL is your tenant domain, shown on the API's Settings tab:
https://YOUR_TENANT.auth0.com/.
export MCP_OAUTH_ISSUER="https://YOUR_TENANT.auth0.com/"
export MCP_OAUTH_AUDIENCE="https://mcp.example.com"
export MCP_OAUTH_REQUIRED_SCOPES="sendgrid:read"Sign in to the Okta Admin Console and go to Security → API → Authorization Servers.
Use the
defaultauthorization server, or create a new one. Its Issuer URI, shown at the top of the server's settings page, looks likehttps://{yourOktaDomain}/oauth2/{authServerId}.On the same page, the Audience field (default
api://default) is what you'll use for the audience — set it to something specific to this server, e.g.api://sendgrid-mcp.Open the Scopes tab and add a scope, e.g.
sendgrid:read.
export MCP_OAUTH_ISSUER="https://YOUR_OKTA_DOMAIN/oauth2/YOUR_AUTH_SERVER_ID"
export MCP_OAUTH_AUDIENCE="api://sendgrid-mcp"
export MCP_OAUTH_REQUIRED_SCOPES="sendgrid:read"In the Azure Portal, go to Microsoft Entra ID → App registrations → New registration to represent this MCP server as a resource.
Open the new app's Expose an API page and set the Application ID URI — this becomes your audience, e.g.
api://<client-id>.On the same page, click Add a scope to define one, e.g.
sendgrid.read.Your Issuer URL is
https://login.microsoftonline.com/{tenant-id}/v2.0, where{tenant-id}is the directory (tenant) ID from the app's Overview page.
export MCP_OAUTH_ISSUER="https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0"
export MCP_OAUTH_AUDIENCE="api://YOUR_CLIENT_ID"
export MCP_OAUTH_REQUIRED_SCOPES="sendgrid.read"Other providers (Google Identity Platform, Stytch, …) follow the same shape:
find the OpenID Connect issuer (usually published at
<issuer>/.well-known/openid-configuration), define an audience/resource
identifier for this server, and create a scope for it.
Whichever provider you use, also set MCP_PUBLIC_URL to the
externally-reachable URL of your server (e.g. https://mcp.example.com) —
clients use it during OAuth discovery.
TLS
Either terminate TLS in-process:
export TLS_KEY_FILE=/etc/ssl/private/mcp.key
export TLS_CERT_FILE=/etc/ssl/certs/mcp.crt
export TLS_CA_FILE=/etc/ssl/certs/chain.pem # optional intermediates…or terminate it at a proxy and tell the server to trust the forwarded headers:
export TRUST_PROXY=true
export MCP_PUBLIC_URL="https://mcp.example.com"TRUST_PROXY is off by default because X-Forwarded-* headers are
client-controlled unless a proxy you control overwrites them. TLS 1.2 is the
enforced minimum in in-process mode.
Connecting clients
OpenAI (Responses API):
{
"model": "gpt-5",
"tools": [{
"type": "mcp",
"server_label": "sendgrid",
"server_url": "https://mcp.example.com/mcp",
"authorization": "ACCESS_TOKEN"
}],
"input": "List my SendGrid automations"
}Claude (custom connector): add https://mcp.example.com/mcp as a custom
connector. In oauth mode Claude walks the discovery flow and prompts the user
to log in; in token mode supply the bearer token directly.
Security
The server refuses to start on misconfigurations that would quietly expose your SendGrid account, rather than coming up in a weaker mode than you intended:
Binding to a non-loopback address without either TLS or
TRUST_PROXYMCP_AUTH_MODE=noneon anything but a loopback bindAn
http://MCP_PUBLIC_URLthat is not loopbackA missing or under-length
MCP_AUTH_TOKEN, oroauthmode without an issuer and audienceTLS_KEY_FILEandTLS_CERT_FILEset only one of the pair
Beyond that:
Keep
READ_ONLY=trueunless you need write and send operations. This is the single most effective limit on blast radius — it is the difference between a leaked token exposing analytics and one sending mail from your domain.Set
MCP_ALLOWED_HOSTS/MCP_ALLOWED_ORIGINSto enable DNS-rebinding protection, which matters most for locally bound servers reachable from a browser.Scope your SendGrid API key to only the permissions this server needs; the key is the real credential behind every request.
2. Get your SendGrid API key
Go to SendGrid API Keys
Click "Create API Key"
Choose "Full Access" or select specific permissions
Copy the generated key (starts with
SG.)
3. Configure your MCP client
Once your server is deployed (see Install the server), set your credentials and connect a client.
Set your environment variables
Open your deployed server → the Variables tab → My Credentials, and fill in:

Variable | Required | Description |
| ✅ | Your SendGrid API key (starts with SG.) |
| ❌ | Server name for identification |
| ❌ | Server version |
| ❌ | Logging level (debug, info, warn, error) |
| ❌ | API request timeout in milliseconds |
| ❌ | Enable read-only mode (true/false) |
Each field saves independently — only SENDGRID_API_KEY is required.
Connect a client
Click + Connect on your server's page. MCP Market shows one-click install options for Claude Desktop, Claude Code, Codex CLI, Cursor, VS Code, Windsurf, Cline, JetBrains, Gemini CLI, Amazon Q, Goose, and Continue — pick yours and follow its prompt.

For any other client, use the Connection URL option instead, which gives
you a Streamable HTTP endpoint unique to your deployment. The examples below
use deyikong/sendgrid-mcp for illustration — yours will have your own
username and server name:
https://link.mcpmarket.com/<your-username>/<your-server-name>/mcpWire it up the same way as any other self-hosted endpoint, e.g.:
# Claude Code
claude mcp add --transport http sendgrid https://link.mcpmarket.com/<your-username>/<your-server-name>/mcp
# Codex CLI
codex mcp add sendgrid --url https://link.mcpmarket.com/<your-username>/<your-server-name>/mcpMCP Market manages hosting, TLS, and availability for the deployed server; for account, billing, or deployment questions, refer to MCP Market directly rather than this repository.
The official Claude desktop application with native MCP support.
Configuration File Locations:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.json
Configuration:
{
"mcpServers": {
"sendgrid": {
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}
}
}Optional Configuration:
{
"mcpServers": {
"sendgrid": {
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "false",
"LOG_LEVEL": "info",
"REQUEST_TIMEOUT": "30000"
}
}
}
}After configuration:
Save the file
Restart Claude Desktop
The SendGrid MCP server will be available in Claude
Claude's official command-line interface with MCP support.
Installation:
npm install -g @anthropic-ai/claude-codeConfiguration File Location:
All platforms:
~/.claude/config.json
Configuration:
{
"mcpServers": {
"sendgrid": {
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}
}
}Usage:
# Start Claude Code with SendGrid MCP
claude
# The SendGrid tools will be automatically available
# Ask Claude: "List my SendGrid automations"Popular VS Code extension with MCP support.
Installation:
Install the Cline extension from VS Code marketplace
Open Cline settings
Configuration File:
Open VS Code Settings
Search for "Cline: MCP Settings"
Edit the MCP configuration JSON
Configuration:
{
"mcpServers": {
"sendgrid": {
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}
}
}Modern code editor with built-in AI and MCP support.
Configuration File Location:
macOS/Linux:
~/.config/zed/settings.jsonWindows:
%APPDATA%/Zed/settings.json
Configuration:
{
"context_servers": {
"sendgrid-mcp": {
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}
}
}Open-source autopilot for VS Code with MCP support.
Configuration File Location:
All platforms:
~/.continue/config.json
Configuration:
{
"experimental": {
"modelContextProtocolServers": [
{
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}
]
}
}For any MCP-compatible client not listed above:
Command Line:
# With environment variables
SENDGRID_API_KEY="SG.your_api_key_here" READ_ONLY="true" sendgrid-mcpConfiguration Template:
{
"command": "sendgrid-mcp",
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}Environment Variables
The server is configured entirely through environment variables. SENDGRID_API_KEY is the only required one.
Variable | Required | Description | Default |
| ✅ | Your SendGrid API key (starts with SG.) | - |
| ❌ | Enable read-only mode (true/false) |
|
| ❌ | Server name for identification |
|
| ❌ | Server version |
|
| ❌ | Logging level (debug, info, warn, error) |
|
| ❌ | API request timeout in milliseconds |
|
READ_ONLY defaults to true. In this mode every tool is registered and visible, but operations that create, update, delete, or send are blocked at runtime with a clear error message — only list/get/search/browser-link tools actually run. This is the safest default while you're getting set up. See Read-Only Mode for the full breakdown of what's blocked, and set READ_ONLY=false once you're ready to allow write and send operations.
These variables are set inside your MCP client's configuration (as an env block) — see Configure your MCP client. Self-hosted HTTP mode has its own set of variables (transport, auth, TLS) — see Install the server.
Read-Only Mode
By default, the SendGrid MCP server runs in read-only mode (READ_ONLY=true) for safety. All tools are registered and available, but mutable operations are blocked at runtime with helpful error messages.
How Read-Only Mode Works
When READ_ONLY=true (default):
All tools are registered and visible to the AI assistant
Non-mutating operations work normally (list, get, search, open browser links)
Mutating operations are blocked with a clear error message:
❌ Operation blocked: Server is running in READ_ONLY mode. Set READ_ONLY=false in your environment to enable write operations.
Read-Only Safe Operations
These 32 operations work normally when READ_ONLY=true:
Automations & Campaigns:
list_automations,get_automation,open_automation_creator,open_automation_editorlist_single_sends,get_single_send,open_single_send_creator,open_single_send_stats
Contacts, Lists & Segments:
list_contacts,get_contact,search_contacts,search_contacts_by_emailslist_email_listslist_segments,open_segment_creatorlist_custom_fields
Senders:
list_senders,open_csv_uploader
Templates:
list_templates,get_template,get_template_version,open_template_editor
Statistics (all read-only by design):
get_global_stats,get_stats_overview,get_stats_by_browser,get_stats_by_client_type,get_stats_by_device_type,get_stats_by_mailbox_provider,get_stats_by_country,get_category_stats,get_subuser_stats
Utilities:
get_scopes
Blocked Operations in Read-Only Mode
These 26 operations are blocked when READ_ONLY=true:
update_automation_settings,update_automation_step,delete_automationcreate_contact,update_contact,delete_contactcreate_contact_with_lists,remove_contact_from_listscreate_email_list,update_email_list,delete_email_listcreate_custom_field,update_custom_field,delete_custom_fieldcreate_sender,delete_senderupdate_segment,delete_segmentcreate_template,update_template,delete_templatecreate_template_version,update_template_version,delete_template_versioncreate_html_templatesend_mail
Full Access Mode
To enable create, update, delete, and send operations, set READ_ONLY=false in your MCP client's env block:
{
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "false"
}
}This will allow all mutating operations to execute normally while maintaining all read operations.
⚠️ Security Note: Only disable read-only mode if you need write access and trust the environment where the server is running.
Available Tools
The server exposes 154 tools grouped into 22 categories. Every tool is registered regardless of READ_ONLY mode — see Read-Only Mode for which ones are blocked by default.
📚 For natural-language prompts you can say directly to Claude, see EXAMPLE_PROMPTS.md. The examples below show the underlying JSON tool calls.
Tools Summary
Category | Tools | Read-Only | Mutable |
7 | 4 | 3 | |
4 | 4 | 0 | |
7 | 4 | 3 | |
6 | 1 | 5 | |
8 | 3 | 5 | |
4 | 2 | 2 | |
11 | 4 | 7 | |
1 | 0 | 1 | |
9 | 9 | 0 | |
1 | 1 | 0 | |
21 | 10 | 11 | |
13 | 5 | 8 | |
12 | 5 | 7 | |
9 | 5 | 4 | |
11 | 6 | 5 | |
2 | 2 | 0 | |
2 | 2 | 0 | |
3 | 3 | 0 | |
11 | 11 | 0 | |
9 | 4 | 5 | |
1 | 0 | 1 | |
2 | 2 | 0 | |
Total | 154 | 87 | 67 |
API Keys, Alerts, Teammates, and Dedicated IPs are deliberately read-only in this server, and SSO/certificate management isn't exposed at all — see Intentionally Unsupported Operations for why.
Marketing Automations
list_automations- List all marketing automations with metadataget_automation- Get detailed information about a specific automationupdate_automation_settings- Update automation-level settings (name, status)update_automation_step- Update individual step settings (status, wait time)delete_automation- Permanently delete an automationopen_automation_creator- Open automation creator in browseropen_automation_editor- Open specific automation editor
Example — get automation details:
{
"tool": "get_automation",
"arguments": {
"automation_id": "automation_id_here"
}
}Example — pause an entire automation:
{
"tool": "update_automation_settings",
"arguments": {
"automation_id": "automation_id_here",
"status": "paused"
}
}Example — update a single step (status, wait time):
{
"tool": "update_automation_step",
"arguments": {
"automation_id": "automation_id_here",
"step_id": "step_id_here",
"step_status": "active",
"wait_time": 1440
}
}Example — delete an automation:
{
"tool": "delete_automation",
"arguments": {
"automation_id": "automation_id_here"
}
}Single Send Campaigns
list_single_sends- List all single send campaigns with metadataget_single_send- Retrieve detailed content and settings for a single send campaignopen_single_send_creator- Open campaign creator in browser for visual designopen_single_send_stats- View detailed campaign performance statistics
Example — get a campaign's content and settings:
{
"tool": "get_single_send",
"arguments": {
"singlesend_id": "singlesend_id_here"
}
}Contact CRUD Operations
list_contacts- List all contacts with pagination and filteringget_contact- Get detailed information about a specific contactcreate_contact- Create new contacts with custom fieldsupdate_contact- Update existing contact information and custom datadelete_contact- Delete contacts permanently with cleanupsearch_contacts- Search for contacts using advanced query conditionssearch_contacts_by_emails- Search for specific contacts by email addresses
Example — create a new contact:
{
"tool": "create_contact",
"arguments": {
"contacts": [
{
"email": "newuser@example.com",
"first_name": "Jane",
"last_name": "Smith"
}
]
}
}Example — search for contacts by email:
{
"tool": "search_contacts_by_emails",
"arguments": {
"emails": ["john@example.com", "jane@example.com"]
}
}Example — search contacts with a query condition:
{
"tool": "search_contacts",
"arguments": {
"query": "email LIKE '@example.com'",
"page_size": 10
}
}Example — update a contact:
{
"tool": "update_contact",
"arguments": {
"contacts": [
{
"id": "contact_id_here",
"first_name": "John",
"last_name": "Updated"
}
]
}
}Example — delete contacts:
{
"tool": "delete_contact",
"arguments": {
"contact_ids": ["contact_id_1", "contact_id_2"]
}
}Email List Management
list_email_lists- List all email listscreate_email_list- Create a new email listupdate_email_list- Update email list propertiesdelete_email_list- Delete an email listcreate_contact_with_lists- Create contacts and assign to listsremove_contact_from_lists- Remove contacts from a specific list
Example — list email lists:
{
"tool": "list_email_lists",
"arguments": {
"page_size": 100
}
}Example — rename an email list:
{
"tool": "update_email_list",
"arguments": {
"list_id": "list_id_here",
"name": "Updated List Name"
}
}Example — remove contacts from a list:
{
"tool": "remove_contact_from_lists",
"arguments": {
"list_id": "list_id_here",
"contact_ids": ["contact_id_1", "contact_id_2"]
}
}Example — delete an email list:
{
"tool": "delete_email_list",
"arguments": {
"list_id": "list_id_here"
}
}Segments & Custom Fields
list_segments- List dynamic segments with parent relationships and criteriaopen_segment_creator- Open segment creator in browser for visual query buildingupdate_segment- Update existing segment name or query criteria with real-time refreshdelete_segment- Delete an existing segment (contacts remain unaffected)list_custom_fields- List custom field definitions with data typescreate_custom_field- Create new custom fields (Text, Number, Date types)update_custom_field- Update existing custom field definitionsdelete_custom_field- Delete custom field definitions with data cleanup
Example — rename a segment:
{
"tool": "update_segment",
"arguments": {
"segment_id": "segment_id_here",
"name": "Updated Segment Name"
}
}Example — update a segment's query criteria:
{
"tool": "update_segment",
"arguments": {
"segment_id": "segment_id_here",
"query_dsl": "{\"and\": [{\"field\": \"email\", \"value\": \"@example.com\", \"operator\": \"like\"}]}"
}
}Example — delete a segment:
{
"tool": "delete_segment",
"arguments": {
"segment_id": "segment_id_here"
}
}Example — create a custom field:
{
"tool": "create_custom_field",
"arguments": {
"name": "customer_tier",
"field_type": "Text"
}
}Example — update a custom field:
{
"tool": "update_custom_field",
"arguments": {
"field_id": "field_id_here",
"name": "customer_level"
}
}Example — delete a custom field:
{
"tool": "delete_custom_field",
"arguments": {
"field_id": "field_id_here"
}
}Senders & Import
list_senders- List verified sender identitiescreate_sender- Create new sender identitydelete_sender- Delete a verified sender identityopen_csv_uploader- Open CSV upload interface
Example — create a sender identity:
{
"tool": "create_sender",
"arguments": {
"nickname": "Marketing Team",
"from": { "email": "marketing@yourdomain.com", "name": "Your Company" },
"reply_to": { "email": "replies@yourdomain.com", "name": "Your Company" },
"address": "123 Main St",
"city": "Denver",
"state": "CO",
"zip": "80202",
"country": "United States"
}
}Example — delete a sender identity:
{
"tool": "delete_sender",
"arguments": {
"sender_id": "sender_id_here"
}
}Dynamic Templates
list_templates- List all dynamic and legacy templatesget_template- Get details of a specific template including all versionscreate_template- Create a new dynamic templateupdate_template- Update template name and settingsdelete_template- Delete a template and all its versionscreate_template_version- Create a new version with HTML content and settingsget_template_version- Get details of a specific template versionupdate_template_version- Update version content, subject, and settingsdelete_template_version- Delete a specific template versioncreate_html_template- Create complete template with HTML content in one step (perfect for AI agents)open_template_editor- Open SendGrid's visual template editor in browser
Templates support Handlebars syntax for dynamic content ({{variable}}, {{#each}}, {{#if}}), responsive HTML with inline CSS, up to 300 versions per template, test-data previews, and automatic plain-text generation.
Example — create a complete template in one step (best for AI agents):
{
"tool": "create_html_template",
"arguments": {
"template_name": "Welcome Email",
"version_name": "Version 1.0",
"subject": "Welcome to {{companyName}}, {{firstName}}!",
"html_content": "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>Welcome</title></head><body style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;\"><h1 style=\"color: #333;\">Welcome {{firstName}}!</h1><p>Thank you for joining {{companyName}}. We're excited to have you on board.</p></body></html>",
"test_data": "{\"firstName\":\"John\",\"companyName\":\"Acme Corp\"}"
}
}Example — add a new version with HTML content:
{
"tool": "create_template_version",
"arguments": {
"template_id": "your_template_id",
"name": "Newsletter v1.0",
"subject": "{{month}} Newsletter - {{companyName}}",
"html_content": "<!DOCTYPE html><html><head><meta charset=\"utf-8\"></head><body><h1>{{month}} Newsletter</h1>{{#each articles}}<div><h2>{{title}}</h2><p>{{summary}}</p><a href=\"{{link}}\">Read More</a></div>{{/each}}</body></html>",
"test_data": "{\"month\":\"January\",\"companyName\":\"Acme\",\"articles\":[{\"title\":\"Article 1\",\"summary\":\"Summary here\",\"link\":\"https://example.com\"}]}"
}
}Mail Sending
send_mail- Send transactional emails (supports templates with dynamic template data)
Example — send a simple email:
{
"tool": "send_mail",
"arguments": {
"personalizations": [
{
"to": [{"email": "recipient@example.com", "name": "John Doe"}],
"subject": "Hello from SendGrid MCP!"
}
],
"from": {"email": "sender@yourdomain.com", "name": "Your Name"},
"content": [
{
"type": "text/plain",
"value": "Hello! This email was sent via SendGrid MCP server."
}
]
}
}Example — send using a dynamic template:
{
"tool": "send_mail",
"arguments": {
"personalizations": [
{
"to": [{"email": "user@example.com", "name": "John Doe"}],
"dynamic_template_data": {
"firstName": "John",
"companyName": "Acme Corp",
"orderNumber": "12345",
"items": [
{"name": "Product A", "price": "29.99"},
{"name": "Product B", "price": "19.99"}
]
}
}
],
"from": {"email": "noreply@yourcompany.com", "name": "Your Company"},
"template_id": "d-1234567890abcdef1234567890abcdef"
}
}Email Statistics & Analytics
get_global_stats- Retrieve overall email performance metricsget_stats_overview- Get comprehensive statistics across multiple dimensionsget_stats_by_browser- Statistics broken down by browser type (Chrome, Firefox, Safari, etc.)get_stats_by_client_type- Statistics by email client type (desktop, mobile, webmail)get_stats_by_device_type- Statistics by device type (desktop, mobile, tablet)get_stats_by_mailbox_provider- Statistics by mailbox provider (Gmail, Outlook, Yahoo, etc.)get_stats_by_country- Statistics by country and state/provinceget_category_stats- Statistics for specific email categories (13-month history)get_subuser_stats- Statistics for specific subuser accounts
Tracks delivery, open, and click-through rates; bounce rates (hard/soft), spam reports, and unsubscribes; geographic performance and device preferences; email client compatibility and browser rendering; and provider-specific deliverability.
Example — global email statistics:
{
"tool": "get_global_stats",
"arguments": {
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"aggregated_by": "day"
}
}Example — statistics by mailbox provider:
{
"tool": "get_stats_by_mailbox_provider",
"arguments": {
"start_date": "2024-01-01",
"end_date": "2024-01-07",
"aggregated_by": "day",
"mailbox_providers": "gmail.com,outlook.com,yahoo.com"
}
}Example — geographic performance statistics:
{
"tool": "get_stats_by_country",
"arguments": {
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"country": "US",
"aggregated_by": "week"
}
}Example — comprehensive statistics overview:
{
"tool": "get_stats_overview",
"arguments": {
"start_date": "2024-01-01",
"end_date": "2024-01-07",
"aggregated_by": "day",
"include_subusers": false
}
}Utilities
get_scopes- Get available API permission scopes (no arguments)
Suppressions
list_suppression_groups- List all unsubscribe (suppression) groups on the accountcreate_suppression_group- Create a new unsubscribe (suppression) groupget_suppression_group- Get details about a specific unsubscribe (suppression) groupupdate_suppression_group- Update the name, description, or default status of an existing suppression groupdelete_suppression_group- Permanently delete an unsubscribe (suppression) group. This action cannot be undone.list_group_suppressions- List all email addresses that are unsubscribed from a specific suppression groupadd_group_suppressions- Add one or more email addresses to a specific suppression group's unsubscribe listremove_group_suppression- Remove a single email address from a specific suppression group's unsubscribe list. This only re-permits mail assigned to this group's category -- it is not a global resubscribe.list_global_suppressions- List email addresses on the account-wide global unsubscribe list, optionally filtered by a time rangeadd_global_suppression- Add recipients to the account-wide global unsubscribe list -- they will stop receiving all non-transactional mail from this accountget_global_suppression- Check whether a specific email address is on the account-wide global unsubscribe listdelete_global_suppression- Remove an email address from the account-wide global suppression list, effectively resubscribing them to non-transactional maillist_bounces- List all email addresses that have bounced, optionally filtered by a time rangeget_bounce- Get bounce event(s) recorded for a specific email addressdelete_bounce- Remove a bounce record for an email address so this address can receive mail againlist_blocks- List all email addresses currently on the blocks list, optionally filtered by a time rangedelete_block- Remove an email address from the blocks list so this address can receive mail againlist_spam_reports- List all email addresses that have reported mail as spam, optionally filtered by a time rangedelete_spam_report- Remove an email address from the spam reports list so this address can receive mail againlist_invalid_emails- List all email addresses that have been marked invalid, optionally filtered by a time rangedelete_invalid_email- Remove an email address from the invalid emails list so this address can receive mail again
Domain Authentication & Link Branding
list_authenticated_domains- List all authenticated (whitelabel) domains configured for sending mailget_authenticated_domain- Get detailed information about a specific authenticated domain, including its DNS recordscreate_authenticated_domain- Set up domain authentication (SPF/DKIM) for sending mail from a custom domainupdate_authenticated_domain- Update the custom SPF or default settings of an existing authenticated domaindelete_authenticated_domain- Permanently delete an authenticated domain. This action cannot be undone.validate_authenticated_domain- Check whether the domain's DNS records are correctly configured for authenticationget_default_authenticated_domain- Get the authenticated domain currently set as the default for sending maillist_branded_links- List all branded links (link whitelabels) configured for click trackingget_branded_link- Get detailed information about a specific branded link, including its DNS recordscreate_branded_link- Set up branded link tracking (click tracking through the sender's own domain instead of sendgrid.net)update_branded_link- Update the default setting of an existing branded linkdelete_branded_link- Permanently delete a branded link. This action cannot be undone.validate_branded_link- Check whether the branded link's DNS records are correctly configured
Event & Inbound Parse Webhooks
list_event_webhooks- List all configured Event Webhook settings on the accountget_event_webhook- Get the configuration of a specific Event Webhook by IDcreate_event_webhook- Creates a new Event Webhook that POSTs email events (delivered, bounced, opened, clicked, etc.) to the given URLupdate_event_webhook- Update the configuration of an existing Event Webhookdelete_event_webhook- Permanently delete an Event Webhook configuration. This action cannot be undone.test_event_webhook- Sends a test event payload to the given webhook URL to verify it's reachable and correctly configuredlist_inbound_parse_settings- List all configured Inbound Parse webhook settings on the accountget_inbound_parse_setting- Get the Inbound Parse webhook configuration for a specific hostnamecreate_inbound_parse_setting- Configures inbound email parsing so mail sent to the given hostname is POSTed to the given URLupdate_inbound_parse_setting- Update the Inbound Parse webhook configuration for a specific hostnamedelete_inbound_parse_setting- Permanently delete an Inbound Parse webhook configuration for a hostname. This action cannot be undone.get_inbound_parse_stats- Get statistics on the number of inbound emails parsed over a given date range
Tracking Settings
get_tracking_settings- Retrieve all tracking settings (click, open, subscription, Google Analytics) in one callget_click_tracking_settings- Retrieve the current click tracking settingupdate_click_tracking_settings- Enable or disable click tracking on links within emailsget_google_analytics_settings- Retrieve the current Google Analytics tracking settingsupdate_google_analytics_settings- Update Google Analytics tracking settings, including UTM campaign, content, medium, source, and term valuesget_open_tracking_settings- Retrieve the current open tracking settingupdate_open_tracking_settings- Enable or disable open tracking, which inserts an invisible pixel to record when an email is openedget_subscription_tracking_settings- Retrieve the current subscription tracking settingsupdate_subscription_tracking_settings- Update subscription tracking settings, including the unsubscribe link content, landing page, URL, and replacement tag
Mail Settings
get_all_mail_settings- Retrieve all mail settings (address whitelist, bounce purge, footer, forward bounce, forward spam, etc.) in one callget_address_whitelist_settings- Retrieve the current address whitelist mail setting, which controls which email addresses or domains bypass all suppression listsupdate_address_whitelist_settings- Update the address whitelist setting that controls which email addresses or domains bypass all suppression listsget_bounce_purge_settings- Retrieve the current bounce purge mail setting, which automatically purges old bounce records after a configured number of daysupdate_bounce_purge_settings- Update the bounce purge setting that automatically purges old bounce records after a configured number of daysget_footer_settings- Retrieve the current footer mail setting, which appends a footer to every outgoing emailupdate_footer_settings- Update the footer setting that appends a footer to every outgoing emailget_forward_bounce_settings- Retrieve the current forward bounce mail setting, which forwards bounce notifications to a given email addressupdate_forward_bounce_settings- Update the forward bounce setting that forwards bounce notifications to a given email addressget_forward_spam_settings- Retrieve the current forward spam mail setting, which forwards spam report notifications to a given email addressupdate_forward_spam_settings- Update the forward spam setting that forwards spam report notifications to a given email address
API Keys (read-only)
list_api_keys- List all API keys on the account (names and IDs only, not the secret key values)get_api_key- Get details for a specific API key, including its scopes
Alerts (read-only)
list_alerts- List all usage/stats alerts configured on the accountget_alert- Get details for a specific alert
Teammates (read-only)
list_teammates- List all teammates (users) on the accountget_teammate- Get details for a specific teammate, including their permission scopeslist_pending_teammates- List pending teammate invitations that haven't been accepted yet
Dedicated IPs (read-only)
list_ip_addresses- List all IP addresses assigned to the accountget_ip_address- Get details for a specific IP address, including its warmup status and assigned subuserslist_assigned_ips- List all IP addresses that are currently assigned to a subuserlist_ip_pools- List all IP pools on the accountget_ip_pool- Get details for a specific IP pool, including the IP addresses it containsget_remaining_ips- Get the count and cost of additional dedicated IP addresses available for purchaselist_ip_warmups- List all IP addresses currently in the warmup processget_ip_warmup_status- Get the warmup status for a specific IP addresslist_allowed_ips- List IP addresses allowed to access the account via the API/UI (the access allowlist)get_allowed_ip- Get details for a specific entry in the access allowlistlist_access_activity- List recent account access attempts (successful and blocked logins/API calls)
Design Library
list_designs- List all custom email designs in the Design Librarycreate_design- Create a new custom email design in the Design Library from raw HTMLget_design- Get details for a specific design in the Design Libraryupdate_design- Update the content or metadata of an existing design in the Design Librarydelete_design- Permanently delete a custom design from the Design Library. This action cannot be undone.duplicate_design- Create a copy of an existing design in the Design Librarylist_prebuilt_designs- List SendGrid's built-in pre-made design templatesget_prebuilt_design- Get details for one of SendGrid's built-in pre-made designsduplicate_prebuilt_design- Create an editable copy of one of SendGrid's built-in pre-made designs
Email Address Validation
validate_email- Check whether an email address is valid and likely to be deliverable, using SendGrid's Email Address Validation API (consumes a billed validation credit per call)
Message Search
search_email_activity- Search sent message activity using SendGrid's SGQL filter syntax (e.g. by recipient, status, or subject) -- useful for troubleshooting why a specific email wasn't deliveredget_message_details- Get full delivery event history and details for a single sent message by its message ID
Available Resources
sendgrid://automations- Marketing automations datasendgrid://singlesends- Single send campaigns datasendgrid://lists- Email lists datasendgrid://contacts- Contact segments datasendgrid://suppressions- Suppression lists (bounces, spam, etc.)sendgrid://account- Account profile informationsendgrid://stats- Global email statistics and performance metrics (30-day overview)sendgrid://stats/browsers- Email statistics by browser type (7-day data)sendgrid://stats/devices- Email statistics by device type (7-day data)sendgrid://stats/geography- Email statistics by geographic location (7-day data)sendgrid://stats/providers- Email statistics by mailbox provider (7-day data)
Available Prompts
sendgrid_automation_help- Get help with marketing automationssendgrid_campaign_help- Get help with single send campaignssendgrid_contacts_help- Get help with comprehensive contact managementsendgrid_list_management_help- Get help with email list CRUD operationssendgrid_update_list_help- Get help with updating/renaming email listssendgrid_contact_crud_help- Get help with contact create/read/update/delete operationssendgrid_custom_fields_help- Get help with custom field definitions managementsendgrid_segment_management_help- Get help with managing dynamic contact segmentssendgrid_sender_management_help- Get help with sender identity managementsendgrid_templates_help- Get help with creating and managing dynamic email templatessendgrid_suppressions_help- Get help with suppression listssendgrid_settings_help- Get help with account settingssendgrid_mail_send_help- Get help with sending emailssendgrid_stats_help- Get help with analyzing email performance and statistics
Development & Contributing
This section is for developers who want to modify the server or contribute to development.
Prerequisites
Node.js 20+ and npm
SendGrid account with API key
Git
Development Setup
# Clone the repository
git clone https://github.com/deyikong/sendgrid-mcp.git
cd sendgrid-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Link for local development
npm link
# Test the local build
sendgrid-mcpUsing a local build in an MCP client (instead of the npm-installed binary):
{
"mcpServers": {
"sendgrid": {
"command": "node",
"args": ["/absolute/path/to/sendgrid-mcp/build/index.js"],
"env": {
"SENDGRID_API_KEY": "SG.your_api_key_here",
"READ_ONLY": "true"
}
}
}
}Project Structure
src/
├── index.ts # Main entry point
├── shared/ # Shared utilities
│ ├── auth.ts # Authentication
│ ├── api.ts # SendGrid API client
│ ├── env.ts # Environment validation
│ └── types.ts # Shared types
├── tools/ # Tool definitions
│ ├── automations.ts # Automation tools (7 tools)
│ ├── campaigns.ts # Campaign tools (4 tools)
│ ├── contacts.ts # Contact, list, segment & sender tools (25 tools)
│ ├── mail.ts # Mail sending tools (1 tool)
│ ├── misc.ts # Miscellaneous tools (1 tool)
│ ├── stats.ts # Statistics tools (9 tools)
│ └── templates.ts # Template tools (11 tools)
├── resources/ # Resource definitions
│ └── sendgrid.ts # MCP resources
└── prompts/ # Prompt definitions
└── help.ts # Help promptsAdding New Tools
Add tool definition to appropriate file in
src/tools/Follow the existing pattern with config and handler
Export from
src/tools/index.tsUpdate README.md with new tool documentation
Run
npm run buildto compile
Available Scripts
npm run build- Compile TypeScript to JavaScriptnpm start- Run the compiled servernpm test- Build and run the test suite
Testing Your Changes
# Build the project
npm run build
# Test with environment variables
SENDGRID_API_KEY="SG.your_key" READ_ONLY="true" node build/index.jsFor manually verifying a real client can connect over each HTTP auth mode (token, none, TLS, OAuth) rather than just the automated suite, see TESTING.md.
Creating a Release
For maintainers only:
Update version in
package.json:npm version patch # or minor, majorPush changes and tags:
git push && git push --tagsCreate GitHub release - this triggers automatic npm publishing via GitHub Actions
Publishing Process
Automated: GitHub Actions publishes to npm on release creation
Provenance: All packages include provenance attestation for security
Versioning: Follows semantic versioning (semver)
Package:
sendgrid-mcpon npm — update withnpm update -g sendgrid-mcp
Troubleshooting
Common Issues
1. Server Not Found / Command Not Found
Error: sendgrid-mcp: command not foundSolution:
Ensure you installed globally:
npm install -g sendgrid-mcpCheck npm global bin directory is in PATH:
npm config get prefixTry reinstalling:
npm uninstall -g sendgrid-mcp && npm install -g sendgrid-mcp
2. Invalid API Key
Error: SENDGRID_API_KEY must start with 'SG.'Solution:
Ensure your API key starts with
SG.Verify you copied the complete key from SendGrid
Check for extra spaces or quotes in your configuration
Generate a new API key at SendGrid API Keys
3. Permission Errors
Error: 403 ForbiddenSolution:
Your API key may not have sufficient permissions
Create a new key with "Full Access" or required scopes
Verify the key hasn't been revoked or expired
4. Read-Only Mode Blocking Operations
❌ Operation blocked: Server is running in READ_ONLY modeSolution:
This is intentional security protection
To enable write operations, set
READ_ONLY: "false"in your MCP client configurationExample:
{ "env": { "SENDGRID_API_KEY": "SG.your_key", "READ_ONLY": "false" } }
5. MCP Client Not Detecting Server
Solution:
Verify the configuration file location for your specific client
Ensure JSON syntax is valid (no trailing commas, proper quotes)
Restart your MCP client after configuration changes
Check client logs for specific error messages
6. Connection Timeout
Error: Request timeoutSolution:
Check your internet connection
Increase timeout in configuration:
{ "env": { "REQUEST_TIMEOUT": "60000" } }Verify SendGrid API is accessible (not blocked by firewall/proxy)
Getting Help
Built-in Help: Use help prompts in your MCP client (e.g., ask Claude: "help with sendgrid automations")
SendGrid API: Official API Documentation
MCP Protocol: Model Context Protocol Docs
Issues: Report bugs at the GitHub repository
Debug Mode
Enable detailed logging by setting the LOG_LEVEL:
{
"env": {
"SENDGRID_API_KEY": "SG.your_key",
"LOG_LEVEL": "debug"
}
}This will provide detailed information about API requests and responses.
Security
Found a vulnerability? Please report it privately rather than opening a public issue — see SECURITY.md.
Intentionally Unsupported Operations
A handful of SendGrid API capabilities are deliberately left out of this server, on top of whatever READ_ONLY mode blocks at runtime. These aren't gaps to be filled later — they're excluded because letting an LLM call them autonomously carries account-wide blast radius that a READ_ONLY toggle alone doesn't mitigate (an operator running with READ_ONLY=false for legitimate marketing-automation writes shouldn't also be one prompt-injected tool call away from losing account access or api budget):
API key creation/rotation/deletion — only
list_api_keys/get_api_keyare exposed. Minting or deleting API keys is a classic prompt-injection target: a malicious webpage or email an agent processes could try to trick it into creating a new key and exfiltrating it.Teammate invites, permission changes, and removal — only
list_teammates/get_teammate/list_pending_teammatesare exposed. Adding, removing, or re-permissioning teammates is account access control with the same injection risk as API keys.Dedicated IP purchases, warmup control, and access-allowlist changes — only read/list tools are exposed. Dedicated IPs cost real money and affect deliverability infrastructure account-wide; access-allowlist mistakes can lock out legitimate API access entirely.
SSO and certificate management — not exposed at all, in any form. Misconfiguring SSO can lock an entire organization out of login, and there's essentially no legitimate reason for a chat assistant to be managing it.
If you need any of these for a specific automation, use the SendGrid dashboard or API directly rather than requesting this server add them — that's a deliberate design boundary, not an oversight.
License
This project is licensed under the ISC License.
Contributing
Fork the repository
Create a feature branch
Make your changes
Test thoroughly
Submit a pull request
Support
For issues related to:
SendGrid API: Check SendGrid Documentation
MCP Protocol: Check Model Context Protocol
This Server: Open an issue in this repository
Feedback
I work at SendGrid and maintain this project. Feedback, bug reports, and feature requests are always welcome — please open an issue or start a discussion on the repository.
Available Tools
58 toolscreate_contactCreate ContactBIdempotent
Create new contacts in your SendGrid account
| Name | Required | Description | Default |
|---|---|---|---|
| contacts | Yes | Array of contact objects |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds no additional behavioral context, such as how duplicates are handled, whether existing contacts are updated, or any rate limits. The idempotentHint=true suggests repeated calls with the same email may not duplicate, but the description doesn't clarify this behavior, which could be important for an agent deciding how to invoke it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no redundant words or filler. It immediately states the action and object, making it easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, a single-parameter schema, and annotations that cover safety and idempotency, the description is minimally viable. However, it lacks any mention of related tools, expected outcomes, or behavioral nuances, so an agent has no guidance beyond the raw definition and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with every parameter and nested property described in the input schema itself. The description adds no parameter-level detail, so with fully self-documenting schema, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Create new contacts in your SendGrid account' clearly states the verb (create), the resource (contacts), and the scope (SendGrid account). It is unambiguous about what the tool does, though it doesn't explicitly differentiate itself from the sibling create_contact_with_lists, which is a neighboring variation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as create_contact_with_lists or update_contact. There is no mention of prerequisites, complementary tools, or exclusions, so an agent would have to infer usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contact_with_listsCreate Contact with ListsAIdempotent
Create new contacts and assign them to specific email lists
| Name | Required | Description | Default |
|---|---|---|---|
| contacts | Yes | Array of contact objects | |
| list_ids | Yes | Array of list IDs to add the contact to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide the key behavioral signals: readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description restates the core mutation (create and assign lists) without adding extra behavioral context such as duplicate handling, list validation, or partial-failure semantics. There is no contradiction between the description and the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no filler. The primary action 'create new contacts' is front-loaded, and the list assignment is immediately clear. This is appropriately concise for scanning during tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description plus the rich schema covers the essential information needed to invoke the tool: required contacts, optional fields, and list_ids. However, for a mutating tool with no output schema, it leaves edge-case behavior unstated—such as what happens if a contact already exists, if a list_id is invalid, or how partial failures are handled. The idempotentHint annotation helps but the description itself remains minimal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both contacts and list_ids fully described in the input schema. The description does not add parameter-level meaning beyond what the schema already provides. Since the schema carries the semantic burden, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create new contacts and assign them to specific email lists.' This clearly distinguishes it from sibling create_contact, which does not mention list assignment, and from list-management or removal tools. The plural 'contacts' and 'specific email lists' also signal the intended scope of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use guidance or explicit alternatives. It never says to use this tool instead of create_contact when list assignment is needed, nor does it mention when not to use it (e.g., for contacts without lists). An agent must infer the usage context from the tool name and sibling list rather than from the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_fieldCreate Custom FieldA
Create a new custom field for contacts
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the custom field | |
| field_type | Yes | Type of the field |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a write operation (readOnlyHint=false), not destructive, and not idempotent. The description adds the 'for contacts' scope but no extra behavioral context such as uniqueness, side effects on existing contacts, or permission requirements. It does not contradict the annotations, so a middle score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that conveys action, resource, and scope with no redundant wording. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity two-parameter create with full schema coverage and annotations describing the write/non-destructive/non-idempotent nature, the description plus structured data is enough for correct invocation. It does not document return values or duplicate handling, but these are not essential for a basic create call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the schema documents both the required name and field_type, including the allowed enum values Text/Number/Date. The description adds no additional parameter semantics, so the baseline for fully covered schema applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Create'), a specific resource ('custom field'), and a scope ('for contacts'). This clearly distinguishes it from sibling tools like update_custom_field, delete_custom_field, and list_custom_fields, and from create_contact, without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when this tool should be chosen over the sibling custom-field tools, nor any note about prerequisites such as whether custom fields can be created once, are optional, or affect contact forms. The context is implied by the action verb, but no explicit when/when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_email_listCreate Email ListB
Create a new email list in your SendGrid account
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the email list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-idempotent operation. The description adds no behavioral context beyond what annotations and the action word 'Create' already convey, such as return values, uniqueness behavior, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence with no wasted words. It front-loads the primary purpose and is appropriately sized for a single-parameter creation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation with one required parameter and annotations covering the fundamental behavioral hints, the description is mostly sufficient. It could mention what the operation returns, but the absence of an output schema and the simplicity of the tool make this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the 'name' parameter. The description adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create a new email list', scoped to the SendGrid account. It clearly differentiates from sibling tools like update_email_list, delete_email_list, and list_email_lists by naming the create action and the exact resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention any preconditions or exclusions. It only restates the core action without explaining how it relates to sibling tools such as create_contact_with_lists or list_email_lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_html_templateCreate Complete HTML TemplateA
Create a new template with HTML content in one step - perfect for AI-generated designs
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | Email subject line (supports Handlebars like {{firstName}}) | |
| test_data | No | JSON string with test data for preview (e.g., '{"firstName":"John","company":"Acme"}') | |
| html_content | Yes | Complete HTML email template (supports Handlebars) | |
| version_name | Yes | Name for the initial version | |
| plain_content | No | Plain text version (will auto-generate if not provided) | |
| template_name | Yes | Name of the template |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations set to false, the description carries the behavioral disclosure burden. The 'in one step' phrase usefully implies an atomic create-template-plus-initial-version operation, which is a key behavior given the required version_name param. However, it does not explicitly state that a version is also created, nor mention side effects, idempotency, or failure modes, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single scannable sentence that front-loads the action ('Create a new template with HTML content in one step') and then adds the use case. No filler, no repetition of the title, and every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a create tool with fully documented params, but it leaves some context implicit: that this operation also creates an initial version, how duplicates or naming conflicts behave, and what the response will be (no output schema). For a tool sitting among many template and version siblings, a bit more explicit context would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so param meaning is fully documented in the schema. The description adds only a general 'HTML content' mention and the AI-design use case, but no per-parameter insight beyond what the schema already gives. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Create a new template with HTML content') and resource ('new template'), and it adds a distinctive 'in one step' qualifier that hints at what separates it from sibling create_template or create_template_version. However, the differentiation is not fully explicit since it doesn't name or contrast with those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'perfect for AI-generated designs' provides a clear use context: use this when you have complete HTML content ready to be turned into a template in a single call. It does not explicitly state when not to use it or list alternatives, but the context is reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_senderCreate SenderC
Create a new sender identity
| Name | Required | Description | Default |
|---|---|---|---|
| zip | Yes | ZIP code | |
| city | Yes | City | |
| from | Yes | ||
| state | Yes | State | |
| address | Yes | Street address | |
| country | Yes | Country | |
| nickname | Yes | Nickname for the sender | |
| reply_to | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are limited to readOnlyHint=false and destructiveHint=false, so the description carries the burden of behavioral disclosure, but 'Create a new sender identity' adds nothing. An agent learns nothing about whether duplicate nicknames are rejected, whether sender identities require verification before use, whether the operation is idempotent (idempotentHint=false), or what side effects occur. No contradiction: the write action is consistent with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single six-word sentence with no wasted words, front-loaded with the action verb. However, for a tool with 8 required parameters — including two nested objects — and no output schema, this brevity is arguably under-specification rather than disciplined conciseness. It earns high marks for economy but not for appropriate sizing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is non-trivial: 8 required parameters, nested from/reply_to objects, no output schema, and no idempotence guarantee. The description does not explain what the tool returns on success, how failures surface, whether duplicate senders are allowed, or how the created identity relates to send_mail. There is no output schema to fill this gap, so the description is materially incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, near the threshold where the schema carries the explanatory load. The properties all have short descriptions ('ZIP code', 'City', 'Nickname for the sender'), though most are tautological. The description's 'sender identity' phrasing gently hints that the assembled fields (from, reply_to, postal address) form an identity, but it adds little meaning beyond the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a new sender identity.' The purpose is unambiguous and the verb distinguishes it from the related siblings list_senders and delete_sender. However, it is very close to restating the title 'Create Sender' — the only added semantic is the word 'identity' — and it provides no detail about what constitutes a sender identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives zero guidance on when to use this tool versus alternatives. With over 50 siblings including list_senders and delete_sender, and adjacent tools like create_email_list and create_contact, an agent receives no signal about the sender-identity use case or when not to call this tool. It is not misleading, but it provides no usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_templateCreate New TemplateC
Create a new dynamic transactional template
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the template | |
| generation | No | Template generation type | dynamic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide no distinctive behavioral hints beyond indicating this is a mutating, non-idempotent operation. The description adds no context about side effects, permissions, duplicate handling, or whether existing templates are overwritten. Since this is a create operation with no safety annotations, the description should disclose more about what 'create' entails in this system.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, direct sentence with no filler. The core action is front-loaded and the qualifiers add specificity without bloating the description. It could earn a 5 if it also packed in usage guidance, but as a concise statement it is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and several closely related sibling tools, the description is under-specified. It does not explain what makes a template 'dynamic' or 'transactional', whether the operation is scoped to a particular workspace, or how it differs from create_html_template. An agent would need to inspect other tool schemas to confidently select and invoke this one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for both parameters with 100% coverage, so the baseline is 3. The description's 'dynamic' qualifier loosely aligns with the generation parameter default but does not add meaningful detail about how name or generation are used, nor does it clarify the significance of 'legacy' vs 'dynamic'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a clear verb ('Create') and resource ('template'), adding the qualifiers 'dynamic' and 'transactional' which distinguish it from generic template creation. However, it does not explain what a dynamic transactional template is, and 'dynamic' partially overlaps with the generation parameter's enum value, so the reader is left to infer the full scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus closely related siblings such as create_html_template or create_template_version. The qualifier 'dynamic' hints at a distinction, but no explicit selection criteria or alternatives are mentioned, leaving the agent to guess which template creation path is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_template_versionCreate Template VersionB
Create a new version of a template with HTML content and settings
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for this version | |
| active | No | Set as active version (1 = active, 0 = inactive) | |
| subject | Yes | Email subject line (supports Handlebars) | |
| test_data | No | JSON string of test data for Handlebars variables | |
| template_id | Yes | ID of the template to add version to | |
| html_content | Yes | HTML content of the email template (supports Handlebars) | |
| plain_content | No | Plain text version (optional) | |
| generate_plain_content | No | Auto-generate plain text from HTML |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only, non-idempotent, non-destructive behavior. The description adds little beyond the creation action, omitting important behavioral context such as the effect of 'active' on the template's current version, auto-generation of plain content, or what response is returned. This is a meaningful gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. However, 'settings' is vague and could be more explicit, which slightly reduces structural payoff despite the overall compactness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters and no output schema, the description is minimal but not wholly inadequate because the schema documents each field. Still, it lacks context about versioning semantics, how active versions are managed, and what the caller should expect after creation, leaving notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are individually documented in the schema. The description's phrase 'HTML content and settings' adds no specific parameter meaning beyond that, and it does not help disambiguate nuanced fields like active, test_data, or generate_plain_content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Create a new version of a template'. This clearly distinguishes it from sibling tools like create_template or update_template_version, and it names the core payload ('HTML content and settings').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for adding a version to an existing template, but it gives no explicit when-to-use guidance or exclusions. It does not contrast with create_template or update_template_version, so the agent must infer when this tool is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_automationDelete AutomationADestructiveIdempotent
Permanently delete a marketing automation. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| automation_id | Yes | The automation ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds meaningful behavioral context by stating the deletion is permanent and cannot be undone. This goes beyond the structured hints and gives the agent a stronger basis for warning about side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The core action is front-loaded ('Permanently delete a marketing automation'), and the second sentence adds an important warning without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive action with comprehensive annotations and full schema coverage, the description is sufficient for an agent to select and invoke the tool correctly. The irreversibility warning compensates for the absence of an output schema by setting expectations about the action's consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the only parameter, automation_id, as 'The automation ID to delete,' so schema coverage is 100%. The description does not add extra parameter-level detail, but the baseline of 3 applies because the schema already carries the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'delete' and identifies the exact resource, 'marketing automation,' making the operation unambiguous. The permanence qualifier and the irreversibility warning distinguish it from sibling tools like update_automation_settings or get_automation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when the intent is to permanently remove a marketing automation. However, it provides no explicit alternatives, exclusions, or conditions, such as 'use update_automation_settings to modify instead of deleting,' so guidance is mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_contactDelete ContactBDestructiveIdempotent
Delete contacts by IDs
| Name | Required | Description | Default |
|---|---|---|---|
| contact_ids | Yes | Array of contact IDs to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description aligns by stating 'Delete.' It adds the 'by IDs' scoping but does not disclose irreversibility, cascading effects, or behavior on nonexistent IDs. The description does not contradict the annotations, so a neutral score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, front-loaded, and free of filler. It is slightly redundant with the title, but for a one-parameter tool this brevity is still appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, one-parameter destructive operation, the description plus annotations and full schema coverage provide enough information for an agent to select and invoke the tool correctly. It does not describe the response format, but that is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; the single parameter contact_ids is already described as 'Array of contact IDs to delete.' The description's 'by IDs' reinforces that meaning but adds no substantive information beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete'), identifies the resource ('contacts'), and specifies selection by IDs, making the operation clear. It is semantically distinguishable from related sibling tools like create_contact or get_contact, though it does not explicitly differentiate itself from remove_contact_from_lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as remove_contact_from_lists or update_contact, nor any mention of prerequisites or caveats. The only usage signal is implied by the name and description, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_custom_fieldDelete Custom FieldBDestructiveIdempotent
Delete a custom field definition
| Name | Required | Description | Default |
|---|---|---|---|
| field_id | Yes | ID of the custom field to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not contradict the annotations, but it also adds no behavioral context beyond them. For a destructive operation, it omits useful details such as whether deletion is permanent or whether it affects contacts/data that use the custom field. The idempotent and destructive hints carry the disclosure burden alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. Every word contributes to identifying the operation and the target resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete tool, the core invocation details are present: action, resource, and required field_id. However, the description omits the consequences of deletion and any guidance on how to find the field_id, so it is not fully complete for an agent operating without prior context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: field_id is documented as 'ID of the custom field to delete'. The description adds no further nuance, but none is required because the single parameter is fully explained by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and names a precise resource ('custom field definition'), which clearly distinguishes it from sibling tools like create_custom_field, update_custom_field, and list_custom_fields. It is immediately obvious what action an agent would take with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to choose this tool instead of create_custom_field or update_custom_field, nor does it mention prerequisites such as how to obtain the field_id (e.g., via list_custom_fields). An agent must infer usage solely from the tool name and inline schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_email_listDelete Email ListADestructiveIdempotent
Delete an existing email list from your SendGrid account
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | ID of the email list to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the safety profile is known. The description adds only that the list must be existing but does not disclose side effects (e.g., whether associated contacts are affected) or failure behavior. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant wording. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter delete operation with annotations covering destructiveness and idempotence, the description and schema are largely sufficient for an agent to invoke it correctly. It could mention response/side-effect expectations, but the low complexity makes the omission non-critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage: list_id is described as 'ID of the email list to delete.' The description adds no further parameter meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific imperative verb ('Delete') and a concrete resource ('an existing email list from your SendGrid account'), so an agent immediately knows the operation. It is clearly distinct from sibling tools like create_email_list, update_email_list, or list_email_lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The imperative phrasing implies the obvious use case: delete a list. However, it gives no explicit when-not-to-use guidance or alternatives, such as distinguishing deleting the list from removing contacts via remove_contact_from_lists or deleting individual contacts with delete_contact. The context is clear but the exclusions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_segmentDelete SegmentBDestructiveIdempotent
Delete an existing segment
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | ID of the segment to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and idempotentHint=true, so the destructive nature is disclosed. The description adds no behavioral detail beyond restating 'Delete', such as whether deletion is permanent, cascading, or requires special permissions. It provides no value beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only five words and gets directly to the point with no filler or redundant phrases. It is appropriately minimal for a simple delete operation and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter deletion tool with destructiveHint and idempotentHint annotations, the description is mostly sufficient. It clearly identifies the operation and the required parameter, and no output schema is expected. It does not explain consequences or return behavior, but the annotations cover the critical safety aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter segment_id is fully described in the schema with 'ID of the segment to delete', which is clear. The tool description adds no additional parameter semantics. Since schema description coverage is 100%, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Delete) and the resource (an existing segment), making the tool's purpose immediately understandable. It distinguishes itself from sibling tools like update_segment or list_segments by naming the delete operation. However, it is very close to the tool name and title, adding only the qualifier 'existing'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: you use this tool when you need to remove an existing segment. There is no explicit guidance about when not to use it or mention of alternatives such as update_segment for modifying a segment. The context is clear enough for a simple delete operation, but no explicit routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_senderDelete Sender IdentityADestructiveIdempotent
Delete a verified sender identity
| Name | Required | Description | Default |
|---|---|---|---|
| sender_id | Yes | ID of the sender identity to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds the 'verified' qualifier, which clarifies the resource scope, but does not disclose irreversibility, permissions, or downstream effects. With annotations present, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler or redundant phrasing. Every word contributes to the meaning, and the key action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter deletion tool with destructive and idempotent annotations, the description covers the essential behavior. An output schema is not present, but for a delete action the return value is usually not critical. The only minor gap is lack of explicit usage guidance, but this is a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the sender_id parameter is already described as 'ID of the sender identity to delete'. The description adds no additional parameter-level meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and a concrete resource ('verified sender identity'), making the action unmistakable. It clearly distinguishes this tool from other delete_* siblings like delete_email_list or delete_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: use this when a verified sender identity needs to be removed. However, there is no explicit guidance about when not to use it or how it relates to create_sender or list_senders, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_templateDelete TemplateADestructiveIdempotent
Delete a template and all its versions
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | ID of the template to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and idempotent; the description adds specific behavioral context by disclosing the cascade effect: all versions are deleted along with the template. It does not mention irreversibility or permissions, but this is adequately covered by the destructive annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the verb and resource front-loaded, and every word adds meaningful information. There is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete operation with destructive and idempotent annotations already provided, this description is complete. It tells the agent what is deleted and the scope of deletion, and no output schema is expected for a delete operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and template_id is already described as 'ID of the template to delete'. The description adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('template') and adds the important scope detail 'and all its versions'. This clearly distinguishes it from the sibling delete_template_version, which targets only a single version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'and all its versions' gives clear context that this tool is for full template deletion, implying that version-specific deletion belongs elsewhere. However, it does not explicitly name the alternative or provide a when-not-to-use condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_template_versionDelete Template VersionADestructiveIdempotent
Delete a specific version of a template
| Name | Required | Description | Default |
|---|---|---|---|
| version_id | Yes | ID of the version to delete | |
| template_id | Yes | ID of the template |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the destructiveHint=true annotation and adds that only a specific version is affected, not the template itself. It does not add deeper behavioral context such as reversibility, permissions, or consequences for the parent template, but the annotations already cover destructive intent and idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. It front-loads the action and the specific resource, making it immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-string-parameter destructive operation, the description plus annotations and full schema coverage are largely sufficient. It lacks explicit guidance on alternatives, but the task is simple enough that an agent can invoke it confidently from the given information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters, template_id and version_id, already have clear schema descriptions. The tool description does not add any additional parameter meaning beyond what the schema already provides, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, ‘delete’, a clear resource, ‘a specific version of a template’, and distinguishes this from deleting the entire template. The sibling tool list includes delete_template, so the version-specific wording helps disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase ‘a specific version of a template’ clearly implies this tool is for version-scoped deletion, and the sibling list includes delete_template for the alternative. However, it does not explicitly state when not to use this tool or direct the agent to delete_template for whole-template deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_automationGet Automation DetailsARead-onlyIdempotent
Get detailed information about a specific automation including all steps and settings
| Name | Required | Description | Default |
|---|---|---|---|
| automation_id | Yes | The automation ID to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds that the response includes all steps and settings, but does not disclose return shape, missing-ID behavior, or other quirks. That is acceptable but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with verb and resource, with no redundant filler. The phrase 'including all steps and settings' earns its place by specifying output scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with one required parameter and safety annotations, the description plus schema covers the essentials: what to pass, that the operation is read-only, and what comes back. Missing not-found behavior and output format are minor gaps given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — automation_id is fully described as 'The automation ID to retrieve'. The description adds no parameter-level detail beyond this, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific read operation ('Get detailed information') on a specific resource ('a specific automation') and clarifies the scope ('including all steps and settings'). This distinguishes it from mutation siblings like update_automation_settings and from list_automations, though it doesn't explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an agent needs full details for one automation, but gives no explicit when/when-not guidance or alternative routing. It doesn't say to use list_automations when an ID is unknown, so some inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_category_statsGet Email Statistics by CategoryARead-onlyIdempotent
Retrieve email statistics for specific categories (available for previous 13 months only)
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| categories | Yes | Comma-separated list of categories to retrieve stats for | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as read-only, idempotent, and non-destructive, and the description adds the meaningful behavioral constraint that data is available only for the previous 13 months. It does not describe return shape or error behavior, but with annotations covering the safety profile, this is sufficient context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence with no redundant wording. The core action and resource are front-loaded, and the 13-month limitation is included as a brief, important caveat in parentheses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only stats tool with four well-documented parameters and safety annotations, the description captures the essential constraint an agent needs to know: the 13-month limit. No output schema exists, so return structure is not described, but the core invocation context is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so every parameter is already explained. The description adds only the high-level notion of 'specific categories' and the 13-month data availability, which is useful context but does not add parameter-level detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action ('Retrieve') and a specific resource ('email statistics for specific categories'), which distinguishes it from sibling tools like get_global_stats or get_stats_by_country. The title reinforces the same resource, so there is no ambiguity about what this tool operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for category-level email statistics and notes the 13-month availability window, but it does not explicitly state when to choose this instead of get_global_stats or get_stats_by_browser. There are no named alternatives or exclusions, so guidance is only inferable from the resource name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactGet Contact DetailsARead-onlyIdempotent
Get detailed information about a specific contact by ID
| Name | Required | Description | Default |
|---|---|---|---|
| contact_id | Yes | ID of the contact to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is established. The description adds little behavioral detail beyond 'detailed information' and does not mention edge cases, permissions, or return format, but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler. It front-loads the operation and the key selection criterion, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only get-by-ID tool with one required parameter and clear annotations, the description is nearly sufficient. It could be more complete by explicitly noting that list_contacts or search_contacts should be used for non-ID lookups, and by clarifying what 'detailed information' includes since there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so contact_id is already fully documented. The description's 'by ID' aligns with the parameter but adds no new constraints, formats, or relationship details, so it stays at the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource pair ('Get ... contact') and identifies the selector ('by ID'), which clearly distinguishes it from sibling list/search tools like list_contacts and search_contacts. The operation is unambiguous for an agent selecting a tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a specific contact by ID' clearly signals that this tool is for retrieving one known contact, not for listing or searching. It does not explicitly name alternatives or exclusion conditions, but the intended usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_global_statsGet Global Email StatisticsARead-onlyIdempotent
Retrieve global email statistics for your SendGrid account
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavior beyond 'Retrieve', such as response shape, aggregation semantics, or potential size of results. It does not contradict the annotations, but it also does not add meaningful behavioral context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single direct sentence with no filler. It front-loads the verb and resource, and every word contributes to the meaning. It is appropriately concise for a straightforward read-only statistics tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, the schema is complete, and annotations cover safety, so the description is minimally adequate for invoking the tool. However, there is no output schema and the description does not clarify what metrics are returned or how this relates to the many sibling statistics tools, leaving some ambiguity for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all three parameters, including formats, defaults, and the enum for aggregated_by. The description adds no parameter-level detail, but the schema already carries the full semantic burden, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and a clear resource ('global email statistics for your SendGrid account'). It distinguishes from sibling stats tools through the word 'global', implying account-wide scope as opposed to per-browser, per-country, per-category, or per-subuser stats, but it does not explicitly compare against those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'global email statistics' implies this tool is for account-wide aggregates rather than dimension-specific breakdowns, but the description never explicitly states when to use this tool versus siblings like get_stats_by_country, get_category_stats, or get_subuser_stats. Guidance is therefore implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scopesGet ScopesARead-onlyIdempotent
Get available permission scopes for API keys
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is clear. The description adds no behavioral detail beyond the resource being fetched, such as return format or ordering, but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler or repetition. The key information is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only lookup with strong annotations and no close sibling competitors, the description is sufficient for an agent to invoke it correctly. The absence of an output schema is not a significant gap here because the description names exactly what is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema description coverage is 100%, so there is nothing for the description to add. The default baseline of 4 applies because the schema fully handles the parameter surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Get) and resource (available permission scopes for API keys), making the tool's function immediately clear. It is also distinct from all sibling tools, none of which deal with permission scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied: retrieve the list of valid permission scopes for API keys. However, the description does not explicitly state when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_single_sendGet Single Send CampaignARead-onlyIdempotent
Get detailed content and settings for a single send campaign
| Name | Required | Description | Default |
|---|---|---|---|
| singlesend_id | Yes | The single send ID to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that the tool returns 'detailed content and settings' but does not disclose any additional behavioral traits such as error handling, field coverage, or potential edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no redundant words or filler. It front-loads the main action and resource without requiring extra reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one required parameter and helpful annotations, the description is nearly complete. The only minor gap is that it does not enumerate the returned 'content and settings' fields, and there is no output schema to provide that detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage and fully documents singlesend_id as 'The single send ID to retrieve.' The tool description adds no further parameter-level meaning, so the schema carries the semantic weight as expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('single send campaign'), and further clarifies the scope as 'detailed content and settings.' This clearly distinguishes it from sibling tools that handle templates, stats, contacts, or send operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving a specific single send campaign by ID, but it does not explicitly state when to use it over alternatives or mention any exclusions. Usage context is inferable but not articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_by_browserGet Email Statistics by BrowserARead-onlyIdempotent
Retrieve email statistics grouped by browser type. Only clicks and unique_clicks metrics are available.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return per page (SendGrid defaults to 500) | |
| offset | No | Number of results to skip for pagination | |
| browsers | No | Comma-separated list of browsers to filter by | |
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so no safety contradiction exists. The description adds meaningful behavioral context beyond annotations by explicitly stating that only clicks and unique_clicks metrics are available, which prevents the agent from expecting open or send metrics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no redundant filler. The primary action and grouping are front-loaded, and the critical metric limitation is stated immediately after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only stats retrieval tool, the description plus fully documented schema cover the essential information: what is returned, how to filter, how to paginate, and how to aggregate. It is slightly incomplete in not situating the tool among its sibling stats tools, but this is a minor gap given the schema richness and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all six parameters, including defaults, formats, and pagination semantics. The description does not add parameter-specific meaning, but it also does not need to because the schema already carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve'), a clear resource ('email statistics'), and the grouping dimension ('browser type'). This distinguishes it from sibling stats tools like get_stats_by_client_type and get_stats_by_country, and it also narrows the available metrics to clicks and unique_clicks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use when browser-level click statistics are needed, but it provides no explicit guidance about when to prefer this tool over the many sibling stats tools. It does not mention alternatives or exclusion criteria such as 'for device-level stats, use get_stats_by_device_type'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_by_client_typeGet Email Statistics by Client TypeARead-onlyIdempotent
Retrieve email statistics grouped by email client type (desktop, mobile, webmail). Only opens and unique_opens metrics are available. This endpoint does not support filtering or pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral constraints beyond those: only opens and unique_opens metrics are available, and filtering/pagination are unsupported. This helps set agent expectations without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. Each sentence adds distinct value: purpose, metric limitations, and endpoint limitations. It is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only stats endpoint, the description is mostly complete: it states the grouping, the available metrics, and the lack of filtering/pagination. Since there is no output schema, the metric detail partially compensates. It could be slightly richer by mentioning the response shape, but the core context is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are fully documented in the schema itself. The description does not add parameter-specific details beyond what the schema already provides, but it does give useful context about the overall endpoint behavior. Baseline 3 is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and resource ('email statistics grouped by email client type'), explicitly naming the grouping dimensions (desktop, mobile, webmail). It also clarifies which metrics are available, making the tool's purpose unambiguous and distinct from other stats-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: whenever email statistics are needed by client type. It also provides useful exclusions by stating that filtering and pagination are not supported. However, it does not explicitly name alternative sibling tools or spell out when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_by_countryGet Email Statistics by CountryARead-onlyIdempotent
Retrieve email statistics grouped by country. Only clicks, unique_clicks, opens, and unique_opens metrics are available. Filtering is by country only (no state/province filter exists).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return per page (SendGrid defaults to 500) | |
| offset | No | Number of results to skip for pagination | |
| country | No | ISO 3166-1 alpha-2 country code to filter by | |
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral constraints beyond annotations: the restricted metric set and the absence of a state/province filter. This helps the agent set expectations, though it stops short of describing the exact response shape or pagination behavior, which is acceptable given the schema covers the parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundant words. The primary action and grouping dimension are front-loaded, followed by a compact statement of metric availability and filtering constraints. Every sentence contributes value and the description is appropriately sized for a read-only stats tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with no output schema, the description covers the essential aspects: purpose, grouping level, supported metrics, and filtering limitation. It does not spell out response structure or pagination defaults, but those are either implied by the grouping description or documented in the schema. The core usage context is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds minimal parameter-specific meaning: it confirms the country filter exists and implies date-range grouping, but it does not elaborate on formats, defaults, or how limit/offset interact with the grouping. The schema already carries the heavy lifting for parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Retrieve email statistics grouped by country.' It clarifies that only four metrics are available, immediately distinguishing it from sibling stats tools by its grouping dimension. The second sentence reinforces scope with a clear exclusion ('no state/province filter exists'), leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by stating the grouping is by country and explicitly naming which metrics are available. It also warns that filtering is only by country, which implies the tool is unsuitable for sub-national breakdowns. While it does not name alternative tools or give explicit when-to-use guidance, the context is sufficient for an agent to select it over sibling stats tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_by_device_typeGet Email Statistics by Device TypeARead-onlyIdempotent
Retrieve email statistics grouped by device type (desktop, mobile, tablet). Only opens and unique_opens metrics are available.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return per page (SendGrid defaults to 500) | |
| offset | No | Number of results to skip for pagination | |
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotent, and non-destructive behavior, so the description only needs to add context. It adds the meaningful limitation that only opens and unique_opens metrics are available, but does not go into pagination, date-range handling, or response characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence that front-loads the core purpose and then adds the critical metric restriction. No filler or redundant restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that all parameters are fully described in the schema and annotations cover read-only/idempotent behavior, the description covers the key missing piece: which metrics are available. There is no output schema, so the return structure is not described, but the tool is simple enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; every parameter (limit, offset, end_date, start_date, aggregated_by) has its meaning documented in the schema. The description does not add parameter-level detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Retrieve email statistics'), the grouping resource ('by device type'), and the exact dimension (desktop, mobile, tablet). It also names the available metrics, which clearly sets it apart from sibling stats tools grouped by browser, country, or mailbox provider.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use this tool when you need email stats segmented by device type. The 'Only opens and unique_opens metrics are available' sentence gives an implicit exclusion, warning the agent away if other metrics are needed, though it does not explicitly name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_by_mailbox_providerGet Email Statistics by Mailbox ProviderARead-onlyIdempotent
Retrieve email statistics grouped by mailbox provider (Gmail, Outlook, Yahoo, etc.). Broadest metric set of all stats breakdowns: blocks, bounces, clicks, deferred, delivered, drops, opens, processed, requests, spam_reports, unique_clicks, unique_opens. Note: no unsubscribes metric.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return per page (SendGrid defaults to 500) | |
| offset | No | Number of results to skip for pagination | |
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
| mailbox_providers | No | Comma-separated list of mailbox providers to filter by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context by enumerating the returned metrics and noting the absence of unsubscribes, but does not discuss pagination or response structure beyond what the schema implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the core function, the second lists the full metric scope, and the third flags a meaningful omission. Every sentence earns its place and the key purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only stats retrieval with fully documented parameters and clear annotations, the description covers what an agent needs to select and invoke the tool. The lack of an output schema is mitigated by the explicit metric list, though slightly more guidance on when this tool is preferred over sibling stats tools would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already fully documented. The description adds context about the grouping and metric set but does not explain any parameter semantics beyond what the input schema provides, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and a clear resource ('email statistics grouped by mailbox provider') with concrete examples. It also differentiates itself from sibling stats tools by being the 'Broadest metric set of all stats breakdowns' and explicitly listing supported metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the grouping dimension explicit and signals when this tool is appropriate through 'Broadest metric set of all stats breakdowns.' It does not explicitly name alternatives or state when not to use it, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_overviewGet Statistics OverviewBRead-onlyIdempotent
Get a comprehensive overview of email statistics across multiple dimensions
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
| include_subusers | No | Include subuser statistics in the overview |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only a vague 'across multiple dimensions' scope and does not disclose any further behavioral traits such as aggregation behavior, time filtering, or response size; still, it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. It is concise, though somewhat generic and under-specified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description does not explain what 'multiple dimensions' actually includes or what the returned overview looks like. Given the large set of sibling stats tools, this definition is too thin to let an agent confidently decide whether to call this tool or a more specific stats-by-dimension tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so start_date, end_date, aggregated_by, and include_subusers are already documented in the input schema. The description adds no parameter-level meaning, which keeps this at the baseline rather than higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a clear verb ('get') and resource ('email statistics overview') and adds the qualifier 'across multiple dimensions,' which gives a reasonable sense of what the tool does. However, it does not name or contrast any sibling tools, so an agent cannot easily distinguish it from get_global_stats or get_stats_by_* variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'comprehensive overview ... across multiple dimensions' implies this tool is for broad, multi-dimensional email statistics rather than a single-dimension breakdown. But there is no explicit when-to-use/when-not-to-use guidance, no named alternatives, and no indication of how this tool differs from the many other stats tools in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subuser_statsGet Email Statistics by SubuserBRead-onlyIdempotent
Retrieve email statistics for specific subusers
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date in YYYY-MM-DD format (defaults to today) | |
| subusers | Yes | Comma-separated list of subuser names to retrieve stats for | |
| start_date | Yes | Start date in YYYY-MM-DD format | |
| aggregated_by | No | How to group the statistics | day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no further behavioral context, such as response shape, pagination, or what happens without data, but it also does not contradict the annotations. That makes a 3 appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It clearly states the verb and target, and every word earns its place relative to the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining what 'email statistics' actually returns. It does not mention metrics, grouping behavior, or date-range implications, leaving an agent to guess whether the response contains counts, rates, or a time series. The schema covers parameters, but the output semantics are underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific detail beyond the schema; 'specific subusers' aligns with the subusers parameter but adds no new meaning to start_date, end_date, or aggregated_by.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and resource ('email statistics'), and the qualifier 'specific subusers' distinguishes it from siblings like get_global_stats and the get_stats_by_* breakdown tools. Even the title reinforces the subuser dimension, making the tool's function immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to choose this tool over the many sibling stats tools (e.g., get_global_stats, get_stats_by_country, get_stats_overview). It does not explain that this is the appropriate choice when the user wants per-subuser filtering, nor does it mention any exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateGet Template DetailsARead-onlyIdempotent
Retrieve details of a specific template including all versions
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | ID of the template to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds behavioral context by specifying that all versions are included, which goes beyond the annotations. It does not mention auth or rate limits, but for a simple read operation the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise, grammatically complete sentence with no filler. The key action and the distinctive 'including all versions' scope are front-loaded, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only retrieval with no output schema, the description provides sufficient information to invoke the tool correctly: it identifies the resource, the parameter scope, and the return coverage. It does not detail the exact response structure, but this is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter template_id is clearly described as the ID of the template to retrieve. The tool description adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve'), a clear resource ('details of a specific template'), and a distinguishing scope ('including all versions'). This differentiates it from the sibling get_template_version, which targets a single version, and from list_templates, which lists templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving a single template with all versions, but it does not explicitly state when to use it over get_template_version or list_templates. There are no exclusions or alternative routing signals, leaving the decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_template_versionGet Template VersionBRead-onlyIdempotent
Retrieve details of a specific template version
| Name | Required | Description | Default |
|---|---|---|---|
| version_id | Yes | ID of the version to retrieve | |
| template_id | Yes | ID of the template |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint: true, idempotentHint: true, and destructiveHint: false, and the description only restates the retrieval nature without adding behavioral context. It does not mention return format, possible errors, or any side effects, though it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. It is front-loaded with the core action and object, but it is slightly too terse to also provide usage differentiation or behavioral detail, so it does not earn a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only retrieval tool with two clearly documented parameters and strong annotations, so the description does not need much more. However, it lacks any mention of what 'details' include, and it does not clarify how this relates to similar template tools, leaving some context gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters have clear descriptions: 'ID of the version to retrieve' and 'ID of the template'. The tool description adds little beyond the schema, but the baseline of 3 is appropriate because the schema already fully documents the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and a specific resource ('details of a specific template version'), clearly distinguishing this from sibling tools like get_template, update_template_version, and delete_template_version. The inclusion of the word 'version' removes ambiguity about which object is being fetched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as get_template or list_templates. It does not state prerequisites, exclusions, or conditions that would help an agent choose this tool over a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_automationsList Marketing AutomationsBRead-onlyIdempotent
List all marketing automations
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results to return | |
| offset | No | Pagination offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe, non-mutating nature is established. The description adds only the 'all' scope and does not contradict annotations; however, it does not disclose pagination behavior or whether inactive/draft automations are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word earns its place, and the tool's core purpose is immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list with no required parameters, the description is near-sufficient, and the schema covers pagination parameters. However, the 'all' claim is not reconciled with default pagination, and without an output schema the description does not mention what fields or resource types are returned beyond 'automations'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both limit and offset already have descriptions ('Number of results to return', 'Pagination offset'). The tool description contributes no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List all marketing automations' clearly identifies the verb (list), resource (marketing automations), and scope (all). It is unambiguous versus sibling tools like get_automation, update_automation_settings, and list_single_sends, though it does not explicitly name any alternative or exclusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to choose this tool versus alternatives such as get_automation, list_single_sends, or open_automation_editor. The description simply states the action and never addresses selecting between list tools or retrieving a single automation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsList All ContactsARead-onlyIdempotent
List up to 50 of your most recently uploaded/updated contacts, sorted by email address. This endpoint takes no parameters — SendGrid deprecated pagination here; use search_contacts or export for anything beyond a quick sample.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnly, idempotent, and non-destructive behavior; the description adds the 50-contact cap, recency selection, sort order, and deprecation of pagination. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the core behavior front-loaded and the limitation/alternative in the second sentence. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list tool with no output schema, the description gives the essential usage constraints and routes to alternatives. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With an empty input schema, the baseline is 4, and the description goes further by stating the endpoint truly takes no parameters and explaining why (SendGrid deprecated pagination). This prevents an agent from looking for hidden pagination/query parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('contacts') with precise constraints: up to 50, most recently uploaded/updated, sorted by email address. This distinguishes it from siblings like list_email_lists, list_segments, and search_contacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicity says the endpoint takes no parameters and that SendGrid deprecated pagination, and directs the agent to use search_contacts or export for anything beyond a quick sample. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_custom_fieldsList Custom FieldsBRead-onlyIdempotent
List all custom fields
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds no behavioral context beyond that. It does not mention pagination, ordering, authentication requirements, or return shape, so it provides no value beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler or repetition. It is concise, but it is also slightly under-specified, so it does not reach the highest bar.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter read-only tool, the description is minimally adequate, but with no output schema and no behavioral details it leaves gaps around return structure and usage context. It does not fully equip an agent to understand what a successful response will contain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage, so the description does not need to explain any parameter behavior. The baseline of 4 applies because there is nothing for the schema or description to elaborate on.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List') and a specific resource ('custom fields'), making it clear what the tool does. It differentiates from the create/update/delete_custom_field siblings by the explicit read-focused verb, though it does not add scope or output details that would earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as create_custom_field, update_custom_field, or other list_* tools. The intended use is only implied by the name and description, with no exclusions, prerequisites, or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_email_listsList Email ListsARead-onlyIdempotent
List all email lists
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of results to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds the scope 'all' but does not disclose pagination behavior or the effect of page_size, which is relevant for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler or redundancy. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, safely annotated list tool, the description is mostly sufficient to invoke correctly. It is slightly incomplete because it does not reconcile 'all' with the page_size pagination parameter or clarify what fields the returned email lists contain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the only parameter 'page_size', which includes a default and a clear description. The tool description adds no parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact verb and resource: 'List' + 'all email lists'. This clearly distinguishes it from sibling tools that list segments, contacts, templates, senders, or automations, and from create/update/delete_email_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the command itself: use it when you need to list email lists. However, it provides no explicit when-not guidance or comparison to alternatives like list_segments or list_contacts, so the agent receives no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_segmentsList SegmentsARead-onlyIdempotent
List all segments with their parent list relationships
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds that the tool returns all segments and includes parent-list relationship data, which is useful, but it does not mention pagination, ordering, or response structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no wasted words. It front-loads the core action and includes the key differentiator about parent list relationships.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list operation with annotations covering safety, this description is nearly complete. It explains what is returned, though it could be more explicit about the output representation of segment and list relationships.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters and the schema is empty, so the schema fully describes invocation needs. With no parameters to document, a baseline of 4 is appropriate and no additional description is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List all segments' and adds a meaningful qualifier 'with their parent list relationships.' This distinguishes it from sibling tools like list_email_lists and segment mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is clear: when an agent needs all segments and their list relationships, this tool is the choice. It does not explicitly mention alternatives or when-not-to-use, but the singular purpose and simple scope make the usage context obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sendersList SendersARead-onlyIdempotent
List all verified senders
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation as read-only, idempotent, and non-destructive. The description adds behavioral nuance by specifying 'verified' senders and 'all', indicating that unverified senders are not returned and that the listing is comprehensive. This goes beyond annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler: 'List all verified senders'. It front-loads the verb and object and every word adds meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool, the description plus annotations are sufficient. The 'verified' scope is important and captured. The absence of an output schema is acceptable since 'list' implies a collection result, and no safety caveats are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100% by definition and no parameter documentation is needed. Per the baseline for zero-parameter tools, this is fully adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('list') and a clearly scoped resource ('verified senders'), making the tool's function unambiguous. It distinguishes itself from sibling tools like create_sender and delete_sender, and from other list_* tools which target different resources (email_lists, segments, contacts, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: whenever an agent needs to enumerate verified senders. While it doesn't explicitly name alternatives or exclusions, no sibling tool overlaps with listing senders, so the route is clear without explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_single_sendsList Single Send CampaignsARead-onlyIdempotent
List all single send campaigns
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of results to return | |
| page_token | No | Pagination token from a previous response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no additional behavioral context such as pagination behavior, ordering, or how 'all' relates to page_size/page_token, leaving the agent to infer these details from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no filler. Every word contributes to the meaning, and the key scope word 'all' is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple list operation with two optional, well-documented parameters and safe annotations, so the description is mostly adequate. However, there is no output schema and the description does not mention that results are paginated or describe the response shape, leaving minor but real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with page_size and page_token already documented in the input schema. The description adds no param-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a specific resource ('all single send campaigns'), which clearly distinguishes it from singular or creator/stats siblings like get_single_send, open_single_send_creator, and open_single_send_stats. An agent can understand exactly what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's purpose is clear, and 'list all' implies it should be used when a collection of single send campaigns is needed rather than a single campaign. However, there is no explicit guidance about when to prefer this tool over alternatives such as get_single_send, and no exclusions or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList All TemplatesARead-onlyIdempotent
Retrieve all transactional templates (legacy and dynamic)
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of templates to return (max 200) | |
| generations | No | Filter by template generation (legacy or dynamic) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds that the listing spans both legacy and dynamic generations, but it doesn't disclose pagination behavior or response structure; it also repeats the schema's generation filter values rather than adding new behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and object and contains no filler. It is an appropriately sized definition for a simple list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only list tool with fully documented optional parameters and safety annotations, the description is sufficient for an agent to select and invoke it. It could mention pagination defaults or the return payload, but those are either implicit in list tools or covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema already documents page_size and generations. The description doesn't add new parameter details; it merely echoes the 'legacy and dynamic' values that the generations schema description already lists, so it meets the baseline but adds no extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the verb 'Retrieve' and names the resource 'all transactional templates', explicitly scoping to 'legacy and dynamic' generations. This clearly distinguishes it from single-resource siblings like get_template and from mutation tools like create/update/delete_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool's use—call it to list transactional templates—but offers no explicit guidance about when to prefer it over get_template for a specific template or open_template_editor for editing. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_automation_creatorOpen Automation CreatorARead-onlyIdempotent
Open SendGrid automation creator in browser
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safe, non-mutating behavior is covered. The description adds that the action opens a browser UI, which is useful context but does not go beyond that. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at seven words, front-loads the action, and has no redundant filler. Every word contributes to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless UI-launching tool, the description is complete. It identifies what to open and the medium (browser), and no return value or additional options are relevant. An agent can correctly invoke this tool based on the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is fully coverage with no parameter semantics to explain. The description does not need to add parameter details; the baseline of 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (Open), a specific resource (SendGrid automation creator), and the context (in browser). It is clearly distinguishable from siblings like open_single_send_creator and open_automation_editor because it names 'automation creator' explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as open_automation_editor or open_single_send_creator. The description is self-evident about what it does but leaves the choice of tool to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_automation_editorOpen Automation EditorBRead-onlyIdempotent
Open automation editor for a specific automation
| Name | Required | Description | Default |
|---|---|---|---|
| automation_id | Yes | The automation ID to edit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this operation is safe and non-mutating. The description adds little behavioral context beyond the word 'Open', but it does not contradict the annotations. Given the annotations carry most of the safety information, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word earns its place, and the key constraint ('specific automation') appears immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with strong annotations and full schema coverage, this description is mostly sufficient. The main missing piece is what 'open' actually produces (e.g., a URL, a UI navigation) and explicit sibling differentiation, but these are not critical for invoking the tool with the required automation_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so automation_id is already documented in the input schema. The description's 'for a specific automation' aligns with the parameter but does not add format, source, or usage details beyond what the schema provides. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Open') and resource ('automation editor') and adds 'for a specific automation', which indicates it targets an existing automation rather than creating a new one. It does not explicitly name sibling tools like open_automation_creator, but the 'specific automation' wording is enough to make the basic purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as open_automation_creator or update_automation_settings. The phrase 'for a specific automation' only implies that the automation already exists, but the description never states when this tool should be chosen instead of a related sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_csv_uploaderOpen CSV UploaderARead-onlyIdempotent
Open SendGrid CSV contact upload page in browser
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and destructiveHint=false, so the description does not need to repeat those. The phrase 'in browser' adds a useful behavioral detail beyond the annotations, but the description does not mention potential side effects like requiring an existing browser session, authentication, or whether a new tab is opened.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of seven words, with every word carrying meaning: action ('Open'), context ('SendGrid'), resource ('CSV contact upload page'), and execution environment ('in browser'). It is fully front-loaded and free of redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool with annotations covering safety, the description conveys the essential action and target, making it complete enough to invoke. It stops short of a 5 because it does not explain the workflow context or when to choose this over other open_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline is 4. The description correctly omits parameter details because there are none; there is nothing to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific action ('Open') and a unique resource ('SendGrid CSV contact upload page in browser'). This resource is distinct from sibling open_* tools like open_automation_editor or open_single_send_creator, so an agent can tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as open_segment_creator or open_template_editor. The description states only what the tool does, leaving the agent to infer its use case from the page name; no explicit exclusions, prerequisites, or alternative routing are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_segment_creatorOpen Segment CreatorARead-onlyIdempotent
Open SendGrid segment creator in browser
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds the 'in browser' context, which clarifies that the action opens a UI rather than performing a direct API mutation, but it does not disclose further behavioral details such as navigation side effects or environment requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. It front-loads the verb and resource, making the tool's purpose immediately apparent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool that simply opens a browser UI, the description is complete. The annotations cover safety and side-effect characteristics, and no return value is expected. There are no gaps that would prevent an agent from invoking this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100%, so there is nothing for the description to add. With no parameters, the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Open') and resource ('SendGrid segment creator') and clarifies the medium (in browser). It is easily distinguished from sibling tools like open_automation_editor or open_single_send_creator because the resource is explicitly named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: invoke when the agent needs to launch the segment creation UI in a browser. However, it does not explicitly state when to prefer this over alternative tools such as list_segments or update_segment, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_single_send_creatorOpen Single Send CreatorARead-onlyIdempotent
Open SendGrid single send creator in browser
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive. The description adds only that the action happens in the browser, which is mildly useful context but does not substantially expand on the behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. Every word contributes to identifying the tool's purpose and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter navigation tool with annotations covering safety and no output schema, this description is complete enough for an agent to invoke it correctly. No additional parameter or return-value documentation is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description has little to add over the input schema. The baseline for a zero-parameter tool is 4, and the description adequately reflects that no inputs are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('open') and resource ('SendGrid single send creator'), and specifies that the action happens 'in browser'. This makes it clearly distinguishable from sibling tools like open_automation_creator and list_single_sends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when a user wants to open the Single Send creation UI, but it does not explicitly mention when to prefer this over alternatives such as list_single_sends or get_single_send. No exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_single_send_statsOpen Single Send StatsBRead-onlyIdempotent
Open single send stats page for a specific campaign
| Name | Required | Description | Default |
|---|---|---|---|
| singlesend_id | Yes | The single send ID to view stats for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds a meaningful behavioral clue that this opens a UI page rather than returning data, which is useful for distinguishing it from data-fetching siblings. It does not mention browser-session requirements or what the caller receives, but annotations carry most of the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler and front-loads the action and resource. It loses a point because the trailing phrase 'for a specific campaign' is somewhat redundant with the parameter and could have been more precise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter navigation tool with rich annotations and full schema coverage, the description is minimally adequate. It does not explain what the agent should expect after invoking it—such as a URL, success flag, or browser navigation—which would improve completeness given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents singlesend_id with a clear description, so the baseline is 3. The description adds no additional meaning about the ID format, where to find it, or expected values, and 'specific campaign' is slightly misaligned with the parameter's 'single send' terminology.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Open') and the resource ('single send stats page'), which distinguishes it from sibling open_* tools like open_single_send_creator and open_automation_editor. The phrase 'for a specific campaign' is slightly imprecise compared to the parameter name singlesend_id but does not obscure the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys an implied usage: when you need to open the stats page for a particular single send. However, it does not explicitly state when not to use it or mention alternatives such as get_single_send or get_global_stats, leaving usage guidance largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_template_editorOpen Template EditorARead-onlyIdempotent
Open the SendGrid template editor in browser for visual editing
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | No | Template ID to open (opens template list if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that this tool launches a browser UI, a behavioral trait not captured by the annotations or schema. Annotations already establish read-only and idempotent behavior, and the description adds context about the external user-facing action without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. Each phrase—SendGrid, template editor, browser, visual editing—adds necessary meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, no output schema, and comprehensive annotations, the description plus schema fully cover what an agent needs to invoke it correctly. The safety profile is in annotations, and the parameter behavior is in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage of the only parameter, template_id, including its default behavior of opening the template list if omitted. The tool description adds no additional parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Open'), a precise resource ('SendGrid template editor'), and the purpose ('for visual editing'). This clearly distinguishes it from siblings like open_automation_editor or programmatic template tools such as update_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for visual editing' provides a clear context for when to use this tool versus programmatic alternatives, implying it is the choice for interactive browser-based template editing. It does not explicitly name alternatives or exclusion conditions, but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_contact_from_listsRemove Contacts from a Specific ListAIdempotent
Remove contacts from a specific email list
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | ID of the list to remove contacts from | |
| contact_ids | Yes | Array of contact IDs to remove from the list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is a mutating (readOnlyHint=false), idempotent operation that is not destructive to underlying data (destructiveHint=false). The description adds only that it removes contacts from a specific list, which aligns with the annotations. It does not add extra behavioral context such as whether already-removed contacts are ignored, but the idempotentHint covers part of that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundant restatement. Every word contributes to identifying the action, target, and scope, making it highly scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter operation with full schema coverage, no output schema, and relevant annotations for idempotency and non-destructiveness, the description is largely complete. It could explicitly state that the contacts themselves are not deleted, but the phrase 'remove contacts from a specific email list' makes that distinction reasonably clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the schema already documents list_id as the target list and contact_ids as the array of contact IDs to remove. The tool description adds no additional parameter-level meaning beyond the phrase 'specific email list', so the schema carries the burden and the description meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Remove'), a specific object ('contacts'), and the scope ('from a specific email list'). This clearly distinguishes the tool from sibling tools like delete_contact, create_contact_with_lists, and list_contacts, so an agent can understand what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to choose this tool over alternatives such as delete_contact, update_contact, or create_contact_with_lists. It does not state exclusions, prerequisites, or the relationship to sibling contact/list tools, so the agent is left to infer the appropriate usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsSearch ContactsARead-onlyIdempotent
Search for contacts using query conditions without creating a segment. Only the first 50 matching contacts are returned — this endpoint does not support pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query using segment conditions (e.g., 'email LIKE "@example.com"') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that the operation is read-only, idempotent, and non-destructive. The description adds meaningful behavioral context beyond those annotations: it does not create a segment, only returns the first 50 matches, and has no pagination. This is valuable for agents deciding whether partial results are acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no redundancy. The core purpose is front-loaded, the side-effect boundary ('without creating a segment') is explicit, and the critical result limit is stated last without sacrificing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only search tool, the description covers the operation, the query condition requirement, the no-segment side effect, and the result cap. No output schema exists, but the description still communicates that matching contacts are returned, which is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the sole parameter is 100%, so the schema already fully documents 'query' with an example. The description's 'query conditions' phrasing is consistent with, but does not add meaningful detail beyond, the parameter schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action ('Search for contacts'), a specific resource ('contacts'), and a defining constraint ('using query conditions without creating a segment'). This clearly differentiates it from segment-creation workflows and from other contact-retrieval tools by emphasizing query-condition matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need ad-hoc contact search via query conditions and do not want to create a segment. It also provides an important limits-related caveat (first 50 results, no pagination). However, it does not explicitly name alternatives such as search_contacts_by_emails or list_contacts, nor does it state when those should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contacts_by_emailsSearch Contacts by Email AddressesARead-onlyIdempotent
Search for specific contacts by their email addresses
| Name | Required | Description | Default |
|---|---|---|---|
| emails | Yes | Array of email addresses to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds some scoping context by indicating the search is based on email addresses, but it does not disclose matching semantics, result shape, or limits. This is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundancy. It efficiently conveys the action, resource, and search criterion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one required parameter, a complete schema, and safety annotations, the description is largely sufficient for an agent to select and invoke the tool. It could briefly mention the return format or no-match behavior, but the purpose implies that matching contacts are returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the single 'emails' parameter, including format and pattern constraints. The description adds no additional meaning beyond what the schema already states, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and resource ('contacts'), and narrows the operation by email addresses, distinguishing it from generic sibling tools like search_contacts and list_contacts. The title and description together unambiguously state what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by their email addresses' implies this tool is appropriate for exact-email lookup rather than broad contact listing or searching. However, no explicit when-to-use guidance or alternatives are mentioned, so an agent must infer the usage context from the tool name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_mailSend MailCDestructive
Send an email using SendGrid Mail Send API
| Name | Required | Description | Default |
|---|---|---|---|
| from | Yes | ||
| content | Yes | Email content | |
| subject | No | Default subject if not set in personalizations | |
| reply_to | No | ||
| personalizations | Yes | Personalization settings for recipients |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as non-read-only, non-idempotent, and destructive, so the side-effect profile is partially known. The description adds the context that this goes through the SendGrid Mail Send API, which signals an external delivery side effect, but it does not disclose consequences like immediate delivery, reversibility, or provider limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no filler, clearly naming the action and API. It is concise and front-loaded, though it sacrifices useful context for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a side-effecting tool with five parameters, three required, nested objects, and no output schema, but the description is only one sentence. It omits key information such as required fields (personalizations, from, content), how to structure recipients, and what the call returns or whether it is synchronous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter-level meaning beyond the schema. With schema description coverage at 60%, some fields are documented in the schema, but the description does not compensate for the uncovered required fields or clarify the nested personalizations, from, content, and cc/bcc structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Send') and resource ('an email') and names the underlying SendGrid Mail Send API, so an agent can tell this is a direct email-sending tool. It does not explicitly differentiate from sibling email-related tools, but none of the siblings appears to perform a raw mail send, so confusion risk is low.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use send_mail versus the many sibling tools such as create_sender, open_single_send_creator, or the email list and template tools. The intended usage is only implied by the verb 'Send an email'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_automation_settingsUpdate Automation SettingsAIdempotent
Update automation-level settings such as name, status, and title. Use this to activate/pause entire automations or rename them.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New title/name for the automation | |
| status | No | Set the automation status to 'active' or 'paused' | |
| automation_id | Yes | The automation ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the operation is a non-read-only, idempotent, non-destructive write. The description adds that status changes activate/pause the entire automation, a meaningful behavioral consequence beyond what the schema enum alone conveys. No contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that front-load the action and fields. Some redundancy exists between the first and second sentence, but no extraneous detail is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter update tool with no output schema, the description covers the main usage intent and state-change semantics. It omits return-value or prerequisite details, but the tool's simplicity and full schema coverage keep this gap minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters, making the baseline a 3. The description adds modest semantic context by equating 'status' with activating/pausing, but it does not clarify parameter formats or the relationship between 'name' and 'title'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear action ('update') and resource ('automation-level settings'), and enumerates the exact fields (name, status, title). It distinguishes itself from the sibling update_automation_step by targeting the entire automation rather than an individual step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Use this to activate/pause entire automations or rename them' gives concrete scenarios for when to call this tool. It does not explicitly list alternatives or exclusion conditions, but the automation-level framing makes the intended context clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_automation_stepUpdate Automation StepBIdempotent
Update individual step settings within an automation, including step status (activate/pause), wait time, and send configurations
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | Yes | The step ID within the automation to update | |
| wait_time | No | Wait time in minutes before executing this step | |
| step_status | No | Set the step status to 'active' or 'paused' | |
| automation_id | Yes | The automation ID containing the step |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-destructive, idempotent operation, so the description does not need to restate those traits. It adds little behavioral detail beyond listing fields, and it does not explain the effects of pausing a step or changing wait time, but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler, making it easy to scan. It loses a point because the unsupported 'send configurations' clause is misleading and does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 4-parameter tool with two required fields and an enum, the core calling information is largely present. However, the description omits return-value guidance (no output schema) and introduces an unsupported 'send configurations' capability, leaving a small but real ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description actively confuses parameter semantics by claiming 'send configurations' can be updated while the schema exposes only step_id, automation_id, wait_time, and step_status. It adds no meaningful parameter information beyond what the schema already provides clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb ('Update'), the resource ('individual step settings within an automation'), and distinguishes it from siblings like update_automation_settings. The phrase 'send configurations' is vague and unsupported by the schema, which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The wording 'within an automation' and 'individual step settings' establishes clear context for when this tool is appropriate, especially among automation-related siblings. It does not explicitly name alternatives or state exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contactUpdate ContactBIdempotent
Update existing contact information
| Name | Required | Description | Default |
|---|---|---|---|
| contacts | Yes | Array of contact objects with updates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that the operation is mutating, idempotent, and non-destructive, so the description carries less burden. The description adds only the 'existing' scoping constraint and does not explain partial-update semantics, custom_fields merging, or behavior for unknown contact IDs, leaving room for improvement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. The qualifier 'existing' appears early and the sentence is easy to parse, though 'information' is somewhat generic and could be replaced with more specific wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple update tool, the schema and annotations cover the required id, optional fields, idempotency, and non-destructive nature. However, without an output schema, the description still omits important context such as whether omitted fields are preserved, how multiple contacts in the array behave, and what happens when an id does not exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema thoroughly documents the required id and all optional contact fields. The description adds no field-level meaning beyond the generic 'contact information', so it meets the baseline but does not enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Update') and resource ('contact'), and the qualifier 'existing' distinguishes it from create_contact and delete_contact among the siblings. It is slightly less precise than the schema's array-of-contacts capability, but the primary purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'existing' implies this tool is for modifying contacts that already exist rather than creating new ones, giving some usage direction. It does not explicitly name alternatives or state when to prefer this over related contact read/list tools, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_custom_fieldUpdate Custom FieldAIdempotent
Update an existing custom field definition
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name for the custom field | |
| field_id | Yes | ID of the custom field to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds only the 'existing' target constraint and does not disclose additional behavioral details such as error behavior or effects on field values, which is acceptable but not enriching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence with no filler. The operation and target are front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with only two required parameters, no nested objects, and no output schema, the description plus annotations and schema cover the essential call information. Missing return-value or error expectations are minor gaps for this simple idempotent update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so field_id and name are already fully documented in the input schema. The description adds no parameter-specific meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Update') and a specific resource ('an existing custom field definition'). The word 'existing' clearly distinguishes this from create_custom_field and delete_custom_field, making the tool's purpose immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the word 'existing', which suggests this tool is for fields that have already been created. There is no explicit guidance about when to choose this over create_custom_field or delete_custom_field, and no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_email_listUpdate Email ListAIdempotent
Update the properties of an existing email list
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name for the email list | |
| list_id | Yes | ID of the email list to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is mutating (readOnlyHint=false) but idempotent and non-destructive. The description adds no further behavioral detail like return behavior or side effects, but it also does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It efficiently states the operation and target resource, and every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: two required parameters, full schema coverage, no nested objects, and safety-related annotations are present. The description is sufficient for basic invocation, though it could be slightly more specific about the 'name' property and sibling tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% description coverage for both parameters ('list_id' and 'name'). The description adds no parameter-specific meaning, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, 'Update,' and clearly targets the 'email list' resource. The word 'existing' differentiates it from create/delete siblings, though 'properties' is vague given the schema only contains a 'name' parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when an existing email list needs modification, which distinguishes it from create/delete/list tools by inference. However, it never explicitly names alternatives or states when this tool should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_segmentUpdate SegmentAIdempotent
Update an existing segment's name or query criteria
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the segment | |
| query_dsl | No | New query criteria for the segment (JSON string) | |
| segment_id | Yes | ID of the segment to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate read/write behavior (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds no additional behavioral detail such as validation of query_dsl, behavior on unknown segment_id, or whether both fields may be updated together. No contradiction, but no extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler; every word adds meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter update with supportive annotations, this is mostly adequate, but the 'or' ambiguity and absence of expected result/error behavior leave some gaps. It is enough to choose the tool, less enough to fully predict invocation outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with meaningful descriptions, so the baseline is 3. The description's 'name or query criteria' loosely maps to the name and query_dsl fields but doesn't clarify whether both can be sent in one call or whether at least one is required beyond segment_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update'), resource ('existing segment'), and the two mutable aspects (name, query criteria). This clearly distinguishes it from list_segments, open_segment_creator, and delete_segment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'existing' implies it is for modifying segments that already exist, which is an implied contrast with creation tools like open_segment_creator, but no explicit when-to-use or when-not-to-use guidance or sibling alternatives is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_templateUpdate TemplateBIdempotent
Update the name of an existing template
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name for the template | |
| template_id | Yes | ID of the template to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that the operation is not read-only, is idempotent, and is not destructive. The description adds no behavioral detail beyond that—it does not mention side effects, error conditions (e.g., missing template), permissions, or any other runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, direct sentence with no filler or redundant wording. It front-loads the key information and does not waste tokens.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 required parameters, no nested objects), and the schema plus annotations cover the operation's safety and idempotency profile. However, the description does not address return values or error behavior and lacks usage alternatives, so it is not fully complete—though it is adequate for the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully documented in the input schema with clear descriptions ('New name for the template', 'ID of the template to update'), so schema coverage is 100%. The description's phrase 'Update the name' aligns with the name parameter but adds no new semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Update'), a precise resource ('existing template'), and the exact property being changed ('name'). This clearly distinguishes it from sibling tools like update_template_version or create_template, which handle different resources or operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to choose this tool over alternatives such as create_template, delete_template, or update_template_version. It does not mention exclusions, prerequisites, or use-case contexts, leaving the agent to infer solely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_template_versionUpdate Template VersionBIdempotent
Update the content and settings of a template version
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for this version | |
| active | No | Set as active version (1 = active, 0 = inactive) | |
| subject | No | Email subject line (supports Handlebars) | |
| test_data | No | JSON string of test data for Handlebars variables | |
| version_id | Yes | ID of the version to update | |
| template_id | Yes | ID of the template | |
| html_content | No | HTML content of the email template | |
| plain_content | No | Plain text version | |
| generate_plain_content | No | Auto-generate plain text from HTML |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is not read-only, is idempotent, and is not destructive, so the description does not need to repeat those facts. The description adds only generic context ('content and settings') and does not disclose behavioral nuances such as how setting 'active' affects other versions or what happens to test data. It contradicts no annotations, but also adds little beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, and the action is front-loaded. It is appropriately short for a straightforward update operation. It could be slightly richer, but it does not waste the agent's attention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters, a rich input schema, and no output schema, the description is adequate but minimal. It does not explain version-specific behavior, activation semantics, or how this differs from updating a template itself. The available schema and sibling names fill some gaps, but the description alone leaves the agent without clear routing guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, with each parameter already described in the schema. The description's 'content and settings' is a high-level summary but adds no parameter-level meaning beyond the schema. Since the schema carries the burden, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Update') and resource ('template version'), which distinguishes it from get/delete/create siblings. However, it does not explicitly differentiate from the sibling 'update_template', which could be confused at the template level. The phrasing is meaningful and not a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is used to modify a template version, but it provides no explicit guidance on when to choose it over alternatives like update_template or create_template_version. There are no exclusions, prerequisites, or context cues about version-level vs. template-level updates. Usage is inferred from the name and resource phrasing rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
50 tool updates
v1.1.1- Changed
create_contact3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / contacts / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / contacts / items / properties / custom_fields / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
create_contact_with_lists3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / contacts / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / contacts / items / properties / custom_fields / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
create_custom_field1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
create_email_list1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
create_html_template1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
create_sender3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / from / additionalPropertiesRemoved value: -false - removed
Input schema / properties / reply_to / additionalPropertiesRemoved value: -false
- Changed
create_template1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
create_template_version1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_automation1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_contact1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_custom_field1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_email_list1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_segment1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_sender1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_template1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delete_template_version1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_automation1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_category_stats1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_contact1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_global_stats1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_single_send1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_stats_by_browser3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / limitAdded value: +{ + "description": "Number of results to return per page (SendGrid defaults to 500)", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Number of results to skip for pagination", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
get_stats_by_client_type2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / client_typeRemoved value: -{ - "description": "Comma-separated list of client types to filter by", - "type": "string" -}
- Changed
get_stats_by_country4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / limitAdded value: +{ + "description": "Number of results to return per page (SendGrid defaults to 500)", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Number of results to skip for pagination", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - removed
Input schema / properties / stateRemoved value: -{ - "description": "State or province to filter by", - "type": "string" -}
- Changed
get_stats_by_device_type4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / device_typeRemoved value: -{ - "description": "Comma-separated list of device types to filter by", - "type": "string" -} - added
Input schema / properties / limitAdded value: +{ + "description": "Number of results to return per page (SendGrid defaults to 500)", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Number of results to skip for pagination", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
get_stats_by_mailbox_provider3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / limitAdded value: +{ + "description": "Number of results to return per page (SendGrid defaults to 500)", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Number of results to skip for pagination", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
get_stats_overview1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_subuser_stats1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_template1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_template_version1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_automations1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_contacts4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / page_sizeRemoved value: -{ - "default": 100, - "description": "Number of contacts to return (max 1000)", - "type": "number" -} - removed
Input schema / properties / page_tokenRemoved value: -{ - "description": "Token for pagination", - "type": "string" -}
- Changed
list_email_lists1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_single_sends1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_templates1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
open_automation_editor1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
open_single_send_stats1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
open_template_editor1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
remove_contact_from_lists1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
search_contacts3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / page_sizeRemoved value: -{ - "default": 50, - "description": "Number of results to return (max 100)", - "type": "number" -} - removed
Input schema / properties / page_tokenRemoved value: -{ - "description": "Token for pagination", - "type": "string" -}
- Changed
search_contacts_by_emails2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / emails / items / patternAdded value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
send_mail21 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / content / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / from / $refRemoved value: -"#/properties/personalizations/items/properties/to/items" - added
Input schema / properties / from / propertiesAdded value: +{ + "email": { + "type": "string" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / from / requiredAdded value: +[ + "email" +] - added
Input schema / properties / from / typeAdded value: +"object" - removed
Input schema / properties / personalizations / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / personalizations / items / properties / bcc / items / $refRemoved value: -"#/properties/personalizations/items/properties/to/items" - added
Input schema / properties / personalizations / items / properties / bcc / items / propertiesAdded value: +{ + "email": { + "type": "string" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / personalizations / items / properties / bcc / items / requiredAdded value: +[ + "email" +] - added
Input schema / properties / personalizations / items / properties / bcc / items / typeAdded value: +"object" - removed
Input schema / properties / personalizations / items / properties / cc / items / $refRemoved value: -"#/properties/personalizations/items/properties/to/items" - added
Input schema / properties / personalizations / items / properties / cc / items / propertiesAdded value: +{ + "email": { + "type": "string" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / personalizations / items / properties / cc / items / requiredAdded value: +[ + "email" +] - added
Input schema / properties / personalizations / items / properties / cc / items / typeAdded value: +"object" - added
Input schema / properties / personalizations / items / properties / substitutions / propertyNamesAdded value: +{ + "type": "string" +} - removed
Input schema / properties / personalizations / items / properties / to / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / reply_to / $refRemoved value: -"#/properties/personalizations/items/properties/to/items" - added
Input schema / properties / reply_to / propertiesAdded value: +{ + "email": { + "type": "string" + }, + "name": { + "type": "string" + } +} - added
Input schema / properties / reply_to / requiredAdded value: +[ + "email" +] - added
Input schema / properties / reply_to / typeAdded value: +"object"
- Changed
update_automation_settings1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_automation_step1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_contact4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / contacts / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / contacts / items / properties / custom_fields / propertyNamesAdded value: +{ + "type": "string" +} - added
Input schema / properties / contacts / items / properties / email / patternAdded value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
update_custom_field1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_email_list1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_segment1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_template1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
update_template_version1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
2 tool updates
v1.1.0- Added
get_single_send - Changed
list_single_sends1 field changed- added
Input schema / properties / page_tokenAdded value: +{ + "description": "Pagination token from a previous response", + "type": "string" +}
4 tool updates
v1.0.4- Added
delete_automation - Added
get_automation - Added
update_automation_settings - Added
update_automation_step
45 tool updates
v1.0.0- Changed
create_contact2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_contact_with_lists2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_custom_field2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_email_list2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_html_template2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_sender2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_template2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_template_version2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_contact2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_custom_field2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_email_list2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_segment2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_sender2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_template2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
delete_template_version2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_category_stats2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_contact2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_global_stats2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_stats_by_browser2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_stats_by_client_type2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_stats_by_country2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_stats_by_device_type2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_stats_by_mailbox_provider2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_stats_overview2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_subuser_stats2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_template2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_template_version2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_automations2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_contacts2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_email_lists2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_single_sends2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_templates2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
open_automation_editor2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
open_single_send_stats2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
open_template_editor2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
remove_contact_from_lists2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
search_contacts2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
search_contacts_by_emails2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
send_mail2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_contact2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_custom_field2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_email_list2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_segment2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_template2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_template_version2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
53 tool updates
- First observed
create_contact - First observed
create_contact_with_lists - First observed
create_custom_field - First observed
create_email_list - First observed
create_html_template - First observed
create_sender - First observed
create_template - First observed
create_template_version - First observed
delete_contact - First observed
delete_custom_field - First observed
delete_email_list - First observed
delete_segment - First observed
delete_sender - First observed
delete_template - First observed
delete_template_version - First observed
get_category_stats - First observed
get_contact - First observed
get_global_stats - First observed
get_scopes - First observed
get_stats_by_browser - First observed
get_stats_by_client_type - First observed
get_stats_by_country - First observed
get_stats_by_device_type - First observed
get_stats_by_mailbox_provider - First observed
get_stats_overview - First observed
get_subuser_stats - First observed
get_template - First observed
get_template_version - First observed
list_automations - First observed
list_contacts - First observed
list_custom_fields - First observed
list_email_lists - First observed
list_segments - First observed
list_senders - First observed
list_single_sends - First observed
list_templates - First observed
open_automation_creator - First observed
open_automation_editor - First observed
open_csv_uploader - First observed
open_segment_creator - First observed
open_single_send_creator - First observed
open_single_send_stats - First observed
open_template_editor - First observed
remove_contact_from_lists - First observed
search_contacts - First observed
search_contacts_by_emails - First observed
send_mail - First observed
update_contact - First observed
update_custom_field - First observed
update_email_list - First observed
update_segment - First observed
update_template - First observed
update_template_version
TDQS
Most tools target distinct resources and actions, but there are overlapping creation paths (create_template vs create_template_version vs create_html_template; create_contact vs create_contact_with_lists) and several open_* navigation tools that an agent could confuse. The descriptions help, but the boundaries are not always crisp.
Every tool name is snake_case and follows a verb_noun pattern with predictable prefixes like list_, get_, create_, update_, delete_, open_, and search_. Pluralization and stats-breakdown names are consistent, making the surface easy to navigate.
58 tools is far above the 3-15 well-scoped range, and even a broad SendGrid API does not justify this many entry points. Many browser-open utilities and overlapping creation helpers inflate the count and could be consolidated.
Contacts, lists, templates, and email stats are well covered, but automations, single sends, and segments lack programmatic create actions—only browser-based openers are exposed. This leaves notable gaps for fully automated marketing workflow management.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Send transactional email, run campaigns, manage contacts and automations, audit deliverability.
Send email and read templates, marketing contacts, lists, stats, bounces and unsubscribes.
Send, track, and manage transactional and bulk email delivery
- EnvlopedOAuthcom.envloped
Send transactional email, verify domains, build contact segments, and draft marketing campaigns.
Related MCP Servers
- AlicenseBqualityFmaintenanceProvides an interface to manage email marketing, contact lists, dynamic templates, and email analytics via SendGrid's API.211,38429ISC
- FlicenseBqualityDmaintenanceEnables management of email campaigns, subscribers, lists, segments, journeys, templates, transactional email, and client/account settings through the Campaign Monitor API via natural language.1001-

sendcraft-mcpofficial
AlicenseAqualityDmaintenanceEnables AI agents to send emails, manage campaigns, subscribers, templates, and domains via the SendCraft email API.2617MIT- AlicenseNot gradedqualityDmaintenanceEnables AI models to send emails, manage contacts, and interact with SendGrid's email platform via MCP.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/deyikong/sendgrid-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server