yahoo-access
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@yahoo-accesscheck my inbox and show me unread emails from this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
yahoo-access
MCP server for Yahoo Mail. IMAP read, SMTP send, multiple accounts, draft-first writes.
What this is
A Model Context Protocol server that exposes a Yahoo Mail mailbox to any MCP client (Claude Code, Claude Desktop, etc.). It talks IMAP for reads and SMTP for sends, supports several accounts side by side (keys you choose, e.g. personal and work; a call that names none uses the one the config marks as default), and defaults every send / forward to draft-first: the message is APPENDed to Yahoo's Draft folder for review, and only dispatched when the caller passes send_now=True.
Fork of sch-mail with the transport rewired for Yahoo (imap.mail.yahoo.com / smtp.mail.yahoo.com), a multi-account credential loader, quoted-mailbox handling, and destructive-op guards.
Related MCP server: Yahoo Mail MCP Server
Features
13 MCP tools covering the full mailbox lifecycle. All names are prefixed
yahoo_and every one takes an optionalaccountparameter.Read:
yahoo_check_auth,yahoo_list_folders,yahoo_list_mail,yahoo_get_mail,yahoo_search_mail,yahoo_download_attachments,yahoo_mail_statsWrite:
yahoo_send_mail,yahoo_forward_mail,yahoo_move_mail,yahoo_create_folder,yahoo_delete_mail,yahoo_empty_folder
Several accounts on one server. Config lives in
~/.yahoo-mail/accounts.json; passaccount="work"(any key in that file) to any tool to switch, omit it for the account the file marks as default.Draft-first by design.
yahoo_send_mailandyahoo_forward_mailsave to Yahoo's Draft folder unlesssend_now=True.yahoo_delete_mailmoves to Trash unlesspermanent=True.yahoo_empty_folderis a dry-run reporting the count unlessconfirm=True.Special-folder resolution. Draft / Sent / Trash targets are picked by IMAP special-use flag (
\Drafts,\Sent,\Trash), then falling back to name candidates. Yahoo's special folders are the singularDraftandSent, and a mailbox can also hold same-purpose folders without the flag (for example ones another mail client created), so name-only matching is unsafe.Preflight auth check.
yahoo_check_authverifies IMAP (and optionally SMTP) for one account or all, and returns actionable hints when the app password is right but IMAP is disabled on the account.IMAP folder quoting for folder names containing spaces, quotes or backslashes.
imaplibdoes not quote them itself. CR, LF and NUL are refused in every folder name, message id and search query, so no argument can end an IMAP command early and start another.Unicode search fallback. Non-ASCII queries (e.g. Greek) skip IMAP SEARCH and filter client-side over a 180-day header window, because IMAP SEARCH does not carry non-ASCII reliably across servers. Only headers are fetched on this path, so a non-ASCII query matches Subject and From only:
field="body"finds nothing andfield="all"silently narrows to subject plus sender.Attachment forwarding preserves payloads by re-attaching each part from the source message, not by re-encoding text bodies.
Hostile-message tolerant. A sender-declared charset Python does not know falls back to UTF-8 instead of failing the call, a malformed encoded-word or an attachment name that will not decode comes back as the raw text, a header carrying raw 8-bit bytes still reads as text, a MIME tree nested too deep to walk comes back as an error, and HTML stripping runs in linear time, so one crafted message cannot break listing or reading the rest of the mailbox.
Keychain-first credential loader. App passwords resolve macOS Keychain, then env var, then inline. No secrets land in the repo, nor in the config file unless you use the inline fallback.
Fenced file access. Attachments are read only from, and downloads written only into, an allowlist of folders, by default just
~/Downloadsand the temp folders (see File access). A path outside it is refused with an error, never silently skipped.
Prerequisites (per Yahoo account)
Enable 2-step verification, then generate an app password (Account Security -> External connections -> Create app password). Yahoo does not accept your login password over IMAP / SMTP.
Enable IMAP: Yahoo Mail -> Settings -> More Settings -> Mailboxes -> IMAP. If IMAP is off, every login fails with an auth error even when the app password is correct.
yahoo_check_authreturns a hint pointing at this.
Installation
Requires uv (pip install uv).
# HTTPS (no SSH key required):
git clone https://github.com/weirdapps/yahoo-access.git
# or, with SSH:
git clone git@github.com:weirdapps/yahoo-access.git
cd yahoo-access
uv sync --extra dev # builds .venv from the committed uv.lock
./setup.sh # run once per account (stores app password in Keychain, writes config)uv sync creates .venv in the repo root, which is where run_mcp.sh looks for the interpreter. Drop --extra dev for a runtime-only environment without pytest / ruff.
setup.sh stores the app password in the macOS Keychain (service yahoo-mail-<key>, e.g. yahoo-mail-personal) and appends the account to ~/.yahoo-mail/accounts.json. security itself prompts for the password, so it never appears on a command line. Re-run once per Yahoo address you want to attach.
Usage
Register with Claude Code
Add the server via the Claude Code CLI:
claude mcp add yahoo-mail /absolute/path/to/yahoo-access/run_mcp.shrun_mcp.sh execs .venv/bin/python -m server from the repo root. Once registered, tools appear as mcp__yahoo-mail__yahoo_* and the server starts on demand.
Example tool calls
Default account (whichever accounts.json marks as default), list the last 20 messages:
yahoo_list_mail(folder="INBOX", top=20)Switch to another configured account, here work:
yahoo_list_mail(folder="INBOX", top=20, account="work")Search Greek text (auto-falls back to a client-side filter over 180 days, matching Subject and From only):
yahoo_search_mail(query="πληρωμή", field="all")Draft a reply, review in Yahoo webmail, keep or discard:
yahoo_send_mail(
to="alice@example.com",
cc="bob@example.com",
subject="quarterly review",
body="<p>Draft goes here.</p>",
html=True,
)
# -> {"status": "draft_saved", "folder": "Draft", "message_id": "<...@yahoo.com>", ...}Same call, but dispatch immediately and archive to Sent:
yahoo_send_mail(..., send_now=True)
# -> {"status": "sent", "sent_folder_archive": "Sent", ...}Preflight every configured account (IMAP only, cheap):
yahoo_check_auth()
# -> {"personal": {"ok": True, ...}, "work": {"ok": True, ...}}Empty the Bulk folder (dry-run first, then confirmed):
yahoo_empty_folder(folder="Bulk") # {"status": "dry_run", "would_delete": 3, ...}
yahoo_empty_folder(folder="Bulk", confirm=True) # {"status": "emptied", "deleted": 3}Architecture
flowchart TD
Client["MCP client<br/>(Claude Code / Desktop)"]
Server["yahoo-access<br/>MCPServer, mcp SDK v2<br/>(server.py)"]
Config["~/.yahoo-mail/<br/>accounts.json<br/>(no passwords)"]
Keychain["macOS Keychain<br/>service: yahoo-mail-<key>"]
IMAP["imap.mail.yahoo.com:993<br/>SSL"]
SMTP["smtp.mail.yahoo.com:465<br/>SSL"]
Yahoo[("Yahoo Mail<br/>mailbox")]
Client -- "yahoo_* tool call<br/>account=personal | work" --> Server
Server -- "read email + service name" --> Config
Server -- "fetch app password<br/>per account" --> Keychain
Server -- "read: list / get / search /<br/>download / stats" --> IMAP
Server -- "write: send_now=True<br/>(else drafts via IMAP APPEND)" --> SMTP
IMAP --> Yahoo
SMTP --> YahooCode organization
Single-file server (server.py, ~1500 lines) laid out top to bottom:
Constants: IMAP / SMTP hosts and ports, config and instructions paths, folder candidates, the file-access allowlist;
_build_instructionsand theMCPServerobject.Local file access:
_allowed_dirs,_allowed_path,_quarantine.Credential loader:
_load_accounts,_keychain_password,_resolve_password,_load_credentials.Connection helpers:
_refuse_line_breaks,_q(IMAP mailbox quoting),_connect(IMAP4_SSL),_smtp_connect(SMTP_SSL).yahoo_check_authpreflight tool.Parsing helpers: charset-safe decode (
_decode_bytes), header decode with a raw fallback (_decode_header), depth-safe parse (_parse_message), date parse, HTML strip (linear time), hostile-header-safe attachment name and disposition reads (_get_filename,_disposition), attachment enumeration.Read tools:
yahoo_list_folders,yahoo_list_mail,yahoo_get_mail,yahoo_search_mail,yahoo_download_attachments,yahoo_mail_stats.Send helpers:
_build_message,_find_special_folder,_save_to_folder.Write tools:
yahoo_send_mail,yahoo_forward_mail,yahoo_move_mail,yahoo_create_folder,yahoo_delete_mail,yahoo_empty_folder.__main__:mcp.run().
Fresh IMAP / SMTP connection per tool call, closed in finally. No pooling.
Configuration
Config file
~/.yahoo-mail/accounts.json (mode 600, gitignored):
{
"accounts": {
"personal": {
"email": "you@yahoo.com",
"keychain_service": "yahoo-mail-personal"
},
"work": {
"email": "someone.else@yahoo.com",
"keychain_service": "yahoo-mail-work"
}
},
"default": "personal"
}The file holds no passwords. setup.sh writes it for you. The account keys are yours to choose; tools accept any key in this file, and default names the account used when a call names none.
Local instructions (optional)
The server hands MCP clients a generic instructions text. If ~/.yahoo-mail/instructions.md exists, its content is appended to that text at startup. Put installation-specific guidance there (which accounts exist and what each is for, house rules for a mailbox), so it stays out of the repo. Restart the server after editing the file.
File access
yahoo_send_mail reads attachments only from, and yahoo_download_attachments writes only into, these folders (symlinks are resolved before the check):
~/Downloadsthe system temp directory and
/tmp
Folders that hold your own documents, such as ~/Documents, ~/Desktop or ~/Library/CloudStorage, are left out on purpose. Message content can steer the agent calling these tools, and any file in an allowed folder can be attached to an outgoing message, so widening the list is a decision you make explicitly.
Set YAHOO_MAIL_ALLOWED_DIRS to a list of folders separated by os.pathsep (: on macOS and Linux) to replace that list, for example in the env of the MCP server entry. It replaces the defaults rather than adding to them, so name ~/Downloads again if you still want it; ~ is expanded:
"env": {"YAHOO_MAIL_ALLOWED_DIRS": "~/Downloads:~/Documents/mail-outbox"}A refused path returns an error naming the variable: yahoo_download_attachments writes nothing, and yahoo_send_mail neither saves nor sends the message. Downloaded files never start with a dot: a leading . in a sender-supplied file name becomes _. On macOS each saved file is tagged com.apple.quarantine, as Mail.app does, so Gatekeeper still checks a sender-supplied app, script or installer when it is opened.
Password resolution order
For account key <key> with email = <addr>, the loader tries:
macOS Keychain:
/usr/bin/security find-generic-password -s <keychain_service> -a <addr> -wEnvironment variable:
YAHOO_APP_PASSWORD_<KEY>(uppercased key)Inline
passwordfield inaccounts.json(last resort, not recommended)
Only the first non-empty match is used. If all three miss, _resolve_password raises with a security add-generic-password command you can copy-paste.
IMAP / SMTP endpoints
Hardcoded in server.py:
IMAP:
imap.mail.yahoo.com:993(SSL)SMTP:
smtp.mail.yahoo.com:465(SSL)
Development
.venv/bin/pytest -v # 170 tests, all offline (mocked IMAP / SMTP)
.venv/bin/ruff check server.py tests/
.venv/bin/ruff format server.py tests/Pre-commit hook (see .pre-commit-config.yaml) runs ruff format and ruff check --fix on staged files.
CI (.github/workflows/ci.yml) does uv sync --extra dev --frozen, then runs the same ruff check + pytest, on Ubuntu with Python 3.12 for every push and PR. --frozen means a dependency change must land together with a refreshed uv.lock or CI fails.
Dependabot (.github/dependabot.yml) tracks uv and github-actions weekly. .github/workflows/dependabot-auto-merge.yml is a thin caller of the shared reusable workflow at weirdapps/shared-workflows: it waits for this PR's own checks and squash-merges green patch / minor bumps, leaving standalone majors open for review.
Tests live under tests/ and never talk to Yahoo. They mock imaplib.IMAP4_SSL and smtplib.SMTP_SSL, so you can run the suite offline without any credentials configured.
Security
App passwords live in the macOS Keychain, never in the repo. ~/.yahoo-mail/accounts.json contains no passwords and is gitignored. The Keychain keeps them off disk in plain text, but it does not hide them from your own processes: an item setup.sh creates can be read back by /usr/bin/security without a prompt, which is how the server reads it, so any program running as your macOS user can do the same.
Message content is written by whoever sent it, and the agent calling these tools reads it. Keep send_now=True, forwarding and the destructive tools behind your MCP client's approval prompt. The default file-access allowlist is ~/Downloads plus the temp folders: add a folder to it only if you would accept any file in it being attached to an outgoing message. See SECURITY.md for how to report a vulnerability.
License
MIT. See LICENSE.
Available Tools
13 toolsyahoo_check_authA
Preflight: verify IMAP (and optionally SMTP) login for one or all accounts.
Args: account: Account key from accounts.json, e.g. "personal" or "work". None = check all. check_smtp: Also verify SMTP login (default: IMAP only).
Returns a dict keyed by account name with ok/stage/error/hint fields.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| check_smtp | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and it does reasonably well: it discloses the two verification scopes (IMAP only by default, SMTP optionally), the all-accounts case, and the return shape (ok/stage/error/hint). It omits side-effect/auth-persistence details, but for a non-mutating credential check this is solid coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by short Args and Returns blocks; every line carries information. The Returns block mildly duplicates the output schema, which is the only wasted space.
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 two-parameter, output-schema-backed preflight check, the description covers scope, defaults, and result structure adequately. Failure semantics (what 'stage' values mean) are left to the output schema, which is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry both parameters, and it does: 'account' is defined as an accounts.json key with None meaning check-all, and 'check_smtp' is defined as also verifying SMTP with a stated IMAP-only default. Nothing needed to call the tool is missing.
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: verify IMAP login (optionally SMTP) for one or all accounts. The 'Preflight' framing immediately separates it from all sibling mail-operation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Preflight' clearly signals this should be run before other mail operations, and 'check all' vs single-account behavior is stated. It does not explicitly name alternatives or state when not to call it, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_create_folderB
Create a new mailbox folder.
Args: name: Folder name. For nested folders use the server's separator (commonly "/" or ".", e.g. "INBOX/Archive2026" or "Archive.2026"). subscribe: Subscribe to the folder so it appears in mail clients (default: True). account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| account | No | ||
| subscribe | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden. It usefully discloses two defaults ('subscribe' defaults True and its client-visibility effect; account falls back to the file-marked default), but is silent on duplicate-name handling, required permissions/auth, error behavior, and idempotency for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the per-argument notes are scoped tightly to one field each. It is slightly verbose with the multi-line separator explanation, but no sentence is wasted.
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?
An output schema exists, so return-value detail is not required, and all three parameters are covered. The remaining gap is behavioral: duplicate handling and auth/permission expectations are unstated, which matters more given the absence of annotations on a create operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: 'name' gets nested-folder separator guidance with concrete examples, 'subscribe' explains its default and effect, and 'account' explains the key source and default behavior. This is genuinely additive, though 'account' formatting could be tightened.
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+resource ('Create a new mailbox folder'), which is unambiguous and clearly distinct from read-oriented siblings like yahoo_list_folders or destructive ones like yahoo_empty_folder. It does not, however, explicitly name a sibling or contrast scope, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing tells the agent to check existing folders first via yahoo_list_folders, or how this relates to yahoo_empty_folder. The Args block describes inputs but never states conditions or alternatives, leaving routing entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_delete_mailA
Delete a single message, addressed by UID. Default: move to Trash (reversible).
Args: msg_id: Message UID (from yahoo_list_mail / yahoo_search_mail; one UID, ranges and lists are refused) folder: Folder the message lives in (default: INBOX) permanent: True = mark \Deleted + expunge this UID in place (IRREVERSIBLE); False (default) = move to the Trash folder. account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | INBOX | |
| msg_id | Yes | ||
| account | No | ||
| permanent | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it discloses that the default is a reversible move to Trash, that permanent=true performs \Deleted + expunge in place and is IRREVERSIBLE, and it flags that ranges/lists are refused. That is exactly the safety context annotations would otherwise supply.
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 one-line summary is front-loaded with the destructive-mode default before any argument detail, and each Args line adds distinct information with no repetition of the schema's titles.
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?
An output schema exists so return values needn't be described; with the destructive-path behavior, account resolution rule, and parameter constraints all covered, an agent has everything needed to call this mutation safely.
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 0%, so the description must compensate for all four parameters — and it does, giving each a meaning, a default, and for msg_id a provenance note plus an explicit constraint ('one UID, ranges and lists are refused') that the schema does not convey.
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 ('Delete a single message, addressed by UID') and scopes it to exactly one message, which separates it from siblings like yahoo_empty_folder and yahoo_move_mail without opening their 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?
Explicitly contrasts the two modes (default move-to-Trash vs permanent expunge) and tells the caller where msg_id comes from (yahoo_list_mail / yahoo_search_mail), but it never names an alternative tool for related intents such as moving rather than deleting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_download_attachmentsA
Download attachments from a message to disk.
Args: msg_id: Message UID from yahoo_list_mail / yahoo_search_mail folder: Mailbox folder (default: INBOX) out_dir: Directory to save files (default: ~/Downloads). Must lie inside an allowed folder: ~/Downloads or a temp folder (the system temp dir, /tmp), unless YAHOO_MAIL_ALLOWED_DIRS replaces that list. Anything else is refused. filename_filter: Only download files matching this substring (case-insensitive) account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | INBOX | |
| msg_id | Yes | ||
| account | No | ||
| out_dir | No | ||
| filename_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose meaningful behavior: a filesystem write with a hard security constraint (allowed directories, refusal of anything else, YAHOO_MAIL_ALLOWED_DIRS override) and default account resolution from accounts.json. It omits overwrite behavior, what happens when no attachments match, and any size/rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by structured Args entries; each line adds real meaning. The out_dir entry is the longest but its length is justified by the security constraint it conveys.
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?
An output schema exists, so return-value explanation is unnecessary, and the description covers the risky parts (write target restrictions, account selection, filtering). Minor gaps remain around the no-match/no-attachment case and error behavior, but an agent has what it needs to invoke it 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 description coverage is 0% (all 5 params undocumented in the schema), yet the description documents every one: msg_id provenance, folder default INBOX, out_dir default plus the security restriction, filename_filter as a case-insensitive substring match, and account key/default semantics.
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 (download) and resource (attachments from a message) with the destination (to disk). No sibling tool overlaps this action, so an agent can identify it unambiguously from the name and first sentence.
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?
It tells the agent where msg_id comes from (yahoo_list_mail / yahoo_search_mail), which is useful routing context, but gives no explicit when-to-use/when-not guidance or alternatives for retrieving attachments versus other mail operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_empty_folderA
PERMANENTLY delete ALL messages in a folder (mark \Deleted + EXPUNGE).
Intended for Bulk (spam) and Trash. Irreversible.
Safety: with confirm=False (default) NOTHING is deleted — it returns the count that WOULD be purged. Pass confirm=True to actually empty the folder.
Args: folder: Folder to empty (e.g. "Bulk", "Trash") confirm: Must be True to actually delete. Default False = dry run. account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | ||
| account | No | ||
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the destructive mechanism, irreversibility, and the critical default-safe behavior (confirm=False returns a would-purge count and deletes nothing). This is exactly the behavioral context an agent needs before invoking a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive action and safety note, then a well-organized Args block. The Args section partly restates schema field names, but since schema coverage is 0% that repetition is load-bearing rather than wasteful; a slightly leaner phrasing would be marginally better.
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?
An output schema exists, so return values needn't be spelled out, and the description still explains the meaningful return case (the dry-run count). Combined with full parameter and safety coverage for a destructive 3-param tool, nothing an agent needs 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?
Schema description coverage is 0%, so the description must compensate, and it documents all three parameters: folder with examples, confirm with its default/dry-run semantics, and account with its source (accounts.json) and default resolution. No parameter is left ambiguous.
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 ('PERMANENTLY delete ALL messages in a folder') plus the underlying mechanism (mark \Deleted + EXPUNGE), which no sibling describes. An agent can distinguish it from yahoo_delete_mail or yahoo_move_mail from the description alone.
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?
Explicitly scopes intended targets ('Intended for Bulk (spam) and Trash') and flags irreversibility, giving clear when-to-use context. It does not name an alternative tool (e.g. yahoo_delete_mail) or state when NOT to use this versus a selective delete, so it falls 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.
yahoo_forward_mailA
Forward an existing message to new recipient(s), preserving attachments.
Args: msg_id: Source message UID (from yahoo_list_mail / yahoo_search_mail) to: Recipient(s), comma-separated cc: CC recipient(s) bcc: BCC recipient(s) additional_text: Optional text prepended above the forwarded content (plain text) folder: Source folder (default: INBOX) send_now: True to dispatch immediately. Default False = save to Drafts. account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
Returns status, subject, attachment count, and message id.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| folder | No | INBOX | |
| msg_id | Yes | ||
| account | No | ||
| send_now | No | ||
| additional_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does reasonably well: it discloses the critical draft-vs-send behavior (send_now default False saves to Drafts), the default source folder, the default account resolution (accounts.json), and that additional_text is plain text prepended above forwarded content. It omits auth requirements, rate limits, and whether the source message is modified.
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 purpose is front-loaded in one sentence, followed by a clean per-argument list. It is slightly padded by the 'Returns' line, which duplicates the existing output schema, but overall it is tight and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no annotations, the description covers every argument's meaning and defaults, plus the draft/send behavioral split. Because an output schema exists, the return-value sentence is a minor bonus rather than a necessity, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for all 8 parameters: msg_id provenance, comma-separated recipient syntax, cc/bcc roles, additional_text format and placement, folder default, send_now semantics, and the account key format with its default. This fully closes the schema gap.
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 ('Forward an existing message'), plus a distinguishing trait ('preserving attachments'). This separates it from the sibling yahoo_send_mail, which composes a new message rather than forwarding an existing one.
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?
It implies usage by tracing msg_id back to yahoo_list_mail / yahoo_search_mail and by explaining that send_now=False yields a draft rather than a dispatch. However, it never explicitly says when to choose this over yahoo_send_mail or what prerequisites (auth via yahoo_check_auth) are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_get_mailA
Read a specific message by UID (the "id" from yahoo_list_mail or yahoo_search_mail).
Args: msg_id: Message UID from yahoo_list_mail / yahoo_search_mail folder: Mailbox folder (default: INBOX) body: Body format: "text" (plain text, default), "html", or "none" max_body_chars: Truncate body to this many chars (default: 5000) account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | text | |
| folder | No | INBOX | |
| msg_id | Yes | ||
| account | No | ||
| max_body_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden, and 'Read' does signal a non-mutating operation. It also documents useful defaults (folder=INBOX, body=text, max_body_chars=5000) and the truncation behavior. However, it says nothing about auth/permission requirements, rate limits, or what happens when a UID is absent.
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 purpose is front-loaded in the first line, followed by a compact args list where each entry earns its place. The structure is clean and proportionate to a 5-parameter tool, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return formatting need not be described, and the description fully documents inputs. What remains thin is behavioral context (permissions, error/edge behavior) for a tool with zero annotation coverage, but for a simple read operation the definition is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning, and it covers all five parameters: msg_id provenance, folder default, body format options (text/html/none), truncation limit, and the account key from accounts.json with its default. This meaningfully exceeds the bare schema and enables correct invocation.
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 ('Read a specific message by UID') and ties it directly to the sibling tools that produce the UID ('the "id" from yahoo_list_mail or yahoo_search_mail'). An agent can distinguish this fetch-by-id tool from the list/search siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the workflow context by stating the msg_id comes from yahoo_list_mail or yahoo_search_mail, implying this tool is used after a listing/search step. It does not, however, state explicit exclusions or alternatives (e.g., when to prefer search over this).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_list_foldersB
List all mailbox folders.
Returns folder names available in the Yahoo mailbox. Use account="" for another account in accounts.json, or omit it for the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds useful context by stating that it returns folder names and explains the account default behavior, but it omits any authentication requirements, rate limits, or error behavior. A read-only listing is low-risk, but the absence of annotations leaves gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, but the second sentence ('Returns folder names available in the Yahoo mailbox') largely repeats the first sentence. Since an output schema exists, this return-value sentence may not earn its place, creating redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and an output schema, the description covers purpose and parameter behavior adequately. It does not address authentication, but the low complexity and presence of an output schema make the definition largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single optional account parameter, so the description must compensate. It does so effectively by explaining that account="<key>" refers to another account in accounts.json, and that omitting it uses the default account marked in that file. This fully clarifies the parameter's semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List all mailbox folders.' This clearly distinguishes the tool from mail-related siblings like yahoo_list_mail and yahoo_get_mail. However, it does not explicitly differentiate itself from other folder-related siblings such as yahoo_create_folder or yahoo_empty_folder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. The only usage instruction concerns the account parameter, not tool selection. There is no mention of prerequisites or conditions under which folder listing is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_list_mailA
List recent messages with subject, sender, date, and attachment indicators.
Each result's "id" is the message's IMAP UID: stable across calls, unlike a sequence number, and the value every msg_id parameter expects.
Args: folder: Mailbox folder (default: INBOX) top: Max messages to return (default: 20, max: 100) since: Only messages after this date (YYYY-MM-DD). Default: last 30 days. account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| since | No | ||
| folder | No | INBOX | |
| account | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers real behavioral context: the effective default of last 30 days when no date is given (schema only shows null), default folder INBOX, max 100 results, and account resolution from accounts.json. What it omits is the safety profile (that this is a non-mutating read) and any error/auth failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, followed by the non-obvious id/IMAP-UID note, then a compact Args block. Every sentence carries information the agent cannot get from the schema, and there is no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, and all parameters are documented. The main remaining gap is that pagination beyond a single top-window, auth requirements, and behavior on invalid folder/date are unspecified for a 4-parameter listing tool with 12 siblings.
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 0%, so the description must compensate and it does: it documents all four parameters with types, defaults (top=20, folder=INBOX, account=file default), the YYYY-MM-DD date format for 'since', the max of 100, and the meaning of the account key. This goes well beyond the bare titles and defaults in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'List recent messages' with the fields returned (subject, sender, date, attachment indicators). It is clear what the tool does, but it never positions itself against siblings like yahoo_search_mail or yahoo_get_mail, so the agent must infer the boundary between browsing recent mail and querying it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the default 'last 30 days' window and by the note that the returned id is what 'every msg_id parameter expects', which hints at the browse-then-act workflow with get_mail/move_mail/delete_mail. However, there is no explicit when-to-use versus when-not, and no mention of search_mail as the alternative for targeted queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_mail_statsA
Quick mailbox statistics: total messages, recent/unseen counts, date range.
Args: folder: Mailbox folder (default: INBOX) account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | INBOX | |
| account | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It implies a safe read-only count operation and discloses defaulting behavior (folder defaults to INBOX, account defaults to the one marked default), but never explicitly states it is read-only, requires auth, or what the output shape is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded summary sentence followed by a compact Args block; every line is useful. Slightly loose as a prose description but appropriately sized for a 2-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the description already names the three stat categories. Both parameters are documented, so the only real gap is the absence of explicit read-only/auth confirmation for a tool with zero annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it defines folder as the mailbox folder with the INBOX default and account as an accounts.json key with examples ('personal', 'work') plus the default rule. That adds real meaning the schema lacks, though formats/valid values remain loose.
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+resource (mailbox statistics) and enumerates what is returned: total messages, recent/unseen counts, date range. This clearly separates it from yahoo_list_mail and yahoo_search_mail, though it never explicitly names a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Quick' and the stats framing imply this is the lightweight summary tool rather than a message-listing tool, but there is no explicit when-to-use vs when-not guidance or named alternative among the many sibling mail tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_move_mailA
Move one message, addressed by UID, from source_folder to dest_folder.
Uses UID MOVE when the server supports it, else UID COPY + \Deleted + UID EXPUNGE, and a bare EXPUNGE only on a server with neither MOVE nor UIDPLUS. Destination folder must already exist (use yahoo_create_folder first if needed).
Args: msg_id: Source message UID from yahoo_list_mail / yahoo_search_mail (one UID; ranges and lists are refused) dest_folder: Target folder name source_folder: Source folder (default: INBOX) account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| msg_id | Yes | ||
| account | No | ||
| dest_folder | Yes | ||
| source_folder | No | INBOX |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does so well: it discloses the server-dependent execution path (UID MOVE, else UID COPY + \Deleted + UID EXPUNGE, else bare EXPUNGE), which is real behavioral context an agent cannot infer. It omits auth/permission requirements and does not say the source message is removed, but the mechanism disclosure is unusually 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?
Front-loads the action, then the mechanism, then prerequisites, then an Args block. Every sentence earns its place, though the multi-line protocol explanation is dense enough to be slightly heavy for a single-field move.
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?
Output schema exists, so return values need not be explained. Prerequisites, parameter semantics, and the fallback mechanism are covered; only auth/permission expectations are left unstated, which is a minor gap for a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it documents all four parameters: msg_id as a single UID with ranges/lists refused, dest_folder as target name, source_folder defaulting to INBOX, and account as an accounts.json key with a default. This adds meaning well beyond the bare schema titles.
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 ('Move one message') plus the addressing scheme ('addressed by UID') and source/destination folders. An agent can distinguish this from yahoo_delete_mail, yahoo_empty_folder, or yahoo_list_mail without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives prerequisites clearly: the destination folder must already exist and yahoo_create_folder should be used first if needed, and it points to yahoo_list_mail / yahoo_search_mail as the source of the UID. It does not state when another tool (e.g. delete or copy) is preferred, so it stops just short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_search_mailA
Search messages by keyword in subject, sender, or body.
Result ids are IMAP UIDs, the same ids yahoo_list_mail returns.
Args: query: Search text (case-insensitive) folder: Mailbox folder (default: INBOX) field: Where to search: "subject", "from", "body", or "all" (default: subject) since: Only search after this date (YYYY-MM-DD) top: Max results (default: 20) account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| field | No | subject | |
| query | Yes | ||
| since | No | ||
| folder | No | INBOX | |
| account | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that result IDs are IMAP UIDs matching yahoo_list_mail's output, which is context beyond the schema. But it does not state that the operation is read-only, nor does it mention authentication requirements, rate limits, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then a useful return-ID note, then a well-structured Args list. Every item is necessary given the 0% schema description coverage, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter search tool with no annotations but an output schema, the description covers purpose, all input semantics, defaults, and the key return-value identifier. Nothing essential for correct invocation 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?
Schema description coverage is 0%, so the description must compensate, and it does so thoroughly. Every one of the six parameters is documented with meaning, allowed values or formats, and defaults: query is case-insensitive, folder defaults to INBOX, field accepts subject/from/body/all, since uses YYYY-MM-DD, top defaults to 20, and account is an accounts.json key.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search messages by keyword in subject, sender, or body.' It also notes that result IDs are IMAP UIDs matching yahoo_list_mail, which aids cross-referencing. However, it does not explicitly distinguish this tool from siblings like yahoo_list_mail or yahoo_get_mail beyond the implicit search-vs-list difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given about when to use this tool versus alternatives such as yahoo_list_mail or yahoo_get_mail. The description only states the operation and its arguments, leaving the agent to infer that this is the keyword-search tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yahoo_send_mailA
Send a new email via SMTP, or save as draft (default).
Args: to: Recipient(s), comma-separated (e.g. "a@x.com,b@y.com") subject: Subject line body: Email body (plain text by default; set html=True for HTML) cc: CC recipient(s), comma-separated bcc: BCC recipient(s), comma-separated html: True if body is HTML; False (default) for plain text attachments: List of absolute file paths to attach. Each must lie inside an allowed folder: ~/Downloads or a temp folder (the system temp dir, /tmp), unless YAHOO_MAIL_ALLOWED_DIRS replaces that list. Otherwise nothing is saved or sent and an error is returned. send_now: True to dispatch via SMTP immediately. Default False = save to Drafts folder. account: Account key from accounts.json, e.g. "personal" or "work". Default: the account that file marks as default.
Returns dict with status ("draft_saved" or "sent"), folder/recipients, and message id.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | ||
| bcc | No | ||
| body | Yes | ||
| html | No | ||
| account | No | ||
| subject | Yes | ||
| send_now | No | ||
| attachments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it explains that send_now=False saves to Drafts, that attachments must sit in allowed folders (default ~/Downloads or temp, overridable via YAHOO_MAIL_ALLOWED_DIRS) or the operation fails, and that account defaults to the file-marked default. It stops short of covering auth/permission prerequisites or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Format is well front-loaded: a one-line purpose followed by an Args list, so the key behavior precedes the detail. The per-argument lines are mostly single clauses that earn their place, though the attachments note is comparatively verbose.
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 nine-parameter mutation tool with no annotations, the description covers the critical behavioral facts (draft-vs-send default, attachment folder constraint, account default), and an output schema exists so return-shape explanation is not required. It is largely sufficient, with only prerequisite/error semantics beyond attachments lightly covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate, and its Args block documents all nine parameters including format hints ('comma-separated'), the html flag semantics, allowed attachment directories, and the account key convention. This adds meaning well beyond the bare schema types.
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 ('Send a new email via SMTP, or save as draft') and immediately flags the default behavior of saving a draft. This cleanly distinguishes it from siblings like yahoo_forward_mail and yahoo_move_mail, so an agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The dual mode (send vs draft) is implied through the send_now default, giving some sense of when each path applies. However, it never names alternatives such as yahoo_forward_mail or states when-not to use this tool, so usage guidance remains inferred rather than explicit.
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.
13 tool updates
v0.1.0- First observed
yahoo_check_auth - First observed
yahoo_create_folder - First observed
yahoo_delete_mail - First observed
yahoo_download_attachments - First observed
yahoo_empty_folder - First observed
yahoo_forward_mail - First observed
yahoo_get_mail - First observed
yahoo_list_folders - First observed
yahoo_list_mail - First observed
yahoo_mail_stats - First observed
yahoo_move_mail - First observed
yahoo_search_mail - First observed
yahoo_send_mail
TDQS
Scored across 13 tools
Each tool maps to a clearly distinct mail operation: folder listing/creation, message listing/getting/searching, sending/forwarding, moving, deleting, attachments, stats, and auth checks. The overlap between single-message delete and bulk empty-folder is explicitly scoped, so an agent can select correctly without confusion.
All tools use the same yahoo_ prefix and snake_case convention, with predictable verb_noun naming in almost every case. The lone noun-style name (yahoo_mail_stats) still follows the same overall style, so the set is highly consistent.
At 13 tools, the set is well-scoped for an email access server. Each tool corresponds to a meaningful operation, and there are no obviously redundant entries inflating the count.
The core mailbox lifecycle is covered: listing/searching/reading, sending/drafting/forwarding, moving/deleting, attachments, folder management, and stats. Missing flag/read-state operations and a dedicated reply tool are minor gaps that agents can mostly work around.
Maintenance
Related MCP Connectors
Your mailbox for MCP clients: search, read, draft, send, rules and notes. Sending is off by default.
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Your IMAP mailbox as an MCP server: read, search and (if you allow it) organize mail. Open source.
Your agent needs a mailbox of its own — to receive, thread, draft and send, with attachments, without borrowing your personal inbox or your company's SMTP. **What you can ask for** • "Create an inbox for this agent and tell me its address." • "Read the new messages in this thread and draft a reply." • "Send this message with the attachment and wait for the response." • "Search this inbox for everything from that domain." • "Show delivery metrics and the events on this inbox." **How to use it** Point any MCP client at https://mcp.aisa.one/mail/mcp and sign in with OAuth — there is no key to create or paste. 49 tools: create and delete inboxes, list and read messages, raw message bodies, attachments, threads, drafts and draft attachments, send and reply, message search, inbox events, metrics, and list entries — reads and writes. **Why this rather than the source** A real inbox an agent owns, rather than an SMTP credential it borrows from a human. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Find the contact elsewhere in the catalogue, then write to them from here — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/sales/mcp finds the person to write to.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables reading, searching, composing, and managing Yahoo Mail emails via IMAP with OAuth support for both local and remote MCP clients.23 npmISC
- FlicenseAqualityBmaintenanceAn MCP server that provides full email management for Yahoo Mail via IMAP, including tools to list, read, search, delete, archive, flag, and move emails, with secure OAuth authentication and support for local and remote deployments.111-
- FlicenseNot gradedqualityBmaintenanceEnables read-only, sanitized access to Yahoo Mail through MCP, including email summaries, search, and folder listing.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to read, organize, draft, and send Yahoo Mail email with user approval, integrating with various clients via a remote MCP endpoint.-