Get email
get_emailGet a single email by public id (msg_…).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Email id (msg_…) |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| Yes |
get_emailGet a single email by public id (msg_…).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Email id (msg_…) |
| Name | Required | Description | Default |
|---|---|---|---|
| Yes |
Changes observed during successful MCP inspections.
Output schema / (root)Previous value: -nullNew value: +{
+ "properties": {
+ "email": {
+ "properties": {
+ "bcc": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "bounce_reason": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "bounced_at": {
+ "description": "ISO 8601",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cancelled_at": {
+ "description": "ISO 8601",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cc": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "created_at": {
+ "description": "ISO 8601",
+ "type": "string"
+ },
+ "delivered_at": {
+ "description": "ISO 8601",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "from": {
+ "type": "string"
+ },
+ "id": {
+ "description": "Email id (msg_…)",
+ "type": "string"
+ },
+ "last_event": {
+ "description": "Latest delivery event",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "reply_to": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "scheduled_at": {
+ "description": "ISO 8601",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sent_at": {
+ "description": "ISO 8601",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "status": {
+ "type": "string"
+ },
+ "subject": {
+ "type": "string"
+ },
+ "tags": {
+ "description": "Tags set on the send"
+ },
+ "to": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "email"
+ ],
+ "type": "object"
+}Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds nothing behavioral beyond that, only restating the id prefix that also appears in the schema, so it meets the minimum bar without adding context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the verb, the resource, the selector, and the id format with zero filler. Nothing in it is redundant within the description itself.
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 trivial one-parameter read, an output schema exists, annotations cover safety, and the parameter is fully documented, so the description is essentially sufficient. The only gap is that it does not distinguish this tool from get_received_email for an agent choosing between them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented with the same msg_… format hint the description repeats. Per the rubric, a fully-covered schema sets the baseline at 3, and the description adds no extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single email') plus the key selector ('by public id (msg_…)'), so an agent knows this is a single-item fetch rather than a list. It does not differentiate itself from the sibling get_received_email, which is the main residual 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?
Usage is only implied: the mention of 'by public id' signals it is the tool to call when you already hold a msg_ id, but there is no explicit when-to-use, no prerequisite statement, and no routing against list_emails or get_received_email.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Add one secure layer between your agents and this server.