Skip to main content
Glama
deyikong

SendGrid MCP Server

by deyikong

SendGrid MCP Server

Listed on mcpservers.org

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-mcp

This 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.

Deploying from a GitHub repo Deploying from an npm package

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-mcp

Authentication

Set MCP_AUTH_MODE to one of:

Mode

Use for

Requires

oauth

Production / remote clients

MCP_OAUTH_ISSUER, MCP_OAUTH_AUDIENCE

token

Local dev, simple self-hosting

MCP_AUTH_TOKEN (16+ chars)

none

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:

  1. Sign in to your Auth0 Dashboard and go to Applications → APIs → Create API.

  2. 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.

  3. Under the API's Permissions tab, add the scopes your server should require, e.g. sendgrid:read, sendgrid:write.

  4. 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"
  1. Sign in to the Okta Admin Console and go to Security → API → Authorization Servers.

  2. Use the default authorization server, or create a new one. Its Issuer URI, shown at the top of the server's settings page, looks like https://{yourOktaDomain}/oauth2/{authServerId}.

  3. 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.

  4. 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"
  1. In the Azure Portal, go to Microsoft Entra ID → App registrations → New registration to represent this MCP server as a resource.

  2. Open the new app's Expose an API page and set the Application ID URI — this becomes your audience, e.g. api://<client-id>.

  3. On the same page, click Add a scope to define one, e.g. sendgrid.read.

  4. 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_PROXY

  • MCP_AUTH_MODE=none on anything but a loopback bind

  • An http:// MCP_PUBLIC_URL that is not loopback

  • A missing or under-length MCP_AUTH_TOKEN, or oauth mode without an issuer and audience

  • TLS_KEY_FILE and TLS_CERT_FILE set only one of the pair

Beyond that:

  • Keep READ_ONLY=true unless 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_ORIGINS to 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

  1. Go to SendGrid API Keys

  2. Click "Create API Key"

  3. Choose "Full Access" or select specific permissions

  4. 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:

MCP Market Variables tab showing SENDGRID_API_KEY and other credentials

Variable

Required

Description

SENDGRID_API_KEY

Your SendGrid API key (starts with SG.)

MCP_SERVER_NAME

Server name for identification

MCP_SERVER_VERSION

Server version

LOG_LEVEL

Logging level (debug, info, warn, error)

REQUEST_TIMEOUT

API request timeout in milliseconds

READ_ONLY

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.

MCP Market's Install server panel with one-click client options

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>/mcp

Wire 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>/mcp

MCP 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.json

  • Windows: %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:

  1. Save the file

  2. Restart Claude Desktop

  3. 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-code

Configuration 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:

  1. Install the Cline extension from VS Code marketplace

  2. 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.json

  • Windows: %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-mcp

Configuration 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

SENDGRID_API_KEY

Your SendGrid API key (starts with SG.)

-

READ_ONLY

Enable read-only mode (true/false)

true

MCP_SERVER_NAME

Server name for identification

sendgrid-mcp

MCP_SERVER_VERSION

Server version

1.0.0

LOG_LEVEL

Logging level (debug, info, warn, error)

info

REQUEST_TIMEOUT

API request timeout in milliseconds

30000

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_editor

  • list_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_emails

  • list_email_lists

  • list_segments, open_segment_creator

  • list_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_automation

  • create_contact, update_contact, delete_contact

  • create_contact_with_lists, remove_contact_from_lists

  • create_email_list, update_email_list, delete_email_list

  • create_custom_field, update_custom_field, delete_custom_field

  • create_sender, delete_sender

  • update_segment, delete_segment

  • create_template, update_template, delete_template

  • create_template_version, update_template_version, delete_template_version

  • create_html_template

  • send_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

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 metadata

  • get_automation - Get detailed information about a specific automation

  • update_automation_settings - Update automation-level settings (name, status)

  • update_automation_step - Update individual step settings (status, wait time)

  • delete_automation - Permanently delete an automation

  • open_automation_creator - Open automation creator in browser

  • open_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 metadata

  • get_single_send - Retrieve detailed content and settings for a single send campaign

  • open_single_send_creator - Open campaign creator in browser for visual design

  • open_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 filtering

  • get_contact - Get detailed information about a specific contact

  • create_contact - Create new contacts with custom fields

  • update_contact - Update existing contact information and custom data

  • delete_contact - Delete contacts permanently with cleanup

  • search_contacts - Search for contacts using advanced query conditions

  • search_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 lists

  • create_email_list - Create a new email list

  • update_email_list - Update email list properties

  • delete_email_list - Delete an email list

  • create_contact_with_lists - Create contacts and assign to lists

  • remove_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 criteria

  • open_segment_creator - Open segment creator in browser for visual query building

  • update_segment - Update existing segment name or query criteria with real-time refresh

  • delete_segment - Delete an existing segment (contacts remain unaffected)

  • list_custom_fields - List custom field definitions with data types

  • create_custom_field - Create new custom fields (Text, Number, Date types)

  • update_custom_field - Update existing custom field definitions

  • delete_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 identities

  • create_sender - Create new sender identity

  • delete_sender - Delete a verified sender identity

  • open_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 templates

  • get_template - Get details of a specific template including all versions

  • create_template - Create a new dynamic template

  • update_template - Update template name and settings

  • delete_template - Delete a template and all its versions

  • create_template_version - Create a new version with HTML content and settings

  • get_template_version - Get details of a specific template version

  • update_template_version - Update version content, subject, and settings

  • delete_template_version - Delete a specific template version

  • create_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 metrics

  • get_stats_overview - Get comprehensive statistics across multiple dimensions

  • get_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/province

  • get_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 account

  • create_suppression_group - Create a new unsubscribe (suppression) group

  • get_suppression_group - Get details about a specific unsubscribe (suppression) group

  • update_suppression_group - Update the name, description, or default status of an existing suppression group

  • delete_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 group

  • add_group_suppressions - Add one or more email addresses to a specific suppression group's unsubscribe list

  • remove_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 range

  • add_global_suppression - Add recipients to the account-wide global unsubscribe list -- they will stop receiving all non-transactional mail from this account

  • get_global_suppression - Check whether a specific email address is on the account-wide global unsubscribe list

  • delete_global_suppression - Remove an email address from the account-wide global suppression list, effectively resubscribing them to non-transactional mail

  • list_bounces - List all email addresses that have bounced, optionally filtered by a time range

  • get_bounce - Get bounce event(s) recorded for a specific email address

  • delete_bounce - Remove a bounce record for an email address so this address can receive mail again

  • list_blocks - List all email addresses currently on the blocks list, optionally filtered by a time range

  • delete_block - Remove an email address from the blocks list so this address can receive mail again

  • list_spam_reports - List all email addresses that have reported mail as spam, optionally filtered by a time range

  • delete_spam_report - Remove an email address from the spam reports list so this address can receive mail again

  • list_invalid_emails - List all email addresses that have been marked invalid, optionally filtered by a time range

  • delete_invalid_email - Remove an email address from the invalid emails list so this address can receive mail again

  • list_authenticated_domains - List all authenticated (whitelabel) domains configured for sending mail

  • get_authenticated_domain - Get detailed information about a specific authenticated domain, including its DNS records

  • create_authenticated_domain - Set up domain authentication (SPF/DKIM) for sending mail from a custom domain

  • update_authenticated_domain - Update the custom SPF or default settings of an existing authenticated domain

  • delete_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 authentication

  • get_default_authenticated_domain - Get the authenticated domain currently set as the default for sending mail

  • list_branded_links - List all branded links (link whitelabels) configured for click tracking

  • get_branded_link - Get detailed information about a specific branded link, including its DNS records

  • create_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 link

  • delete_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 account

  • get_event_webhook - Get the configuration of a specific Event Webhook by ID

  • create_event_webhook - Creates a new Event Webhook that POSTs email events (delivered, bounced, opened, clicked, etc.) to the given URL

  • update_event_webhook - Update the configuration of an existing Event Webhook

  • delete_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 configured

  • list_inbound_parse_settings - List all configured Inbound Parse webhook settings on the account

  • get_inbound_parse_setting - Get the Inbound Parse webhook configuration for a specific hostname

  • create_inbound_parse_setting - Configures inbound email parsing so mail sent to the given hostname is POSTed to the given URL

  • update_inbound_parse_setting - Update the Inbound Parse webhook configuration for a specific hostname

  • delete_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 call

  • get_click_tracking_settings - Retrieve the current click tracking setting

  • update_click_tracking_settings - Enable or disable click tracking on links within emails

  • get_google_analytics_settings - Retrieve the current Google Analytics tracking settings

  • update_google_analytics_settings - Update Google Analytics tracking settings, including UTM campaign, content, medium, source, and term values

  • get_open_tracking_settings - Retrieve the current open tracking setting

  • update_open_tracking_settings - Enable or disable open tracking, which inserts an invisible pixel to record when an email is opened

  • get_subscription_tracking_settings - Retrieve the current subscription tracking settings

  • update_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 call

  • get_address_whitelist_settings - Retrieve the current address whitelist mail setting, which controls which email addresses or domains bypass all suppression lists

  • update_address_whitelist_settings - Update the address whitelist setting that controls which email addresses or domains bypass all suppression lists

  • get_bounce_purge_settings - Retrieve the current bounce purge mail setting, which automatically purges old bounce records after a configured number of days

  • update_bounce_purge_settings - Update the bounce purge setting that automatically purges old bounce records after a configured number of days

  • get_footer_settings - Retrieve the current footer mail setting, which appends a footer to every outgoing email

  • update_footer_settings - Update the footer setting that appends a footer to every outgoing email

  • get_forward_bounce_settings - Retrieve the current forward bounce mail setting, which forwards bounce notifications to a given email address

  • update_forward_bounce_settings - Update the forward bounce setting that forwards bounce notifications to a given email address

  • get_forward_spam_settings - Retrieve the current forward spam mail setting, which forwards spam report notifications to a given email address

  • update_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 account

  • get_alert - Get details for a specific alert

Teammates (read-only)

  • list_teammates - List all teammates (users) on the account

  • get_teammate - Get details for a specific teammate, including their permission scopes

  • list_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 account

  • get_ip_address - Get details for a specific IP address, including its warmup status and assigned subusers

  • list_assigned_ips - List all IP addresses that are currently assigned to a subuser

  • list_ip_pools - List all IP pools on the account

  • get_ip_pool - Get details for a specific IP pool, including the IP addresses it contains

  • get_remaining_ips - Get the count and cost of additional dedicated IP addresses available for purchase

  • list_ip_warmups - List all IP addresses currently in the warmup process

  • get_ip_warmup_status - Get the warmup status for a specific IP address

  • list_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 allowlist

  • list_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 Library

  • create_design - Create a new custom email design in the Design Library from raw HTML

  • get_design - Get details for a specific design in the Design Library

  • update_design - Update the content or metadata of an existing design in the Design Library

  • delete_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 Library

  • list_prebuilt_designs - List SendGrid's built-in pre-made design templates

  • get_prebuilt_design - Get details for one of SendGrid's built-in pre-made designs

  • duplicate_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)

  • 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 delivered

  • get_message_details - Get full delivery event history and details for a single sent message by its message ID

Available Resources

  • sendgrid://automations - Marketing automations data

  • sendgrid://singlesends - Single send campaigns data

  • sendgrid://lists - Email lists data

  • sendgrid://contacts - Contact segments data

  • sendgrid://suppressions - Suppression lists (bounces, spam, etc.)

  • sendgrid://account - Account profile information

  • sendgrid://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 automations

  • sendgrid_campaign_help - Get help with single send campaigns

  • sendgrid_contacts_help - Get help with comprehensive contact management

  • sendgrid_list_management_help - Get help with email list CRUD operations

  • sendgrid_update_list_help - Get help with updating/renaming email lists

  • sendgrid_contact_crud_help - Get help with contact create/read/update/delete operations

  • sendgrid_custom_fields_help - Get help with custom field definitions management

  • sendgrid_segment_management_help - Get help with managing dynamic contact segments

  • sendgrid_sender_management_help - Get help with sender identity management

  • sendgrid_templates_help - Get help with creating and managing dynamic email templates

  • sendgrid_suppressions_help - Get help with suppression lists

  • sendgrid_settings_help - Get help with account settings

  • sendgrid_mail_send_help - Get help with sending emails

  • sendgrid_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-mcp

Using 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 prompts

Adding New Tools

  1. Add tool definition to appropriate file in src/tools/

  2. Follow the existing pattern with config and handler

  3. Export from src/tools/index.ts

  4. Update README.md with new tool documentation

  5. Run npm run build to compile

Available Scripts

  • npm run build - Compile TypeScript to JavaScript

  • npm start - Run the compiled server

  • npm 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.js

For 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:

  1. Update version in package.json:

    npm version patch  # or minor, major
  2. Push changes and tags:

    git push && git push --tags
  3. Create 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-mcp on npm — update with npm update -g sendgrid-mcp

Troubleshooting

Common Issues

1. Server Not Found / Command Not Found

Error: sendgrid-mcp: command not found

Solution:

  • Ensure you installed globally: npm install -g sendgrid-mcp

  • Check npm global bin directory is in PATH: npm config get prefix

  • Try 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 Forbidden

Solution:

  • 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 mode

Solution:

  • This is intentional security protection

  • To enable write operations, set READ_ONLY: "false" in your MCP client configuration

  • Example:

    {
      "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 timeout

Solution:

  • Check your internet connection

  • Increase timeout in configuration:

    {
      "env": {
        "REQUEST_TIMEOUT": "60000"
      }
    }
  • Verify SendGrid API is accessible (not blocked by firewall/proxy)


Getting Help

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_key are 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_teammates are 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

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Test thoroughly

  5. Submit a pull request

Support

For issues related to:

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 tools
create_contactCreate ContactB
Idempotent

Create new contacts in your SendGrid account

ParametersJSON Schema
NameRequiredDescriptionDefault
contactsYesArray of contact objects

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 ListsA
Idempotent

Create new contacts and assign them to specific email lists

ParametersJSON Schema
NameRequiredDescriptionDefault
contactsYesArray of contact objects
list_idsYesArray of list IDs to add the contact to

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the custom field
field_typeYesType of the field

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the email list

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
subjectYesEmail subject line (supports Handlebars like {{firstName}})
test_dataNoJSON string with test data for preview (e.g., '{"firstName":"John","company":"Acme"}')
html_contentYesComplete HTML email template (supports Handlebars)
version_nameYesName for the initial version
plain_contentNoPlain text version (will auto-generate if not provided)
template_nameYesName of the template

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
zipYesZIP code
cityYesCity
fromYes
stateYesState
addressYesStreet address
countryYesCountry
nicknameYesNickname for the sender
reply_toYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the template
generationNoTemplate generation typedynamic

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for this version
activeNoSet as active version (1 = active, 0 = inactive)
subjectYesEmail subject line (supports Handlebars)
test_dataNoJSON string of test data for Handlebars variables
template_idYesID of the template to add version to
html_contentYesHTML content of the email template (supports Handlebars)
plain_contentNoPlain text version (optional)
generate_plain_contentNoAuto-generate plain text from HTML

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 AutomationA
DestructiveIdempotent

Permanently delete a marketing automation. This action cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
automation_idYesThe automation ID to delete

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ContactB
DestructiveIdempotent

Delete contacts by IDs

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idsYesArray of contact IDs to delete

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 FieldB
DestructiveIdempotent

Delete a custom field definition

ParametersJSON Schema
NameRequiredDescriptionDefault
field_idYesID of the custom field to delete

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 ListA
DestructiveIdempotent

Delete an existing email list from your SendGrid account

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesID of the email list to delete

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 SegmentB
DestructiveIdempotent

Delete an existing segment

ParametersJSON Schema
NameRequiredDescriptionDefault
segment_idYesID of the segment to delete

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 IdentityA
DestructiveIdempotent

Delete a verified sender identity

ParametersJSON Schema
NameRequiredDescriptionDefault
sender_idYesID of the sender identity to delete

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 TemplateA
DestructiveIdempotent

Delete a template and all its versions

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesID of the template to delete

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 VersionA
DestructiveIdempotent

Delete a specific version of a template

ParametersJSON Schema
NameRequiredDescriptionDefault
version_idYesID of the version to delete
template_idYesID of the template

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DetailsA
Read-onlyIdempotent

Get detailed information about a specific automation including all steps and settings

ParametersJSON Schema
NameRequiredDescriptionDefault
automation_idYesThe automation ID to retrieve

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 CategoryA
Read-onlyIdempotent

Retrieve email statistics for specific categories (available for previous 13 months only)

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
categoriesYesComma-separated list of categories to retrieve stats for
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DetailsA
Read-onlyIdempotent

Get detailed information about a specific contact by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYesID of the contact to retrieve

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StatisticsA
Read-onlyIdempotent

Retrieve global email statistics for your SendGrid account

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ScopesA
Read-onlyIdempotent

Get available permission scopes for API keys

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 CampaignA
Read-onlyIdempotent

Get detailed content and settings for a single send campaign

ParametersJSON Schema
NameRequiredDescriptionDefault
singlesend_idYesThe single send ID to retrieve

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 BrowserA
Read-onlyIdempotent

Retrieve email statistics grouped by browser type. Only clicks and unique_clicks metrics are available.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return per page (SendGrid defaults to 500)
offsetNoNumber of results to skip for pagination
browsersNoComma-separated list of browsers to filter by
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 TypeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CountryA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return per page (SendGrid defaults to 500)
offsetNoNumber of results to skip for pagination
countryNoISO 3166-1 alpha-2 country code to filter by
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 TypeA
Read-onlyIdempotent

Retrieve email statistics grouped by device type (desktop, mobile, tablet). Only opens and unique_opens metrics are available.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return per page (SendGrid defaults to 500)
offsetNoNumber of results to skip for pagination
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProviderA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return per page (SendGrid defaults to 500)
offsetNoNumber of results to skip for pagination
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday
mailbox_providersNoComma-separated list of mailbox providers to filter by

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 OverviewB
Read-onlyIdempotent

Get a comprehensive overview of email statistics across multiple dimensions

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday
include_subusersNoInclude subuser statistics in the overview

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 SubuserB
Read-onlyIdempotent

Retrieve email statistics for specific subusers

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format (defaults to today)
subusersYesComma-separated list of subuser names to retrieve stats for
start_dateYesStart date in YYYY-MM-DD format
aggregated_byNoHow to group the statisticsday

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 DetailsA
Read-onlyIdempotent

Retrieve details of a specific template including all versions

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesID of the template to retrieve

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 VersionB
Read-onlyIdempotent

Retrieve details of a specific template version

ParametersJSON Schema
NameRequiredDescriptionDefault
version_idYesID of the version to retrieve
template_idYesID of the template

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 AutomationsB
Read-onlyIdempotent

List all marketing automations

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return
offsetNoPagination offset

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 ContactsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 FieldsB
Read-onlyIdempotent

List all custom fields

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 ListsA
Read-onlyIdempotent

List all email lists

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoNumber of results to return

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 SegmentsA
Read-onlyIdempotent

List all segments with their parent list relationships

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SendersA
Read-onlyIdempotent

List all verified senders

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CampaignsA
Read-onlyIdempotent

List all single send campaigns

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoNumber of results to return
page_tokenNoPagination token from a previous response

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 TemplatesA
Read-onlyIdempotent

Retrieve all transactional templates (legacy and dynamic)

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoNumber of templates to return (max 200)
generationsNoFilter by template generation (legacy or dynamic)

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 CreatorA
Read-onlyIdempotent

Open SendGrid automation creator in browser

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 EditorB
Read-onlyIdempotent

Open automation editor for a specific automation

ParametersJSON Schema
NameRequiredDescriptionDefault
automation_idYesThe automation ID to edit

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 UploaderA
Read-onlyIdempotent

Open SendGrid CSV contact upload page in browser

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 CreatorA
Read-onlyIdempotent

Open SendGrid segment creator in browser

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 CreatorA
Read-onlyIdempotent

Open SendGrid single send creator in browser

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StatsB
Read-onlyIdempotent

Open single send stats page for a specific campaign

ParametersJSON Schema
NameRequiredDescriptionDefault
singlesend_idYesThe single send ID to view stats for

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 EditorA
Read-onlyIdempotent

Open the SendGrid template editor in browser for visual editing

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idNoTemplate ID to open (opens template list if not provided)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ListA
Idempotent

Remove contacts from a specific email list

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesID of the list to remove contacts from
contact_idsYesArray of contact IDs to remove from the list

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 ContactsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query using segment conditions (e.g., 'email LIKE "@example.com"')

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 AddressesA
Read-onlyIdempotent

Search for specific contacts by their email addresses

ParametersJSON Schema
NameRequiredDescriptionDefault
emailsYesArray of email addresses to search for

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 MailC
Destructive

Send an email using SendGrid Mail Send API

ParametersJSON Schema
NameRequiredDescriptionDefault
fromYes
contentYesEmail content
subjectNoDefault subject if not set in personalizations
reply_toNo
personalizationsYesPersonalization settings for recipients

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SettingsA
Idempotent

Update automation-level settings such as name, status, and title. Use this to activate/pause entire automations or rename them.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNew title/name for the automation
statusNoSet the automation status to 'active' or 'paused'
automation_idYesThe automation ID to update

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StepB
Idempotent

Update individual step settings within an automation, including step status (activate/pause), wait time, and send configurations

ParametersJSON Schema
NameRequiredDescriptionDefault
step_idYesThe step ID within the automation to update
wait_timeNoWait time in minutes before executing this step
step_statusNoSet the step status to 'active' or 'paused'
automation_idYesThe automation ID containing the step

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ContactB
Idempotent

Update existing contact information

ParametersJSON Schema
NameRequiredDescriptionDefault
contactsYesArray of contact objects with updates

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FieldA
Idempotent

Update an existing custom field definition

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew name for the custom field
field_idYesID of the custom field to update

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ListA
Idempotent

Update the properties of an existing email list

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew name for the email list
list_idYesID of the email list to update

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 SegmentA
Idempotent

Update an existing segment's name or query criteria

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the segment
query_dslNoNew query criteria for the segment (JSON string)
segment_idYesID of the segment to update

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 TemplateB
Idempotent

Update the name of an existing template

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew name for the template
template_idYesID of the template to update

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 VersionB
Idempotent

Update the content and settings of a template version

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for this version
activeNoSet as active version (1 = active, 0 = inactive)
subjectNoEmail subject line (supports Handlebars)
test_dataNoJSON string of test data for Handlebars variables
version_idYesID of the version to update
template_idYesID of the template
html_contentNoHTML content of the email template
plain_contentNoPlain text version
generate_plain_contentNoAuto-generate plain text from HTML

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 50 tool updatesv1.1.1
    • Changedcreate_contact3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / contacts / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / contacts / items / properties / custom_fields / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedcreate_contact_with_lists3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / contacts / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / contacts / items / properties / custom_fields / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedcreate_custom_field1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedcreate_email_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedcreate_html_template1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedcreate_sender3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / from / additionalProperties
        Removed value: -false
      • removedInput schema / properties / reply_to / additionalProperties
        Removed value: -false
    • Changedcreate_template1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedcreate_template_version1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_automation1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_contact1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_custom_field1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_email_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_segment1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_sender1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_template1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddelete_template_version1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_automation1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_category_stats1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_contact1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_global_stats1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_single_send1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_stats_by_browser3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Number of results to return per page (SendGrid defaults to 500)",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of results to skip for pagination",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
    • Changedget_stats_by_client_type2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / client_type
        Removed value: -{
        -  "description": "Comma-separated list of client types to filter by",
        -  "type": "string"
        -}
    • Changedget_stats_by_country4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Number of results to return per page (SendGrid defaults to 500)",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of results to skip for pagination",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • removedInput schema / properties / state
        Removed value: -{
        -  "description": "State or province to filter by",
        -  "type": "string"
        -}
    • Changedget_stats_by_device_type4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / device_type
        Removed value: -{
        -  "description": "Comma-separated list of device types to filter by",
        -  "type": "string"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Number of results to return per page (SendGrid defaults to 500)",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of results to skip for pagination",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
    • Changedget_stats_by_mailbox_provider3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Number of results to return per page (SendGrid defaults to 500)",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of results to skip for pagination",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
    • Changedget_stats_overview1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_subuser_stats1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_template1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_template_version1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_automations1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_contacts4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / page_size
        Removed value: -{
        -  "default": 100,
        -  "description": "Number of contacts to return (max 1000)",
        -  "type": "number"
        -}
      • removedInput schema / properties / page_token
        Removed value: -{
        -  "description": "Token for pagination",
        -  "type": "string"
        -}
    • Changedlist_email_lists1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_single_sends1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_templates1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedopen_automation_editor1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedopen_single_send_stats1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedopen_template_editor1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedremove_contact_from_lists1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedsearch_contacts3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / page_size
        Removed value: -{
        -  "default": 50,
        -  "description": "Number of results to return (max 100)",
        -  "type": "number"
        -}
      • removedInput schema / properties / page_token
        Removed value: -{
        -  "description": "Token for pagination",
        -  "type": "string"
        -}
    • Changedsearch_contacts_by_emails2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / emails / items / pattern
        Added value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedsend_mail21 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / content / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / from / $ref
        Removed value: -"#/properties/personalizations/items/properties/to/items"
      • addedInput schema / properties / from / properties
        Added value: +{
        +  "email": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / from / required
        Added value: +[
        +  "email"
        +]
      • addedInput schema / properties / from / type
        Added value: +"object"
      • removedInput schema / properties / personalizations / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / personalizations / items / properties / bcc / items / $ref
        Removed value: -"#/properties/personalizations/items/properties/to/items"
      • addedInput schema / properties / personalizations / items / properties / bcc / items / properties
        Added value: +{
        +  "email": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / personalizations / items / properties / bcc / items / required
        Added value: +[
        +  "email"
        +]
      • addedInput schema / properties / personalizations / items / properties / bcc / items / type
        Added value: +"object"
      • removedInput schema / properties / personalizations / items / properties / cc / items / $ref
        Removed value: -"#/properties/personalizations/items/properties/to/items"
      • addedInput schema / properties / personalizations / items / properties / cc / items / properties
        Added value: +{
        +  "email": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / personalizations / items / properties / cc / items / required
        Added value: +[
        +  "email"
        +]
      • addedInput schema / properties / personalizations / items / properties / cc / items / type
        Added value: +"object"
      • addedInput schema / properties / personalizations / items / properties / substitutions / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / personalizations / items / properties / to / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / reply_to / $ref
        Removed value: -"#/properties/personalizations/items/properties/to/items"
      • addedInput schema / properties / reply_to / properties
        Added value: +{
        +  "email": {
        +    "type": "string"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / reply_to / required
        Added value: +[
        +  "email"
        +]
      • addedInput schema / properties / reply_to / type
        Added value: +"object"
    • Changedupdate_automation_settings1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_automation_step1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_contact4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / contacts / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / contacts / items / properties / custom_fields / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / contacts / items / properties / email / pattern
        Added value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedupdate_custom_field1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_email_list1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_segment1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_template1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_template_version1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 2 tool updatesv1.1.0
    • Addedget_single_send
    • Changedlist_single_sends1 field changed
      • addedInput schema / properties / page_token
        Added value: +{
        +  "description": "Pagination token from a previous response",
        +  "type": "string"
        +}
  3. 4 tool updatesv1.0.4
    • Addeddelete_automation
    • Addedget_automation
    • Addedupdate_automation_settings
    • Addedupdate_automation_step
  4. 45 tool updatesv1.0.0
    • Changedcreate_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_contact_with_lists2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_custom_field2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_email_list2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_html_template2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_sender2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_template2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_template_version2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_custom_field2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_email_list2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_segment2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_sender2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_template2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddelete_template_version2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_category_stats2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_global_stats2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_stats_by_browser2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_stats_by_client_type2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_stats_by_country2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_stats_by_device_type2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_stats_by_mailbox_provider2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_stats_overview2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_subuser_stats2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_template2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_template_version2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_automations2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_contacts2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_email_lists2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_single_sends2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_templates2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedopen_automation_editor2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedopen_single_send_stats2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedopen_template_editor2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedremove_contact_from_lists2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedsearch_contacts2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedsearch_contacts_by_emails2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedsend_mail2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_contact2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_custom_field2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_email_list2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_segment2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_template2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_template_version2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
  5. 53 tool updates
    • First observedcreate_contact
    • First observedcreate_contact_with_lists
    • First observedcreate_custom_field
    • First observedcreate_email_list
    • First observedcreate_html_template
    • First observedcreate_sender
    • First observedcreate_template
    • First observedcreate_template_version
    • First observeddelete_contact
    • First observeddelete_custom_field
    • First observeddelete_email_list
    • First observeddelete_segment
    • First observeddelete_sender
    • First observeddelete_template
    • First observeddelete_template_version
    • First observedget_category_stats
    • First observedget_contact
    • First observedget_global_stats
    • First observedget_scopes
    • First observedget_stats_by_browser
    • First observedget_stats_by_client_type
    • First observedget_stats_by_country
    • First observedget_stats_by_device_type
    • First observedget_stats_by_mailbox_provider
    • First observedget_stats_overview
    • First observedget_subuser_stats
    • First observedget_template
    • First observedget_template_version
    • First observedlist_automations
    • First observedlist_contacts
    • First observedlist_custom_fields
    • First observedlist_email_lists
    • First observedlist_segments
    • First observedlist_senders
    • First observedlist_single_sends
    • First observedlist_templates
    • First observedopen_automation_creator
    • First observedopen_automation_editor
    • First observedopen_csv_uploader
    • First observedopen_segment_creator
    • First observedopen_single_send_creator
    • First observedopen_single_send_stats
    • First observedopen_template_editor
    • First observedremove_contact_from_lists
    • First observedsearch_contacts
    • First observedsearch_contacts_by_emails
    • First observedsend_mail
    • First observedupdate_contact
    • First observedupdate_custom_field
    • First observedupdate_email_list
    • First observedupdate_segment
    • First observedupdate_template
    • First observedupdate_template_version

TDQS

B3.4/5.0
Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    Provides an interface to manage email marketing, contact lists, dynamic templates, and email analytics via SendGrid's API.
    21
    1,384
    29
    ISC
  • F
    license
    B
    quality
    D
    maintenance
    Enables management of email campaigns, subscribers, lists, segments, journeys, templates, transactional email, and client/account settings through the Campaign Monitor API via natural language.
    100
    1
    -
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to send emails, manage campaigns, subscribers, templates, and domains via the SendCraft email API.
    26
    17
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI models to send emails, manage contacts, and interact with SendGrid's email platform via MCP.
    1
    MIT

Latest Blog Posts

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