sch-mail
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SCH_MAIL_ALLOWED_DIRS | No | Replaces the default allowed folders for attachments. Absolute paths separated by os.pathsep (`:` on macOS and Linux). `~` is expanded and relative entries are ignored. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| sch_list_foldersA | List all mailbox folders. Returns folder names available in the sch.gr mailbox. Pass account (a key in credentials.json, e.g. "work") to pick a mailbox, or omit it for the account named by "default" in that file. |
| sch_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 in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
| sch_get_mailA | Read a specific message by UID (the "id" from sch_list_mail or sch_search_mail). Args: msg_id: Message UID from sch_list_mail / sch_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 in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
| sch_search_mailA | Search messages by keyword in subject, sender, or body. Result ids are IMAP UIDs, the same ids sch_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 in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
| sch_download_attachmentsA | Download attachments from a message to disk. Args: msg_id: Message UID from sch_list_mail / sch_search_mail folder: Mailbox folder (default: INBOX) out_dir: Directory to save files (default: ~/Downloads). Must lie inside the allowed folders (by default ~/Downloads and the temp dirs; SCH_MAIL_ALLOWED_DIRS replaces them). filename_filter: Only download files matching this substring (case-insensitive) account: Account key in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
| sch_mail_statsB | Quick mailbox statistics: total messages, recent/unseen counts, date range. Args: folder: Mailbox folder (default: INBOX) account: Account key in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
| sch_send_mailA | Send a new email via SMTP, or save as draft (default). Args: to: Recipient(s), comma-separated (e.g. "a@x.gr,b@y.gr") 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 be an existing file inside the allowed folders (by default ~/Downloads and the temp dirs; SCH_MAIL_ALLOWED_DIRS replaces them). One that is missing or outside them fails the whole call, so nothing is saved or sent without it. send_now: True to dispatch via SMTP immediately. Default False = save to Drafts folder. account: Account key in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. Returns dict with status ("draft_saved" or "sent"), folder/recipients, and message id. |
| sch_forward_mailA | Forward an existing message to new recipient(s), preserving attachments. Args: msg_id: Source message UID (from sch_list_mail / sch_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 in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. Returns status, subject, attachment count, and message id. |
| sch_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 sch_create_folder first if needed). Args: msg_id: Source message UID from sch_list_mail / sch_search_mail (one UID; ranges and lists are refused) dest_folder: Target folder name source_folder: Source folder (default: INBOX) account: Account key in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
| sch_create_folderA | 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 in credentials.json (e.g. "personal" or "work"). Default: the account named by "default" in that file. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 10 tools
Each tool targets a distinct action on the mail domain: listing, searching, reading, sending, forwarding, moving, downloading attachments, folder listing/creation, and stats. The closest pair (sch_list_mail vs sch_search_mail) is clearly separated as browse-vs-query, and both share the same UID semantics, so there is no realistic misselection.
The set follows a consistent sch_<verb>_<noun> pattern (sch_list_mail, sch_get_mail, sch_send_mail, sch_move_mail, sch_create_folder). The only deviation is sch_mail_stats, which puts the noun before the description rather than using a verb, but it remains readable.
Ten tools is a well-scoped size for an email client surface, covering reading, sending, organizing, and attachments without bloat. Every tool earns its place and none appears redundant.
Core lifecycle is covered (list, search, read, send, forward, move, create folder, attachments, stats), but notable operations are missing: no delete_mail or delete/rename folder, and no reply or mark read/unread. These are common email workflows whose absence forces agents to work around dead ends.