# owlpost (pypi · owlpost)

IMAP/SMTP email for iCloud, Gmail, Proton Bridge and more: search, read, follow threads, send.

- Trust score: 62/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- oci · `ghcr.io/smankoo/owlpost`: 10/100, [markdown](https://verifymcp.io/servers/smankoo-owlpost/ghcr-io-smankoo-owlpost.md), [page](https://verifymcp.io/servers/smankoo-owlpost/ghcr-io-smankoo-owlpost)
- pypi · `owlpost`: 62/100 (this document), [markdown](https://verifymcp.io/servers/smankoo-owlpost/owlpost.md), [page](https://verifymcp.io/servers/smankoo-owlpost/owlpost)

## Channel facts

- Registry: `pypi`
- Package: `owlpost`
- Version: `0.2.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 0 of 28 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to smankoo/owlpost).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 4 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 63/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2858 tokens (~190/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (40% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the owlpost MCP server?

owlpost runs locally as a PyPI package, launched with uvx owlpost. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add smankoo-owlpost -- uvx owlpost
```

### Cursor

```json
{
  "mcpServers": {
    "smankoo-owlpost": {
      "command": "uvx",
      "args": [
        "owlpost"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "smankoo-owlpost": {
      "command": "uvx",
      "args": [
        "owlpost"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add smankoo-owlpost -- uvx owlpost
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "smankoo-owlpost": {
      "type": "local",
      "command": [
        "uvx",
        "owlpost"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add smankoo-owlpost --command uvx --arg owlpost
```

### Hermes

```yaml
mcp_servers:
  smankoo-owlpost:
    command: "uvx"
    args: ["owlpost"]
```

### Netclaw

```json
{
  "McpServers": {
    "smankoo-owlpost": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "owlpost"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add smankoo-owlpost -t stdio -c uvx -a owlpost
```

### Other

```json
{
  "mcpServers": {
    "smankoo-owlpost": {
      "command": "uvx",
      "args": [
        "owlpost"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-23 (score 62, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-20 (score 77, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-19 (score 62)

First indexed and scored.

## MCP tools (15)

### `list_accounts` (~93 tokens)

List the mail accounts configured in owlpost's accounts.toml.

Returns one entry per account with its `name` (the value to pass as
\`account` to every other tool), email address, provider (icloud, gmail
or generic), IMAP/SMTP hostnames and whether sent mail is auto-saved.
Passwords and password sources are never included. Takes no arguments
and does not contact any mail server.

Output parameters:

- `result` (array)

### `list_folders` (~109 tokens)

List every IMAP folder (mailbox) in an account.

Each entry has the folder `name` to use in other tools, its raw IMAP
flags, the hierarchy delimiter, and a detected `role` (inbox, sent,
trash, drafts, junk, archive, all, flagged, important) based on RFC 6154
SPECIAL-USE flags, or null for ordinary folders.

Args:
    account: Account name from list_accounts.

Input parameters:

- `account` (string, required)

Output parameters:

- `result` (array)

### `resolve_folder` (~122 tokens)

Resolve a special-use role to the provider-specific folder name.

For example "sent" becomes "Sent Messages" on iCloud and
"[Gmail]/Sent Mail" on Gmail. Uses SPECIAL-USE flags first and falls back
to common folder names. Returns null if no matching folder exists.

Args:
    account: Account name from list_accounts.
    role: One of inbox, sent, trash, drafts, junk, archive, all, flagged
        or important (case-insensitive).

Input parameters:

- `account` (string, required)
- `role` (string, required)

Output parameters:

- `result`

### `search_messages` (~418 tokens)

Search one folder with structured filters and return message envelopes, newest first.

All filters are combined with AND. String filters use IMAP
case-insensitive substring matching; multi-word values are quoted for
you. Each result has uid, folder, message_id, subject, from/to/cc, date,
flags, size, seen and flagged; pass folder + uid to read_email for the
body. The folder is opened read-only, so searching never marks mail read.

Args:
    account: Account name from list_accounts.
    folder: Folder to search (default "INBOX"); use list_folders or
        resolve_folder for others.
    from_: Substring of the From header (name or address).
    to: Substring of the To header.
    cc: Substring of the Cc header.
    subject: Substring of the Subject.
    body: Substring of the message body.
    text: Substring of headers or body.
    since: Only messages on or after this date (YYYY-MM-DD).
    before: Only messages before this date (YYYY-MM-DD).
    unseen: Only unread messages.
    seen: Only read messages.
    flagged: Only flagged/starred messages.
    has_attachment: Best-effort filter for messages with attachments
        (multipart/mixed or an attachment disposition header).
    raw: A raw IMAP SEARCH string, e.g. 'OR FROM "alice" FROM "bob"'.
        When set, every other filter is ignored.
    limit: Maximum number of results (default 50).

Input parameters:

- `account` (string, required)
- `before`
- `body`
- `cc`
- `flagged` (boolean)
- `folder` (string)
- `from_`
- `has_attachment` (boolean)
- `limit` (integer)
- `raw`
- `seen` (boolean)
- `since`
- `subject`
- `text`
- `to`
- `unseen` (boolean)

Output parameters:

- `result` (array)

### `read_email` (~232 tokens)

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 parameters:

- `account` (string, required)
- `body_max_chars` (integer)
- `folder` (string, required)
- `include_html` (boolean)
- `include_text` (boolean)
- `uid` (string, required)

### `save_attachment` (~187 tokens)

Download one attachment from a message and write it to the local filesystem.

The mailbox is not modified. Returns the written path, size, MIME type
and original filename. An existing file at the target path is
overwritten.

Args:
    account: Account name from list_accounts.
    folder: Folder containing the message.
    uid: Message UID.
    part: 1-based part index from read_email's `attachments` list.
    save_to: Destination. A directory (trailing slash, existing
        directory, or a path without an extension) keeps the original
        filename; anything else is used as the full file path. `~` is
        expanded and missing directories are created.

Input parameters:

- `account` (string, required)
- `folder` (string, required)
- `part` (integer, required)
- `save_to` (string, required)
- `uid` (string, required)

### `get_conversation` (~191 tokens)

Return every message in the same conversation as a given message, oldest first.

On Gmail this uses the X-GM-THRID thread id across All Mail. Elsewhere it
follows the Message-ID / In-Reply-To / References graph across the
inbox, sent, archive, all-mail and drafts folders, so your own replies
are included. Returns envelopes (no bodies); use read_email for content.
Identify the seed message with either `message_id`, or `folder` + `uid`.

Args:
    account: Account name from list_accounts.
    message_id: Message-ID header of any message in the thread,
        including angle brackets.
    folder: Folder of the seed message (used with uid).
    uid: UID of the seed message (used with folder).

Input parameters:

- `account` (string, required)
- `folder`
- `message_id`
- `uid`

Output parameters:

- `result` (array)

### `send_email` (~275 tokens)

Send a new email over SMTP immediately; this cannot be undone, so confirm with the user first.

When the account has auto_save_sent enabled (needed for iCloud, whose
SMTP does not keep a copy) the message is also appended to the Sent
folder. Returns the generated Message-ID, recipients and the folder the
copy was saved to (null if none). To answer an existing message prefer
reply_email, which fills in recipients and threading for you.

Args:
    account: Account name from list_accounts; mail is sent from its address.
    to: Recipient email addresses.
    subject: Subject line.
    body: Plain-text body.
    cc: Cc recipient addresses.
    bcc: Bcc recipient addresses (delivered but never written to headers).
    html: Optional HTML alternative to the plain-text body.
    attachments: Local file paths to attach.
    in_reply_to: Message-ID this message replies to, for threading.
    references: Message-IDs of earlier messages in the thread.

Input parameters:

- `account` (string, required)
- `attachments`
- `bcc`
- `body` (string, required)
- `cc`
- `html`
- `in_reply_to`
- `references`
- `subject` (string, required)
- `to` (array, required)

### `save_draft_email` (~244 tokens)

Compose an email and save it to the account's Drafts folder without sending it.

The message is appended to the special-use Drafts folder with the
\Draft flag, so the user can review, edit and send it from their own
mail client. Use this instead of send_email whenever the user wants to
check a message first. Each call creates a new draft.

Args:
    account: Account name from list_accounts.
    to: Recipient email addresses.
    subject: Subject line.
    body: Plain-text body.
    cc: Cc recipient addresses.
    bcc: Bcc recipient addresses.
    html: Optional HTML alternative to the plain-text body.
    attachments: Local file paths to attach.
    in_reply_to: Message-ID this draft replies to, for threading.
    references: Message-IDs of earlier messages in the thread.

Input parameters:

- `account` (string, required)
- `attachments`
- `bcc`
- `body` (string, required)
- `cc`
- `html`
- `in_reply_to`
- `references`
- `subject` (string, required)
- `to` (array, required)

### `reply_email` (~211 tokens)

Reply to a message and send the reply immediately; confirm with the user first.

Addresses the reply to the original sender (plus the original To/Cc,
minus your own address, when reply_all is true), prefixes the subject
with "Re:" if needed, sets In-Reply-To and References so clients thread
it correctly, and quotes the original plain-text body below yours.

Args:
    account: Account name from list_accounts.
    folder: Folder containing the message being answered.
    uid: UID of the message being answered.
    body: Your reply text; the quoted original is appended after it.
    reply_all: Also reply to the original To and Cc recipients.
    html: Optional HTML alternative for the reply.
    attachments: Local file paths to attach.

Input parameters:

- `account` (string, required)
- `attachments`
- `body` (string, required)
- `folder` (string, required)
- `html`
- `reply_all` (boolean)
- `uid` (string, required)

### `forward_email` (~220 tokens)

Forward a message to new recipients and send it immediately; confirm with the user first.

The subject gets a "Fwd:" prefix, the original headers and plain-text
body are included below your note, and the original attachments are
re-attached unless include_attachments is false.

Args:
    account: Account name from list_accounts.
    folder: Folder containing the message to forward.
    uid: UID of the message to forward.
    to: Recipient email addresses.
    body: Optional note placed above the forwarded content.
    cc: Cc recipient addresses.
    bcc: Bcc recipient addresses.
    attachments: Extra local file paths to attach.
    include_attachments: Re-attach the original message's attachments
        (default true).

Input parameters:

- `account` (string, required)
- `attachments`
- `bcc`
- `body` (string)
- `cc`
- `folder` (string, required)
- `include_attachments` (boolean)
- `to` (array, required)
- `uid` (string, required)

### `mark_read` (~92 tokens)

Mark a message as read or unread by setting or clearing its \Seen flag.

Args:
    account: Account name from list_accounts.
    folder: Folder containing the message.
    uid: Message UID.
    read: True to mark read (default), false to mark unread.

Input parameters:

- `account` (string, required)
- `folder` (string, required)
- `read` (boolean)
- `uid` (string, required)

### `flag_message` (~95 tokens)

Flag (star) or unflag a message by setting or clearing its \Flagged flag.

Args:
    account: Account name from list_accounts.
    folder: Folder containing the message.
    uid: Message UID.
    flagged: True to flag (default), false to remove the flag.

Input parameters:

- `account` (string, required)
- `flagged` (boolean)
- `folder` (string, required)
- `uid` (string, required)

### `move_email` (~137 tokens)

Move a message from one folder to another.

Uses IMAP MOVE when the server supports it, otherwise COPY followed by
flagging the original \Deleted and EXPUNGE. The message gets a new UID
in the destination folder, so the old uid is no longer valid afterwards.

Args:
    account: Account name from list_accounts.
    folder: Folder the message is currently in.
    uid: Message UID in that folder.
    dest_folder: Destination folder name (see list_folders).

Input parameters:

- `account` (string, required)
- `dest_folder` (string, required)
- `folder` (string, required)
- `uid` (string, required)

### `delete_email` (~125 tokens)

Delete a message by moving it to the account's Trash folder.

The Trash folder is discovered via SPECIAL-USE (e.g. "Deleted Messages"
on iCloud, "[Gmail]/Trash" on Gmail). The message is not permanently
expunged from Trash, so it can still be recovered from the mail client.

Args:
    account: Account name from list_accounts.
    folder: Folder the message is currently in.
    uid: Message UID in that folder.

Input parameters:

- `account` (string, required)
- `folder` (string, required)
- `uid` (string, required)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/smankoo-owlpost/owlpost#diagnostics

## Score history

- 2026-10-23: 62
- 2026-10-22: 77
- 2026-10-21: 77
- 2026-10-20: 77
- 2026-10-19: 62

## Common questions

### What is the owlpost MCP server?

owlpost is an MCP server listed in the public MCP registry as io.github.smankoo/owlpost. IMAP/SMTP email for iCloud, Gmail, Proton Bridge and more: search, read, follow threads, send. This page covers its PyPI package (owlpost).

### Is the owlpost MCP server safe to use?

owlpost scores 62 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the owlpost MCP server expose?

owlpost exposes 15 tools: list_accounts, list_folders, resolve_folder, search_messages, read_email, and 10 more. Their descriptions and schemas cost roughly 2,751 tokens of context every time the server is loaded.

### Is the owlpost MCP server still maintained?

owlpost is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the owlpost MCP server under?

owlpost declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/owlpost/
- Socket report: https://socket.dev/pypi/package/owlpost
- Repository: https://github.com/smankoo/owlpost
- Changelog RSS feed: https://verifymcp.io/servers/smankoo-owlpost/owlpost.xml
- Changelog JSON feed: https://verifymcp.io/servers/smankoo-owlpost/owlpost.json
- HTML version of this page: https://verifymcp.io/servers/smankoo-owlpost/owlpost
