Wraps Email for Amazon SES
Provides tools for interacting with Amazon SES, enabling AI agents to send email, check domain verification status, manage suppression lists, estimate sending costs, and inspect recent send history and event logs through a Wraps deployment.
AI agents: start with AGENTS.md — which package to reach for, auth, the minimal correct call for each, and the sharp edges. For the full docs in one file, fetch wraps.dev/llms-full.txt, or wraps.dev/llms.txt for an agent-oriented index.
Packages
@wraps.dev/email — AWS SES
pnpm add @wraps.dev/emailimport { WrapsEmail } from '@wraps.dev/email';
const email = new WrapsEmail();
const { messageId } = await email.send({
from: 'hello@yourapp.com',
to: 'user@example.com',
subject: 'Welcome!',
html: '<h1>Hello from Wraps!</h1>',
});React.email support, template management, bulk sending, inbox reading, event history, and suppression lists. SDK docs →
@wraps.dev/sms — AWS End User Messaging
pnpm add @wraps.dev/smsimport { WrapsSMS } from '@wraps.dev/sms';
const sms = new WrapsSMS();
await sms.send({
to: '+14155551234',
message: 'Your verification code is 123456',
});Batch sending, opt-out management, and E.164 validation. SMS docs →
@wraps.dev/client — Wraps Platform API
pnpm add @wraps.dev/clientimport { createPlatformClient } from '@wraps.dev/client';
const client = createPlatformClient({ apiKey: 'your-api-key' });
const { data } = await client.GET('/v1/contacts/', {
params: { query: { page: '1', pageSize: '10' } },
});Auto-generated types from OpenAPI, workflow definitions, and brand kit configuration.
@wraps.dev/mcp — MCP server for Amazon SES
A Model Context Protocol server that lets AI agents send email from your own AWS account and inspect it. It runs locally over stdio, built on the official MCP TypeScript SDK, and reads AWS credentials from your environment.
{
"mcpServers": {
"wraps": {
"command": "npx",
"args": ["-y", "@wraps.dev/mcp"],
"env": { "AWS_REGION": "us-east-1", "AWS_PROFILE": "your-aws-profile" }
}
}
}Tools: send_email (off unless WRAPS_WRITE_ENABLED=true), verify_domain_status, list_suppressions, get_setup_status, and estimate_cost work on any SES account. list_recent_sends and get_email_event_log read send history from a Wraps deploy. Also runs from the Dockerfile at the repo root: docker build -t wraps-mcp . && docker run -i --rm -e AWS_REGION wraps-mcp. MCP docs →
Related MCP server: sendook-mcp
Documentation
Resource | Link |
Quickstart | |
SDK Reference | |
SMS Docs | |
MCP Server | |
CLI (deploy infra) |
Community
GitHub Issues — Bug reports and feature requests
GitHub Discussions — Questions and ideas
Contributing — Development setup and guidelines
License
MIT — see LICENSE for details.
Available Tools
7 toolsestimate_costARead-only
Estimate the monthly cost of sending email with Wraps + AWS: the Wraps platform fee, tracked-event overage, and an itemized AWS bill (SES, EventBridge, SQS, Lambda, DynamoDB, dedicated IP, WAF). Use this instead of calculating by hand — the cost model has several interacting variables, including which SES pricing plan the AWS account is on. Requires no AWS credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | Wraps plan | |
| emails | Yes | Emails sent per month | |
| events | No | Wraps tracked events per month (sends, opens, clicks, bounces, custom events) | |
| billing | No | Wraps billing interval | |
| sesPlan | No | AWS SES pricing plan for this account and Region. AWS defaults new accounts to 'essentials' ($0.16/1K); 'alacarte' is $0.10/1K. Defaults to alacarte. | |
| tracking | No | Whether the event tracking pipeline is deployed (default true) | |
| retention | No | Email event history retention | |
| dedicatedIp | No | Include a dedicated sending IP |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds value beyond them by disclosing that no AWS credentials are required—a meaningful behavioral trait—and by flagging that the estimate depends on interacting variables such as the SES pricing plan, which aligns with the open-world hint. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence front-loads the action and components; the second explains why it should be used and the credentials constraint. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters eliminates no output schema, the description is fairly complete: it conveys what the result represents (itemized monthly cost) and alerts the caller to input dependencies. The main minor gap is that it does not describe the exact return format or units, but the term 'cost' plus 'itemized AWS bill' gives a sufficient general picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies. The description groups parameters into cost buckets (Wraps fee, tracked-event overage, AWS bill) and references the sesPlan dependency, but does not add per-parameter details beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Estimate the monthly cost of sending email with Wraps + AWS.' It enumerates what the estimate covers (platform fee, tracked-event overage, itemized AWS bill across named services), which precisely defines the tool's scope. It is clearly distinct from the sibling tools, all of which concern sending or inspecting emails, not cost projection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'when to use' guidance: 'Use this instead of calculating by hand' and explains why (the cost model has several interacting variables). It also states a key prerequisite/constraint, 'Requires no AWS credentials.' It does not name alternative tools, but no sibling overlaps with cost estimation, so this is clear enough context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_event_logARead-onlyIdempotent
Get the full delivery event log for a specific email by its messageId. Returns all SES events: Send, Delivery, Bounce, Complaint, Open, Click.
| Name | Required | Description | Default |
|---|---|---|---|
| messageId | Yes | SES message id, as returned by send_email or list_recent_sends. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | |
| from | No | |
| found | Yes | False when no events are recorded yet for this messageId. |
| events | No | SES events in recorded order: Send, Delivery, Bounce, Complaint, Open, Click. |
| sentAt | No | ISO 8601. |
| status | No | |
| subject | No | |
| messageId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safe read-only nature is covered. The description adds value by specifying that the tool returns ALL SES event types, which signals the full delivery timeline rather than a summary or recent send metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The first sentence states the action and target; the second lists the return contents. The key scoping detail ('for a specific email by its messageId') is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with full schema coverage and an output schema, the description is complete enough. It covers the core purpose and return contents. Minor omissions like ordering/pagination are not critical given the annotations and output schema handle the behavioral context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the messageId parameter is fully documented as an SES message id returned by send_email or list_recent_sends. The description just restates 'by messageId' without adding semantic detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get'), a clear resource ('full delivery event log for a specific email'), and a precise identifier ('messageId'). It also enumerates the returned event types (Send, Delivery, Bounce, Complaint, Open, Click), which makes its function unmistakable and differentiates it from siblings like list_recent_sends or send_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear: retrieving the complete event history for one email when a messageId is available. It does not explicitly name alternatives or state when not to use it, but the scope is concrete enough that an agent can correctly select it over the sibling list/reply/setup tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_setup_statusARead-onlyIdempotent
Check this AWS SES account's sandbox status and get a recommended next action for getting a first send out. Read-only — makes no changes to your AWS account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| region | Yes | |
| sandbox | Yes | True while the account can only send to verified recipients. |
| nextAction | Yes | The single next step that unblocks sending. |
| writeEnabled | Yes | Whether WRAPS_WRITE_ENABLED permits sending. |
| maxSend24Hour | Yes | SES daily send quota. |
| sentLast24Hours | Yes | |
| enforcementStatus | Yes | SES account enforcement state, e.g. HEALTHY. |
| fromEmailConfigured | Yes | Whether WRAPS_FROM_EMAIL is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Read-only — makes no changes to your AWS account,' reinforcing the readOnlyHint and idempotentHint annotations. It also adds that the tool returns both sandbox status and a recommended action, which is behavioral context beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose and immediately followed by the safety guarantee. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, takes no parameters, is read-only, and has an output schema. The description fully conveys what the agent should expect: sandbox status plus a recommended next action. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters, so parameter semantics are trivially satisfied. The schema coverage is 100% and there is nothing additional the description needs to clarify about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') with a clear resource ('this AWS SES account's sandbox status') and an additional purpose ('get a recommended next action for getting a first send out'). It is unmistakably distinct from the sibling tools, especially verify_domain_status and send_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for getting a first send out' implies this tool is for initial sandbox setup and orientation, which provides clear usage context. It does not explicitly name alternatives or exclusions, but the context is strong enough to guide an agent toward correct selection among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recent_sendsARead-onlyIdempotent
List recently sent emails from your Wraps email history, newest first, at most limit messages. The timestamp shown is the send time and is stable across calls. Returns send status, subject, recipient, timestamp, and messageId for each send. Use the messageId with get_email_event_log for full delivery details. The since parameter accepts a full ISO 8601 datetime string (e.g., 2024-01-01T00:00:00Z).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of messages to return, newest first (default 20). | |
| since | No | Only messages with activity at or after this ISO 8601 datetime. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sends | Yes | |
| hasMore | Yes | True when more sends exist beyond this page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it states the timestamp is the send time and is stable across calls, which is important for pagination/consistency expectations. It also discloses the returned fields (send status, subject, recipient, timestamp, messageId) and the limit cap behavior. This is meaningful added context, though it doesn't discuss rate limits or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose and ordering are in the first sentence, followed by the stable timestamp note, return fields, sibling pointer, and parameter clarification. Every sentence earns its place and there is no fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema present, the description is quite complete. It covers what is returned, the ordering, the stability of the timestamp, and how to follow up for full delivery details. It doesn't mention pagination beyond the limit parameter, but the stable timestamp and limit cap give enough for an agent to call it correctly. The output schema likely covers return structure, so the description need not explain it further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (limit and since) with descriptions. The description adds a bit of extra meaning by explaining the `since` parameter accepts a full ISO 8601 datetime string with an example, and by noting the default limit of 20 is in the schema. However, the schema already covers the semantics well, so the description's added value is marginal. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('recently sent emails from your Wraps email history'), and a clear ordering ('newest first'). It also names the sibling tool get_email_event_log for follow-up delivery details, which helps distinguish it from related tools. The scope is precise and an agent can tell it apart from send_email and get_email_event_log without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: to list recent sends and to obtain messageId for full delivery details via get_email_event_log. It does not explicitly state when not to use it or name alternatives for filtering/searching, but the sibling context and the explicit pointer to get_email_event_log provide adequate usage guidance. A small gap is that it doesn't mention that send_email is for creating sends, but that is fairly obvious from the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_suppressionsARead-onlyIdempotent
List addresses on your AWS SES account-level suppression list, or check a single address with email. SES silently drops mail to suppressed addresses, and sending to them damages your sending reputation, so check before sending to an address you have not sent to recently. To determine whether one specific address is suppressed, always pass email — that is an exact lookup. The listing is paginated and states explicitly when it is truncated; a truncated listing is never proof that an address is unsuppressed. Optionally filter the listing by reason (BOUNCE or COMPLAINT).
| Name | Required | Description | Default |
|---|---|---|---|
| No | Check this ONE address against SES and report whether it is suppressed. Use this for any "is <address> suppressed?" question: it is an exact lookup. Do NOT answer that question from the listing instead — the listing is paginated, so an address missing from it is not evidence the address is unsuppressed. `reason` and `limit` are ignored when this is set. | ||
| limit | No | Maximum number of addresses to list (default 20, max 100). The response always states whether the listing was truncated. | |
| reason | No | Only list addresses suppressed for this reason. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | lookup = exact single-address check; list = paged enumeration. |
| entries | Yes | |
| complete | Yes | False when SES reported more pages than were read; absence proves nothing. |
| suppressed | No | Only present for mode=lookup. Authoritative for that address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint=false, and idempotentHint, so the bar for added value is high. The description still adds meaningful behavior: SES silently drops mail to suppressed addresses, listing is paginated and states truncation explicitly, and `reason`/`limit` are ignored when `email` is set. This is context an agent needs beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action, then gives usage guidance, then the pagination caveat, then the optional filter. Every sentence earns its place, and the important warning about reputation damage is placed where it is most likely to influence an agent's decision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, full parameter coverage, and strong annotations, the description provides everything an agent needs to select and invoke the tool correctly. It explains when to use the exact-lookup mode, how to interpret truncation, and why checking is important.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema's own parameter descriptions already carry the important semantics: `email` is an exact lookup, `reason` and `limit` are ignored when `email` is set, and `limit` has a default and max. The tool description reinforces the email-vs-listing distinction but does not need to add parameter-level detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List addresses on your AWS SES account-level suppression list' and immediately adds the alternate exact-lookup mode with `email`. This clearly distinguishes the two behaviors the tool supports and leaves no ambiguity about what it operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit operational guidance: check before sending to unfamiliar addresses, always pass `email` for single-address questions, and never treat a truncated listing as proof of unsuppressed status. The input schema reinforces this with 'Do NOT answer that question from the listing instead,' making the decision path unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailADestructive
Send a transactional email via your AWS SES account. Requires WRAPS_WRITE_ENABLED=true. The from address must be a verified Wraps domain. The to field accepts a single address or an array of addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient address, or an array of up to 1000 addresses. | |
| from | No | Sender address. Must be a verified SES identity in this account. Defaults to WRAPS_FROM_EMAIL. | |
| html | No | HTML body. Provide `html`, `text`, or both; at least one is required. | |
| text | No | Plain-text body. Provide `html`, `text`, or both; at least one is required. | |
| subject | Yes | Subject line. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | Recipients the message was accepted for. |
| from | Yes | |
| messageId | Yes | SES message id; pass to get_email_event_log for delivery events. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-idempotent, so the mutation nature is disclosed. The description adds configuration prerequisites (WRAPS_WRITE_ENABLED, verified domain) but does not mention side effects like queuing, rate limits, or error responses. Acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose and key constraint, second covers address verification and array acceptance. Every word earns its place; no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Prerequisites and address constraints are covered. An output schema exists, so return format is handled. Missing rate-limit or quota guidance is minor for a send operation. Overall adequate for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 5 parameters with descriptions (100% coverage). The tool description adds only the verification requirement for 'from' and clarifies the array option for 'to', which is already in the schema. Minimal added value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific action ('Send a transactional email'), the resource ('your AWS SES account'), and key constraints (verified domain, array support). It clearly differentiates from siblings like list_recent_sends and get_email_event_log, which are read/verification tools. No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit prerequisites: WRAPS_WRITE_ENABLED=true and a verified Wraps domain for the from address. While it doesn't name alternatives or state when not to use, the purpose is self-evident versus sibling tools, and the conditions are actionable for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_domain_statusARead-onlyIdempotent
Check the verification and DKIM status of a sending domain in your AWS SES account. Returns whether the domain is verified for sending and its DKIM configuration status.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to check, e.g. example.com. SES identities are per-region. |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| region | Yes | SES identities are per-region; this is the region checked. |
| verified | Yes | True when SES will accept sends from this domain. |
| dkimStatus | Yes | SES DKIM status, e.g. SUCCESS, PENDING, FAILED. |
| dkimTokens | Yes | CNAME tokens to publish in DNS. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds specific return semantics (verification and DKIM status), which is useful and not redundant. It doesn't mention rate limits or auth, but for a read-only status check this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero filler. It front-loads the primary action and result, and every clause adds value. No redundant phrasing or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter, a detailed schema, and an output schema present, the description fully covers what an agent needs to know: what it does and what it returns. No critical operational details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description for the single parameter 'domain' is comprehensive (includes format, example, and per-region note), and schema coverage is 100%. The tool description adds no additional meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('Check') and identifies the exact resource ('verification and DKIM status of a sending domain in your AWS SES account'). It also specifies what is returned (verification and DKIM configuration status), making it distinct from all sibling tools, none of which target domain verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose is clear enough that an agent would know when to call it, but the description provides no explicit guidance on when to prefer this over get_setup_status, which could plausibly overlap. It neither states when not to use it nor names any alternatives, so the usage context is only implied.
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.
7 tool updates
v0.8.1- First observed
estimate_cost - First observed
get_email_event_log - First observed
get_setup_status - First observed
list_recent_sends - First observed
list_suppressions - First observed
send_email - First observed
verify_domain_status
TDQS
Scored across 7 tools
Each tool addresses a distinct aspect: sending, listing sends, retrieving event logs, checking domain verification, checking suppression list, checking setup status, and estimating cost. No two tools overlap in purpose, making selection unambiguous.
All tools follow a consistent verb_noun snake_case pattern (send_email, list_recent_sends, get_email_event_log, verify_domain_status, list_suppressions, get_setup_status, estimate_cost). This predictability aids agent routing.
With 7 tools covering send, monitor, diagnose, and plan, the surface is appropriately scoped for an email service without redundancy or bloat.
The set covers the core workflow: send, verify identity, check suppression, observe delivery events, and estimate cost. Missing administrative operations (e.g., adding domains) are reasonable omissions given the server's focus on sending and observability.
Maintenance
Related MCP Connectors
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Hosted email for AI agents: create inboxes, send, receive, and reply over MCP with scoped API keys
Shipmail MCP server for AI agent custom-domain email inboxes with REST API and webhooks.
Email inboxes for AI agents: send, receive, reply, search, and manage threaded email over MCP.
Related MCP Servers
- AlicenseBqualityCmaintenanceDisposable email MCP server for autonomous AI agents. Create labeled temporary inboxes, wait for verification emails, extract OTP codes and confirmation links — zero human intervention required.6MIT
- AlicenseAqualityDmaintenanceMCP server for Sendook - an AI email communication platform. Enables AI agents to send and receive emails, manage inboxes, threads, and webhooks programmatically.16MIT
- AlicenseNot gradedqualityDmaintenanceA production-ready MCP server that empowers AI agents to securely send emails via SMTP, supporting plain text, HTML, and attachments.MIT

fagents-mcpofficial
AlicenseNot gradedqualityCmaintenanceMCP server that enables Claude Code agents to send and read emails via SMTP/IMAP with per-agent credential isolation and audit logging.MIT