Skip to main content
Glama
smankoo

owlpost

read_email

Read-onlyIdempotent

Fetch one email by account, folder, and UID to inspect decoded headers, body, and attachment list without changing its unread status.

Instructions

Read one message: decoded headers, body and attachment list, without marking it read.

By default only the plain-text body is returned, truncated at 50,000 characters to fit MCP result limits; the untruncated sizes are always reported as text_full_length and html_full_length. Attachments are listed with a 1-based part index for save_attachment. Threading headers (message_id, in_reply_to, references) are included.

Args: account: Account name from list_accounts. folder: Folder containing the message. uid: Message UID from search_messages. include_html: Also return the HTML body (default false). HTML mail can be very large. include_text: Return the plain-text body (default true). body_max_chars: Truncate each body to this many characters (default 50000).

Input Schema

NameRequiredDescriptionDefault
uidYes
folderYes
accountYes
include_htmlNo
include_textNo
body_max_charsNo

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantial behavior context: default plain-text-only return, 50,000-char truncation to fit MCP limits, the always-reported text_full_length/html_full_length, and inclusion of threading headers. That is well beyond what the structured fields convey.

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?

Front-loaded with purpose and the key non-effect, then a well-organized Args block. Every sentence earns its place given the 0% schema coverage, though the prose section is a touch dense with parenthetical details.

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 6-param, 3-required read tool with an output schema, the description covers inputs, defaults, truncation behavior, and safe-read semantics. Since an output schema exists, it needn't enumerate return fields, and 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?

Schema description coverage is 0%, so the description must carry all parameter meaning, and it does: every one of the six args is documented with source hints (account from list_accounts, uid from search_messages), defaults, and rationale ('HTML mail can be very large'). This fully compensates for the schema gap.

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 and resource ('Read one message') plus the scope of what is returned (decoded headers, body, attachment list) and the key non-effect ('without marking it read'). This distinguishes it cleanly from siblings like search_messages, get_conversation, and mark_read.

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?

Explicitly routes the agent to sibling tools for its inputs ('Account name from list_accounts', 'Message UID from search_messages') and explains the 1-based `part` index is for save_attachment. It also implies mark_read is the alternative if you want read status changed. It lacks an explicit 'when not to use this' clause, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.