mcpField
M
mailoo

mailoo

ローカル
github.com/Bitflooコミュニケーション02 日前に更新

mailoo について

Mailooは、複数アカウントのメール、カレンダー、リマインダー、フィルターを管理するAIアシスタントやエージェント向けのMCPサーバーです。メールの予約送信や分析に加え、ツールセットを調整できます。

主な機能

  1. 01複数アカウントのメール管理
  2. 02下書き、テンプレート、送信予約
  3. 03カレンダーとリマインダーの操作
  4. 04メールのリアルタイム分類と通知
  5. 05ManageSieveフィルターの管理
  6. 06分析と調整可能なツールセット

活用シーン

  1. 01複数アカウントのメール検索、送信、整理
  2. 02メール送信の予約とカレンダー予定の管理
  3. 03プリセットやルールによる受信メールの分類

MCP 対応

メール、カレンダー、リマインダー、ManageSieveの機能を、ツール、プロンプト、リソースとしてMCPクライアントに公開します。ツールセットの設定と構造化出力に対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"bitfloo-mailoo": {
"command": "npx",
"args": [
"-y",
"@bitfloo/mailoo"
],
"env": {
"MCP_EMAIL_ADDRESS": "<MCP_EMAIL_ADDRESS>",
"MCP_EMAIL_PASSWORD": "<MCP_EMAIL_PASSWORD>",
"MCP_EMAIL_IMAP_HOST": "<MCP_EMAIL_IMAP_HOST>",
"MCP_EMAIL_SMTP_HOST": "<MCP_EMAIL_SMTP_HOST>",
"MCP_EMAIL_ACCOUNT_NAME": "<MCP_EMAIL_ACCOUNT_NAME>",
"MCP_EMAIL_FULL_NAME": "<MCP_EMAIL_FULL_NAME>",
"MCP_EMAIL_USERNAME": "<MCP_EMAIL_USERNAME>",
"MCP_EMAIL_IMAP_PORT": "<MCP_EMAIL_IMAP_PORT>",
"MCP_EMAIL_IMAP_TLS": "<MCP_EMAIL_IMAP_TLS>",
"MCP_EMAIL_IMAP_STARTTLS": "<MCP_EMAIL_IMAP_STARTTLS>",
"MCP_EMAIL_IMAP_VERIFY_SSL": "<MCP_EMAIL_IMAP_VERIFY_SSL>",
"MCP_EMAIL_IMAP_DISABLE_IMAP4REV2": "<MCP_EMAIL_IMAP_DISABLE_IMAP4REV2>",
"MCP_EMAIL_SIEVE_HOST": "<MCP_EMAIL_SIEVE_HOST>",
"MCP_EMAIL_SIEVE_PORT": "<MCP_EMAIL_SIEVE_PORT>",
"MCP_EMAIL_SMTP_PORT": "<MCP_EMAIL_SMTP_PORT>",
"MCP_EMAIL_SMTP_TLS": "<MCP_EMAIL_SMTP_TLS>",
"MCP_EMAIL_SMTP_STARTTLS": "<MCP_EMAIL_SMTP_STARTTLS>",
"MCP_EMAIL_SMTP_VERIFY_SSL": "<MCP_EMAIL_SMTP_VERIFY_SSL>",
"MCP_EMAIL_SMTP_POOL_ENABLED": "<MCP_EMAIL_SMTP_POOL_ENABLED>",
"MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS": "<MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS>",
"MCP_EMAIL_SMTP_POOL_MAX_MESSAGES": "<MCP_EMAIL_SMTP_POOL_MAX_MESSAGES>",
"MCP_EMAIL_OAUTH2_PROVIDER": "<MCP_EMAIL_OAUTH2_PROVIDER>",
"MCP_EMAIL_OAUTH2_CLIENT_ID": "<MCP_EMAIL_OAUTH2_CLIENT_ID>",
"MCP_EMAIL_OAUTH2_CLIENT_SECRET": "<MCP_EMAIL_OAUTH2_CLIENT_SECRET>",
"MCP_EMAIL_OAUTH2_REFRESH_TOKEN": "<MCP_EMAIL_OAUTH2_REFRESH_TOKEN>",
"MCP_EMAIL_RATE_LIMIT": "<MCP_EMAIL_RATE_LIMIT>",
"MCP_EMAIL_READ_ONLY": "<MCP_EMAIL_READ_ONLY>",
"MCP_EMAIL_SAVE_TO_SENT": "<MCP_EMAIL_SAVE_TO_SENT>",
"MCP_EMAIL_WATCHER_ENABLED": "<MCP_EMAIL_WATCHER_ENABLED>",
"MCP_EMAIL_WATCHER_FOLDERS": "<MCP_EMAIL_WATCHER_FOLDERS>",
"MCP_EMAIL_WATCHER_IDLE_TIMEOUT": "<MCP_EMAIL_WATCHER_IDLE_TIMEOUT>",
"MCP_EMAIL_HOOK_ON_NEW_EMAIL": "<MCP_EMAIL_HOOK_ON_NEW_EMAIL>",
"MCP_EMAIL_HOOK_PRESET": "<MCP_EMAIL_HOOK_PRESET>",
"MCP_EMAIL_HOOK_AUTO_LABEL": "<MCP_EMAIL_HOOK_AUTO_LABEL>",
"MCP_EMAIL_HOOK_AUTO_FLAG": "<MCP_EMAIL_HOOK_AUTO_FLAG>",
"MCP_EMAIL_HOOK_BATCH_DELAY": "<MCP_EMAIL_HOOK_BATCH_DELAY>",
"MCP_EMAIL_HOOK_CUSTOM_INSTRUCTIONS": "<MCP_EMAIL_HOOK_CUSTOM_INSTRUCTIONS>",
"MCP_EMAIL_ALERT_DESKTOP": "<MCP_EMAIL_ALERT_DESKTOP>",
"MCP_EMAIL_ALERT_SOUND": "<MCP_EMAIL_ALERT_SOUND>",
"MCP_EMAIL_ALERT_URGENCY_THRESHOLD": "<MCP_EMAIL_ALERT_URGENCY_THRESHOLD>",
"MCP_EMAIL_ALERT_WEBHOOK_URL": "<MCP_EMAIL_ALERT_WEBHOOK_URL>",
"MCP_EMAIL_ALERT_WEBHOOK_ALLOW_PRIVATE": "<MCP_EMAIL_ALERT_WEBHOOK_ALLOW_PRIVATE>",
"MCP_EMAIL_HOOK_AUTO_CALENDAR": "<MCP_EMAIL_HOOK_AUTO_CALENDAR>",
"MCP_EMAIL_HOOK_CALENDAR_NAME": "<MCP_EMAIL_HOOK_CALENDAR_NAME>",
"MCP_EMAIL_HOOK_CALENDAR_ALARM_MINUTES": "<MCP_EMAIL_HOOK_CALENDAR_ALARM_MINUTES>",
"MCP_EMAIL_HOOK_CALENDAR_CONFIRM": "<MCP_EMAIL_HOOK_CALENDAR_CONFIRM>",
"MCP_EMAIL_SYSTEM_ONE_ENABLED": "<MCP_EMAIL_SYSTEM_ONE_ENABLED>",
"MCP_EMAIL_HTTP_HOST": "<MCP_EMAIL_HTTP_HOST>",
"MCP_EMAIL_HTTP_TOKEN": "<MCP_EMAIL_HTTP_TOKEN>",
"MCP_EMAIL_HTTP_ALLOWED_HOSTS": "<MCP_EMAIL_HTTP_ALLOWED_HOSTS>",
"MCP_EMAIL_DEFAULT_ACCOUNT": "<MCP_EMAIL_DEFAULT_ACCOUNT>",
"MCP_EMAIL_TOOLSET": "<MCP_EMAIL_TOOLSET>"
}
}
}
}
起動コマンドnpx -y @bitfloo/mailoo
設定が必要な環境変数
MCP_EMAIL_ADDRESSEmail address. Required for the environment-variable account.
MCP_EMAIL_PASSWORDシークレットPassword or app password. Required unless MCP_EMAIL_OAUTH2_PROVIDER is set.
MCP_EMAIL_IMAP_HOSTIMAP server hostname.
MCP_EMAIL_SMTP_HOSTSMTP server hostname.
MCP_EMAIL_ACCOUNT_NAMEAccount name. Defaults to default.
MCP_EMAIL_FULL_NAMEDisplay name on sent mail.
MCP_EMAIL_USERNAMELogin username. Defaults to the email address.
MCP_EMAIL_IMAP_PORTIMAP port. Defaults to 993.
MCP_EMAIL_IMAP_TLSSet to false to turn off implicit IMAP TLS. Defaults to true.
MCP_EMAIL_IMAP_STARTTLSSet to true to upgrade IMAP with STARTTLS. Defaults to false.
MCP_EMAIL_IMAP_VERIFY_SSLSet to false to skip IMAP certificate verification. Defaults to true.
MCP_EMAIL_IMAP_DISABLE_IMAP4REV2Set to true to force IMAP4rev1 SEARCH.
MCP_EMAIL_SIEVE_HOSTManageSieve hostname. Defaults to the IMAP host.
MCP_EMAIL_SIEVE_PORTManageSieve port. Defaults to 4190.
MCP_EMAIL_SMTP_PORTSMTP port. Defaults to 465.
MCP_EMAIL_SMTP_TLSSet to false to turn off implicit SMTP TLS. Defaults to true.
MCP_EMAIL_SMTP_STARTTLSSet to true to upgrade SMTP with STARTTLS. Defaults to false.
MCP_EMAIL_SMTP_VERIFY_SSLSet to false to skip SMTP certificate verification. Defaults to true.
MCP_EMAIL_SMTP_POOL_ENABLEDSet to false to disable SMTP connection pooling. Defaults to true.
MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONSMaximum pooled SMTP connections. Defaults to 1.
MCP_EMAIL_SMTP_POOL_MAX_MESSAGESMaximum messages per pooled SMTP connection. Defaults to 100.
MCP_EMAIL_OAUTH2_PROVIDERシークレットOAuth2 provider: google, microsoft, or custom. Configure custom in the config file: an account in the environment replaces the config file, so custom set here has no token_url or auth_url.
MCP_EMAIL_OAUTH2_CLIENT_IDシークレットOAuth2 client id.
MCP_EMAIL_OAUTH2_CLIENT_SECRETシークレットOAuth2 client secret.
MCP_EMAIL_OAUTH2_REFRESH_TOKENシークレットOAuth2 refresh token.
MCP_EMAIL_RATE_LIMITMaximum sends per minute. Defaults to 10.
MCP_EMAIL_READ_ONLYSet to true to omit write tools and mailbox writers.
MCP_EMAIL_SAVE_TO_SENTSet to false to skip the IMAP Sent copy after SMTP. Defaults to true.
MCP_EMAIL_WATCHER_ENABLEDSet to true to start the IMAP IDLE watcher.
MCP_EMAIL_WATCHER_FOLDERSComma-separated folders to watch. Defaults to INBOX.
MCP_EMAIL_WATCHER_IDLE_TIMEOUTIMAP IDLE timeout in seconds. Defaults to 1740.
MCP_EMAIL_HOOK_ON_NEW_EMAILWhat to do on arrival: triage, notify, or none.
MCP_EMAIL_HOOK_PRESETHook preset: inbox-zero, gtd, priority-focus, notification-only, or custom.
MCP_EMAIL_HOOK_AUTO_LABELSet to true to apply labels from hook triage.
MCP_EMAIL_HOOK_AUTO_FLAGSet to true to flag mail from hook triage.
MCP_EMAIL_HOOK_BATCH_DELAYSeconds to batch arrivals before hooks run. Defaults to 5.
MCP_EMAIL_HOOK_CUSTOM_INSTRUCTIONSExtra instructions appended to the hook preset.
MCP_EMAIL_ALERT_DESKTOPSet to true for desktop notifications.
MCP_EMAIL_ALERT_SOUNDSet to true to play a sound with desktop notifications.
MCP_EMAIL_ALERT_URGENCY_THRESHOLDMinimum urgency for an alert: urgent, high, normal, or low.
MCP_EMAIL_ALERT_WEBHOOK_URLシークレットHTTP or HTTPS URL that receives alert POSTs.
MCP_EMAIL_ALERT_WEBHOOK_ALLOW_PRIVATESet to true to allow webhook targets on a LAN, VPN, or tailnet.
MCP_EMAIL_HOOK_AUTO_CALENDARSet to true to create calendar events from hook triage.
MCP_EMAIL_HOOK_CALENDAR_NAMECalendar name for automatic events.
MCP_EMAIL_HOOK_CALENDAR_ALARM_MINUTESMinutes before an automatic event to alarm. Defaults to 15.
MCP_EMAIL_HOOK_CALENDAR_CONFIRMSet to false to skip confirming automatic calendar events. Defaults to true.
MCP_EMAIL_SYSTEM_ONE_ENABLEDSet to true to classify residue mail with System One. Off by default.
MCP_EMAIL_HTTP_HOSTHTTP listen address. Defaults to loopback. The host argument wins.
MCP_EMAIL_HTTP_TOKENシークレットBearer token. Required when the HTTP listen address is not loopback or MCP_EMAIL_HTTP_ALLOWED_HOSTS lists a non-loopback name.
MCP_EMAIL_HTTP_ALLOWED_HOSTSComma-separated Host names. Required for 0.0.0.0 and ::.
MCP_EMAIL_DEFAULT_ACCOUNTDefault account name or email address when the account parameter is omitted.
MCP_EMAIL_TOOLSETToolset profile to register: full, core, or minimal. Defaults to full.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@bitfloo/mailoo0.3.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Mailoo

standard-readme compliant license CI M8ven

Mailoo(@bitfloo/mailoo)は、Bitfloo が開発・保守する、メール(IMAP/SMTP)、カレンダー、リマインダー、ManageSieve 自動化向けの Model Context Protocol(MCP)サーバーです。

Mailoo アーキテクチャ

複数のアカウントにわたって、AI アシスタントや自律型エージェントがメール、カレンダー、リマインダー、ManageSieve フィルタースクリプトの閲覧、検索、送信、管理、スケジュール設定、分析を行えるようにします。full、core、minimal のツールセットプロファイルに対応し、最大57個のツール、最大7個のプロンプト、6個のリソースを公開します。また、outputSchema / structuredContent を備えた MCP 2025/2026 プロトコル、OAuth2 サポート(実験的)、メールのスケジュール設定、カレンダー情報の抽出、分析、プロバイダーに応じたラベル管理、AI を活用したトリアージ機能付きのリアルタイム IMAP IDLE ウォッチャー、カスタマイズ可能なプリセットと静的ルール、ManageSieve フィルター、ガイド付きセットアップウィザードも提供します。

送信済みメールのコピー、IMAP4rev2、Sieve、添付ファイルの savePath、読み取り専用操作による副作用、再接続時のバックオフの動作については、docs/configuration.md と docs/tools.md に記載されています。

主な機能

機能本リポジトリでの対応
複数アカウントの IMAP/SMTP✅
送信/返信/転送(dryRun によるプレビュー付き)✅
下書きとテンプレート✅
プロバイダーに応じたラベルと一括操作✅
メールの予約送信✅
リアルタイム IMAP IDLE ウォッチャー✅
プリセットを使った AI トリアージ✅
デスクトップと Webhook のアラート✅
カレンダー(ICS、CalDAV、Apple Calendar/Reminders)✅
メール分析✅
OAuth2(Gmail / M365)✅ 実験的
ガイド付きセットアップウィザード✅
ManageSieve(サーバー側フィルター)✅
送信者認証ヘッダー(SPF/DKIM/DMARC)✅
ツールセットプロファイル(full / core / minimal)と GBNF 対応の小規模 LLM 向けの使いやすさ✅
MCP 2025/2026 の outputSchema と structuredContent✅

目次

セキュリティとサンドボックスのアーキテクチャ

ポリシーおよび脆弱性の報告方法については、SECURITY.md をご覧ください。

Mailoo は、多層防御によるサンドボックス化を採用しており、AI エージェントが信頼できないメールや外部サーバーと安全にやり取りできるよう設計されています。

  • シェル実行ゼロ(execFile のみ) — ネイティブ OS 連携(EventKit/リマインダー/通知用の macOS osascript、Linux の notify-send、Windows の powershell、および crontab のインストール)では、厳密な引数配列(shell: false)を指定して child_process.execFile を呼び出し、コマンドインジェクションの攻撃経路を排除します。
  • SSRF と DNS リバインディングの防止(net.BlockList) — 外部アラート用の Webhook では、IPv4/IPv6 の net.BlockList を使用して URL を検証します。このリストは、ループバック、RFC 1918 のプライベート範囲、リンクローカル/クラウドメタデータ(169.254.169.254、100.100.100.200)、CGNAT、NAT64、6to4、および予約済みプレフィックスを対象とし、設定時とソケット接続時(createWebhookConnectLookup)の両方で検証することで、DNS リバインディング攻撃を防ぎます(src/safety/validation.ts)。
  • シンボリックリンクを使用しない書き込み制限(savePath) — savePath による添付ファイルと .eml のエクスポートは、作業ディレクトリ内に厳密に制限されます。すべてのパス要素を lstat で順に確認し、隠しドットファイルと OS の永続化用ディレクトリ(Library/LaunchAgents、.ssh、.gnupg)を拒否します。また、ファイルサイズの上限を 50 MiB(インライン base64 の上限は 5 MiB)として、O_CREAT | O_EXCL | O_NOFOLLOW を指定して対象ファイルを開きます。
  • プロンプトインジェクションの隔離(<<<UNTRUSTED_EXTERNAL_CONTENT>>>) — 信頼できないメールの件名、送信者ヘッダー、本文、プレビュー、認証結果は、<<<UNTRUSTED_EXTERNAL_CONTENT>>> と <<<END_UNTRUSTED_EXTERNAL_CONTENT>>> の区切りで囲まれます(ペイロード内の偽装されたマーカーは削除されます)。これにより、LLM は外部メールを指示ではなくデータとして扱います。
  • 認証情報ファイルの厳格なアクセス権限(0600) — config.toml は、0700 の設定ディレクトリ($XDG_CONFIG_HOME/mailoo/config.toml)内にモード 0600 で書き込まれ、検証されます。パスワードとメッセージ本文は JSONL 書き込み監査ログから秘匿されます(src/safety/audit.ts)。
  • TLS と STARTTLS の検証 — tls は証明書検証を伴う暗黙的な TLS 接続を適用します(デフォルトで verify_ssl = true)。サーバーが STARTTLS を通知しない場合、starttls は接続を拒否します。両方を無効にできるのは、ループバックホストの場合に限られます。ManageSieve は、STARTTLS を使わない暗号化されていないソケット経由の AUTHENTICATE PLAIN を拒否します。
  • 運用上のガードレール(MCP_EMAIL_READ_ONLY、MCP_EMAIL_TOOLSET、dryRun) —
    • 起動時に MCP_EMAIL_READ_ONLY=true を設定すると、すべての書き込みツール、バックグラウンド監視、フック、スケジューラーが無効になり、読み取り専用の 31 個のツールのみが公開されます。
    • MCP_EMAIL_TOOLSET=full|core|minimal を設定すると、エージェントの機能レベルとコンテキストの予算に合わせて、登録されるツールの範囲が制限されます。
    • 高リスクのツール(send_email、reply_email、forward_email、send_draft、delete_email、bulk_action、delete_mailbox、sieve_put_script、sieve_delete_script)で dryRun: true を指定すると、すべてのパラメーターとアカウントの解決を検証し、サーバーの状態を変更せずに [DRY RUN] プレビューを返します。
  • アカウントごとのレート制限 — rate_limit(デフォルトは 1 分あたり 10 件の送信)により、アカウントごとに独立したトークンバケットが適用されます(src/safety/rate-limiter.ts)。バケットはメモリ内に保持されるため、各サーバープロセスと各 mailoo scheduler check の実行は、それぞれ個別にカウントされます。

LLM の使いやすさとツールセットプロファイル

Mailoo は、最先端モデル(Claude、GPT、Gemini)とローカルの小規模な 3B~8B パラメーターのモデル(llama.cpp の GBNF 文法、Ollama、vLLM)の両方で動作するように設計されています。

  • ツールセットプロファイル(MCP_EMAIL_TOOLSET / settings.toolset):
    • full (デフォルト) — カレンダー、リマインダー、ManageSieve、Watcher、Scheduler、Templates、Contacts、Analytics を含む 57 個のツール(read_only モードでは 31 個)。
    • core — メールの主要なワークフロー(accounts、mailboxes、emails、threads、send、drafts、manage、bulk、attachments、health)をカバーする 19 個のツール(read_only モードでは 10 個)。
    • minimal — コンテキスト予算が限られた 3B~4B モデル向けに調整された 14 個のツール(read_only モードでは 8 個)(accounts、mailboxes、emails、send、manage、health)。
  • 省略可能な account とスマートなアカウント解決 — 設定されているアカウントが 1 つだけの場合、または default_account(MCP_EMAIL_DEFAULT_ACCOUNT)が設定されている場合、すべてのツールで account パラメーターを完全に省略できます。アカウントの検索では、プロファイル名またはメールアドレスの大文字と小文字を区別せずに照合します(例:"[email protected]" を渡すと、一致するアカウントが解決されます)。あいまいな場合は、有効なアカウントを name (email) のペアで列挙した、次に取るべき行動が分かるエラーメッセージを返します。
  • 情報を損なわないパラメーター正規化と GBNF 互換性 — 単一メッセージ用ツールでは、emailId、id、email_id を文字列または整数(42 または "42")として受け付けます。バッチツール(get_emails、bulk_action)では、文字列または数値の ID 配列(["42", "43"] または [42, 43])を受け付けます。list_emails と search_emails では、hasAttachment と has_attachment の両方を受け付けます。すべての Zod スキーマでは正規表現の先読みを避けているため、llama.cpp の GBNF 文法コンパイルがエラーなく成功します。
  • コンテキストウィンドウの保護 — get_email と get_thread はデフォルトで format="text" を使用し、デフォルトの最大長を 20000 文字に制限します(超過時は明確な切り捨て通知を付加します)。これにより、大きな HTML ニュースレターが小さなコンテキストウィンドウからあふれるのを防ぎます。
  • MCP 2025/2026 の outputSchema と structuredContent — ツールは構造化された outputSchema の契約を宣言し、人間が読めるテキストブロックとともに、機械可読な structuredContent を返します。
  • 送信する添付ファイルのパスは、作業ディレクトリまたはホームディレクトリ内の通常ファイルを指定する必要があります — セキュリティに関する考慮事項

ドキュメント

トピック場所
APPEND の送信、IMAP4rev2、Sieve、read_only、再接続時のバックオフ、stdio EOF、シャットダウン、マシンごとに 1 つのメールボックス書き込みプロセスdocs/configuration.md
savePath、検索日付、get_email_security、sieve ツール、送信/下書きの添付ファイル、RFC 2047、保護されたフォルダー、メールボックスのビジー状態のタイムアウト、bulk_action の ID、カレンダー添付ファイルの保存docs/tools.md
パフォーマンスに関する注記docs/performance-roadmap.md

背景

多くの MCP メール実装が提供するのは、基本的な読み取りと送信機能のみです。このサーバーは、メールの読み取り、作成、管理、スケジュール設定、分析まで、ライフサイクル全体を 1 つの MCP サーバーから扱える、フル機能の AI アシスタント向けメールクライアントを目指しています。

主な設計上の決定事項:

  • XDG 準拠の設定 — ~/.config/mailoo/config.toml に TOML 形式で保存
  • マルチアカウント — 複数の IMAP/SMTP アカウントを同時に操作
  • 階層化されたサービス — テスト容易性のため、ビジネスロジックを MCP との接続処理から分離
  • プロバイダーの自動検出 — Gmail、Outlook、Yahoo、iCloud、Fastmail、ProtonMail、Zoho、GMX

インストール

Node.js ≥ 24 が必要です。

npx -y @bitfloo/mailoo account add

これによりローカル設定が書き込まれ、MCP クライアント用のスニペットが表示されます。同じパッケージでサーバーとその他のコマンドを実行できます。

npx -y @bitfloo/mailoo
npx -y @bitfloo/mailoo test

サブコマンドなしで npx -y @bitfloo/mailoo を実行すると、stdio 経由で MCP サーバーが起動します。または、mailoo コマンドをインストールします。

npm install -g @bitfloo/mailoo
# or
pnpm add -g @bitfloo/mailoo
# or, without a global install:
pnpm dlx @bitfloo/mailoo account add
クローンからのインストール

このリポジトリのビルドには、pnpm 12(package.json の packageManager に記載されたバージョン)が必要です。

git clone https://github.com/Bitfloo/mailoo.git
cd mailoo
pnpm install && pnpm build
node dist/main.js account add
Docker

実行イメージには、ホスト上の Node ではなく Docker が必要です。まず npx -y @bitfloo/mailoo account add で設定を作成するか、TOML を手動で記述してから、そのディレクトリをコンテナにマウントします。

イメージは ghcr.io/bitfloo/mailoo で、linux/amd64 および linux/arm64 向けにビルドされています。タグはバージョン番号のみ(v プレフィックスなし)です。0.3 タグは、最新の 0.3.x リリースを追跡します。本番環境では、リリースの完全なバージョン(npm のバージョンと一致します)またはイメージダイジェストを指定してください。

docker pull ghcr.io/bitfloo/mailoo:0.3

クローンからビルドする場合(docker-compose.yml は build: . を使用します):

docker build -t ghcr.io/bitfloo/mailoo .

注: サーバーは stdio トランスポートを使用します。設定はホスト上で作成し (npx -y @bitfloo/mailoo account add を実行するか、TOML を手動で記述します)、コンテナにマウントします。

使用方法

以下のコマンドでは npx -y @bitfloo/mailoo を使用します。グローバルインストールの場合も、同じサブコマンドを mailoo で実行できます。クローンから使用する場合は、pnpm build の実行後、各サブコマンドを node dist/main.js で実行します(クローンからの使用を参照)。

セットアップ
# Add an email account interactively (recommended)
npx -y @bitfloo/mailoo account add

# Or use the deprecated alias (same wizard)
npx -y @bitfloo/mailoo setup

# Or create a template config manually
npx -y @bitfloo/mailoo config init

セットアップウィザードはサーバー設定を自動検出し、接続をテストして設定を保存し、MCP クライアント設定のスニペットを出力します。

接続テスト
npx -y @bitfloo/mailoo test            # all accounts
npx -y @bitfloo/mailoo test personal   # specific account

npx -y @bitfloo/mailoo test / mailoo test は、実際のアカウントへの接続プローブであり、Vitest ではありません。ユニットテストと統合テストには pnpm test / pnpm test:integration を使用します(コントリビューションを参照)。OAuth2 アカウントでは、設定済みのリフレッシュトークンから更新したアクセストークンを使ってログインします。

MCP クライアントの設定

ガイド付きインストーラーを実行するか、以下のスニペットを貼り付けてください。VS Code / MCP ギャラリーには掲載されていません。

npx -y @bitfloo/mailoo install

インストーラーでは、npx、pnpm dlx、またはグローバルにインストールした mailoo の起動を登録できます。すでに PATH 上に mailoo バイナリがある場合は、"command": "mailoo" と "args": ["stdio"] を使用できます。

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します。

{
  "mcpServers": {
    "mailoo": {
      "command": "npx",
      "args": ["-y", "@bitfloo/mailoo", "stdio"]
    }
  }
}
VS Code(GitHub Copilot)

Mailoo は VS Code の拡張機能ギャラリーに掲載されていません。以下の npx 起動設定を Copilot に指定してください。

ワークスペース(.vscode/mcp.json):

{
  "servers": {
    "mailoo": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@bitfloo/mailoo", "stdio"]
    }
  }
}

ユーザー設定(すべてのワークスペースに適用する settings.json):

コマンドパレットを開き、→ Preferences: Open User Settings (JSON) を選択して、以下を追加します。

{
  "mcp": {
    "servers": {
      "mailoo": {
        "type": "stdio",
        "command": "npx",
        "args": ["-y", "@bitfloo/mailoo", "stdio"]
      }
    }
  }
}
Cursor

~/.cursor/mcp.json を編集します。

{
  "mcpServers": {
    "mailoo": {
      "command": "npx",
      "args": ["-y", "@bitfloo/mailoo", "stdio"]
    }
  }
}
Windsurf

~/.codeium/windsurf/mcp_config.json を編集します。

{
  "mcpServers": {
    "mailoo": {
      "command": "npx",
      "args": ["-y", "@bitfloo/mailoo", "stdio"]
    }
  }
}
Zed

~/.config/zed/settings.json を編集します。

{
  "context_servers": {
    "mailoo": {
      "command": {
        "path": "npx",
        "args": ["-y", "@bitfloo/mailoo", "stdio"]
      }
    }
  }
}
Mistral Vibe

~/.vibe/config.toml に追加します。

[[mcp_servers]]
name = "mailoo"
transport = "stdio"
command = "npx"
args = ["-y", "@bitfloo/mailoo", "stdio"]

設定ファイルを使わずに認証情報を直接渡すには、env フィールドを使用します。

[[mcp_servers]]
name = "mailoo"
transport = "stdio"
command = "npx"
args = ["-y", "@bitfloo/mailoo", "stdio"]
env = { MCP_EMAIL_ADDRESS = "[email protected]", MCP_EMAIL_PASSWORD = "your-app-password", MCP_EMAIL_IMAP_HOST = "imap.example.com", MCP_EMAIL_SMTP_HOST = "smtp.example.com" }

MCP ツールは mailoo_<tool_name>(例:mailoo_list_emails)として公開されます。設定を編集した後、Vibe を再起動してください。

Docker(任意の MCP クライアント)

コンテナ内でサーバーを実行します。設定ディレクトリは読み取り専用でマウントしてください。イメージは ghcr.io/bitfloo/mailoo:0.3 です(または docker build -t ghcr.io/bitfloo/mailoo . でビルドします)。

docker run --rm -i \
  -v ~/.config/mailoo:/home/node/.config/mailoo:ro \
  ghcr.io/bitfloo/mailoo:0.3

MCP クライアントの設定(例:Claude Desktop):

{
  "mcpServers": {
    "mailoo": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "~/.config/mailoo:/home/node/.config/mailoo:ro",
        "ghcr.io/bitfloo/mailoo:0.3"
      ]
    }
  }
}
環境変数による単一アカウントの設定(設定ファイル不要)
{
  "mcpServers": {
    "mailoo": {
      "command": "npx",
      "args": ["-y", "@bitfloo/mailoo", "stdio"],
      "env": {
        "MCP_EMAIL_ADDRESS": "[email protected]",
        "MCP_EMAIL_PASSWORD": "your-app-password",
        "MCP_EMAIL_IMAP_HOST": "imap.example.com",
        "MCP_EMAIL_SMTP_HOST": "smtp.example.com"
      }
    }
  }
}
CLI コマンド
npx -y @bitfloo/mailoo [command]

Commands:
  stdio                     Run as MCP server over stdio (default)
  http [port] [host]        Streamable HTTP (default: port 8080 on 127.0.0.1 and ::1)
  account list              List all configured accounts
  account add               Add a new email account interactively
  account edit [name]       Edit an existing account
  account delete [name]     Remove an account
  setup                     Deprecated alias for 'account add'
  test                      Test connections for all or a specific account
  install                   Register mailoo with MCP clients interactively
  install status            Show registration status for detected clients
  install remove            Unregister mailoo from MCP clients
  config show               Show config (passwords masked)
  config edit               Edit global settings (rate limit, read-only)
  config path               Print config file path
  config init               Create template config
  scheduler check           Process pending scheduled emails
  scheduler list            Show all scheduled emails
  scheduler install         Install OS-level scheduler (launchd/crontab)
  scheduler uninstall       Remove OS-level scheduler
  scheduler status          Show scheduler installation status
  notify test               Send a test desktop notification
  notify status             Check platform notification support
  --version, -v             Print the package version
  help                      Show help
HTTP

http は 127.0.0.1 および ::1 でリッスンします(ポートは、別のポートを指定しない限り 8080 です)。ループバック以外のアドレス、または MCP_EMAIL_HTTP_ALLOWED_HOSTS 内のループバック以外の名前を使用する場合は、MCP_EMAIL_HTTP_TOKEN が必要です。0.0.0.0 / :: や 8 MiB の本文サイズ制限などの詳細は、docs/configuration.mdを参照してください。

npx -y @bitfloo/mailoo http
MCP_EMAIL_HTTP_TOKEN='replace-with-a-long-random-secret' npx -y @bitfloo/mailoo http 8080 192.0.2.10

トークンが設定されている場合、クライアントは Authorization: Bearer <token> を送信します。

設定

$XDG_CONFIG_HOME/mailoo/config.toml にあります(デフォルト:~/.config/mailoo/config.toml)。

[settings]
rate_limit = 10  # max emails per minute per account
read_only = false
toolset = "full"  # "full" | "core" | "minimal"
default_account = "personal"  # optional when only one account is configured
save_to_sent = true  # see docs/configuration.md — Gmail already files Sent

[[accounts]]
name = "personal"
email = "[email protected]"
full_name = "Your Name"
password = "your-app-password"

[accounts.imap]
host = "imap.example.com"
port = 993
tls = true
# disable_imap4rev2 = true  # Strato and similar SEARCH bugs
# sieve_host = "imap.example.com"
# sieve_port = 4190

[accounts.smtp]
host = "smtp.example.com"
port = 465
tls = true
starttls = false
verify_ssl = true

[accounts.smtp.pool]
enabled = true
max_connections = 1
max_messages = 100

ファイル内または MCP_EMAIL_* で、tls = false かつ starttls = false に設定された IMAP または SMTP ブロックは、localhost、完全な形式で記述された 127.0.0.0/8 内のアドレス(127.0.0.1 など)、または ::1 の場合にのみ読み込まれます。それ以外のホストは設定の読み込み時に拒否されます。

OAuth2 (実験的)

注: OAuth2 のサポートは実験的です。トークンの更新やプロバイダー固有のフローには、お使いの環境で追加のテストが必要になる場合があります。

トークンの更新とコード交換は 15 秒でタイムアウトするため、応答を停止したプロバイダーは接続をハングさせず、OAuth2 token refresh timed out after 15s エラーで失敗します。同時に新しいトークンを必要とする呼び出し元は、1 つの更新リクエストを共有します。IDLE ウォッチャーは同じアクセストークンでログインします。

[[accounts]]
name = "work"
email = "[email protected]"
full_name = "Your Name"

[accounts.oauth2]
provider = "google"            # or "microsoft"
client_id = "your-client-id"
client_secret = "your-client-secret"
refresh_token = "your-refresh-token"

[accounts.imap]
host = "imap.example.com"
port = 993
tls = true

[accounts.smtp]
host = "smtp.example.com"
port = 465
tls = true

[accounts.smtp.pool]
enabled = true
max_connections = 1
max_messages = 100
環境変数

単一アカウントのセットアップ用(設定ファイルより優先されます):

変数デフォルト説明
MCP_EMAIL_ADDRESS必須メールアドレス
MCP_EMAIL_PASSWORDOAuth2 を使用しない場合は 必須パスワードまたはアプリパスワード。OAuth2 アカウント(MCP_EMAIL_OAUTH2_PROVIDER が設定済み)の場合は不要です
MCP_EMAIL_OAUTH2_PROVIDER—google、microsoft、または custom。設定値をそのまま読み込み、それ以外の値は拒否されます。未設定または空の場合、OAuth2 は使用されません。環境変数内のアカウントは設定ファイルを置き換えるため、ここで custom を設定すると最初のトークンリクエスト時に失敗します。custom アカウントは、[accounts.oauth2] に token_url と auth_url を指定して、設定ファイル内ですべて設定してください
MCP_EMAIL_OAUTH2_CLIENT_IDプロバイダーを指定する場合は 必須OAuth2 クライアント ID
MCP_EMAIL_OAUTH2_CLIENT_SECRETプロバイダーを指定する場合は 必須OAuth2 クライアントシークレット
MCP_EMAIL_OAUTH2_REFRESH_TOKENプロバイダーを指定する場合は 必須OAuth2 リフレッシュトークン
MCP_EMAIL_IMAP_HOST必須IMAP サーバーのホスト名
MCP_EMAIL_SMTP_HOST必須SMTP サーバーのホスト名
MCP_EMAIL_ACCOUNT_NAMEdefaultアカウント名
MCP_EMAIL_FULL_NAME—表示名
MCP_EMAIL_USERNAMEメールアドレスログインユーザー名
MCP_EMAIL_IMAP_PORT993IMAP ポート
MCP_EMAIL_IMAP_TLStrueIMAP TLS
MCP_EMAIL_SMTP_PORT465SMTP ポート
MCP_EMAIL_SMTP_TLStrueSMTP TLS
MCP_EMAIL_SMTP_STARTTLSfalseSMTP STARTTLS
MCP_EMAIL_SMTP_VERIFY_SSLtrueSSL 証明書を検証します
MCP_EMAIL_SMTP_POOL_ENABLEDtrueSMTP トランスポートのプーリングを有効にします
MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS1プールされる SMTP 接続の最大数
MCP_EMAIL_SMTP_POOL_MAX_MESSAGES100プールされた接続あたりの最大メッセージ数
MCP_EMAIL_RATE_LIMIT101 分あたりの最大送信数
MCP_EMAIL_READ_ONLYfalseすべての書き込みツール、バックグラウンドウォッチャー、スケジューラーを無効にします
MCP_EMAIL_TOOLSETfull公開するツールセットのプロファイル(full、core、または minimal)
MCP_EMAIL_DEFAULT_ACCOUNT—account が省略された場合のデフォルトのアカウント名またはメールアドレス

アドレス、両方のホスト、パスワードまたはプロバイダーが指定されていない場合、環境変数はアカウントを定義しません。その場合、Mailoo は設定ファイルを読み込むか、設定ファイルがない場合は No configuration found. で失敗します。

送信済みコピー、IMAP4rev2、Sieve のホスト/ポート、read_only 環境変数については、docs/configuration.md を参照してください。

メールのスケジュール設定

スケジューラーは、階層化されたアーキテクチャを使用して、将来のメール配信を可能にします。

  1. MCP による自動チェック — サーバー起動時(ウォッチャーの接続前)と、MCP サーバーの実行中は 60 秒ごとにキューを処理します。複数の stdio サーバーがある場合は、ウォッチャーとフックを実行しているサーバーだけがチェックします。次のチェック時刻になっても処理中の場合、そのチェックはスキップされ、送信に失敗すると、接続中の MCP クライアントに warning として記録されます
  2. CLI — 手動または cron による処理には npx -y @bitfloo/mailoo scheduler check を使用します。OAuth2 や save_to_sent を含む、サーバーと同じアカウント設定で送信し、終了前に IMAP/SMTP 接続を閉じます
  3. OS レベルのデーモン — npx -y @bitfloo/mailoo scheduler install を実行すると、MCP サーバーとは独立して毎分実行するよう、launchd(macOS)または crontab(Linux)を設定します

重要 — 確実に配信するには、デーモンをインストールする必要があります。 インストールしない場合、AI クライアントがアクティブに接続している間だけ、スケジュール済みメールが送信されます。 スケジュール時刻には、お使いのマシンも稼働している必要があります。スリープ中または電源が切れている場合は、 次回の復帰/起動時に、デーモンが期限を過ぎたメールを処理します。送信に失敗した場合、 メールが failed としてマークされるまで、最大 3 回 試行されます。

デーモンの設定
# Install (macOS launchd / Linux crontab — runs every minute)
npx -y @bitfloo/mailoo scheduler install

# Verify it's running
npx -y @bitfloo/mailoo scheduler status

# View pending / sent / failed scheduled emails
npx -y @bitfloo/mailoo scheduler list

# Trigger a manual check immediately
npx -y @bitfloo/mailoo scheduler check

# Remove the daemon
npx -y @bitfloo/mailoo scheduler uninstall

スケジュール済みメールは ~/.local/state/mailoo/scheduled/ 内の JSON ファイルです。送信前に、チェック処理はそのファイルの隣にロックファイルを作成してエントリを確保し、SMTP の実行中もその確保状態を更新します。これにより、プロセス内タイマー、mailoo scheduler check、他のサーバープロセスが同じメールを二重に送信するのを防ぎます。サーバーがメッセージを受け付けた後、送信済みとして記録する前にプロセスが終了した場合、確保状態が期限切れになった後でエントリが再送信されることがあります(少なくとも 1 回の配信であり、厳密に 1 回の配信ではありません)。1 つのエントリに対するすべての試行では、同じ Message-ID(<schedule id@account domain>)が使用されるため、受信サーバーまたはクライアントは 2 通目を破棄できます。SMTP がメッセージを受け付けた後にキューファイルの更新に失敗した場合は、その旨が報告されます。また、送信済みの記録または sent/ への移動のいずれかが成功していれば、エントリは再送信されません。両方とも失敗した場合、すべての試行を使い切っていない限り、次回のチェックで再送信されます。試行回数を使い切っている場合は、failed としてマークされます。各エントリには試行回数(最大 3 回)と最後のエラーが記録されます。list_scheduled はその両方を返し、scheduler list は失敗したエントリのエラーを表示します。レート制限によって保留されたエントリは、次回のチェックまで保留状態のままとなり、試行回数には加算されません。

リアルタイムウォッチャーと AI フック

IMAP IDLE ウォッチャーは、永続的な IDLE 接続(ツール接続とは別)を使用して、設定済みのメールボックスをリアルタイムで監視します。各フォルダーはフェッチの合間も IDLE 状態を保ち、フェッチのたびに約 1 秒後に IDLE が再開されます。idle_timeout は IDLE の再起動間隔を設定します。同じマシン上で複数の stdio サーバー(MCP クライアントのウィンドウごとに 1 つ)を実行している場合、ウォッチャー、フック、スケジューラーを実行するのはそのうち 1 つだけです。詳しくは設定を参照してください。新着メールが届くと、次の処理を行います。

  1. 静的ルール — 差出人/宛先/件名をパターン照合し、ラベルの適用、フラグ付け、既読化を即座に実行します(AI は使用しません)
  2. AI によるトリアージ — 残りのメールを、カスタマイズ可能なプリセットプロンプトを使用して MCP サンプリングで分析します
  3. 通知モード — AI によるトリアージが無効の場合は、ログ記録に切り替わります

config.toml で設定します。

[settings.watcher]
enabled = true
folders = ["INBOX"]
idle_timeout = 1740     # 29 minutes (IMAP spec max is 30)

[settings.hooks]
on_new_email = "triage" # "triage" | "notify" | "none"
preset = "inbox-zero"   # "inbox-zero" | "gtd" | "priority-focus" | "notification-only" | "custom"
auto_label = true       # apply AI-suggested labels
auto_flag = true        # flag urgent emails
batch_delay = 5         # seconds to batch before triage

# User context — appended to preset's AI prompt
custom_instructions = """
I'm a software engineer. Emails from @example.com are always high priority.
Newsletters I read: TL;DR, Hacker Newsletter.
"""

# Static rules — run BEFORE AI, skip AI if matched
[[settings.hooks.rules]]
name = "GitHub Notifications"
match = { from = "*@example.com" }
actions = { labels = ["Dev"], mark_read = true }

[[settings.hooks.rules]]
name = "Newsletter Archive"
match = { from = "*@example.com|*@example.test" }
actions = { labels = ["Newsletter"] }

[[settings.hooks.rules]]
name = "VIP Contacts"
match = { from = "[email protected]|[email protected]" }
actions = { flag = true, labels = ["VIP"] }

バッチは一度に 1 つずつ実行されます。次のバッチを待つ新着メールは最大 500 件です。 それを超えるメールは、ログに警告を記録してスキップされ、メールボックス内で変更されずに残ります。

プリセット
プリセット対象推奨ラベル
inbox-zero積極的な分類とアーカイブNewsletter, Notification, Updates, Finance, Social, Promo
gtdGetting Things Done のコンテキスト@Action, @Waiting, @Reference, @Someday, @Delegated
priority-focusシンプルな優先度分類(デフォルト)(なし — 優先度の設定とフラグ付けのみ)
notification-onlyAI によるトリアージなし。ログ記録のみ(なし)
customユーザーがシステムプロンプト全体を定義ユーザー定義
静的ルール

静的ルールでは、| を OR 区切り文字とする glob 形式のパターン(*@example.com|*@example.test)を使用します。一致条件内の条件はすべて AND で評価されます。to パターンは、いずれかの受信者が一致すると一致します。空のパターンは条件なしとして扱われ、条件のないルールは何にも一致しません。最初に一致したルールが適用されます。

利用可能なアクション:labels(文字列配列)、flag(ブール値)、mark_read(ブール値)、alert(ブール値 — デスクトップ通知を強制します)。

アラート

緊急度に基づいて複数のチャネルに通知を振り分けます。重要なメールが届いたとき、チャットを見ていなくても注意を引けます。すべてのチャネルはオプトイン方式で、デフォルトでは無効です。

優先度デスクトップサウンドMCP ログレベルWebhook
urgent✅ バナー🔊 アラートalert✅
high✅ バナー🔇 サイレントwarning✅
normal❌❌info❌
low❌❌debug❌

記載されたレベルで出力される MCP ログエントリーには、アカウント、フォルダー、UID、ラベル、ルールが記録されます。アラートのエントリーでは、送信者と件名は debug にのみ表示されます。別のエントリーに記録されるか、low の場合は単一のエントリーに記録されます。

[settings.hooks.alerts]
desktop = true              # OS-level notifications (macOS/Linux/Windows)
sound = true                # play sound for urgent emails
urgency_threshold = "high"  # minimum priority to trigger desktop alert
webhook_url = "https://ntfy.sh/my-email-alerts"  # optional: Slack, Discord, ntfy.sh, etc.
webhook_events = ["urgent", "high"]
allow_private_webhooks = false  # default; true allows a LAN, VPN, or tailnet target

詳細:docs/configuration.md。

対応プラットフォーム: macOS(osascript 経由の通知センター)、Linux(notify-send)、Windows(PowerShell トースト)。npm 依存関係は不要です。OS 標準のコマンドを使用します。

プラットフォーム別の通知設定:

macOS

デスクトップ通知には osascript(標準搭載)を使用します。MCP サーバーを実行するターミナルアプリに通知の許可が必要です。

  1. システム設定 → 通知と集中モードを開きます
  2. ターミナルアプリ(Terminal、iTerm2、VS Code、Cursor など)を探します
  3. 通知を許可を有効にし、バナーまたは通知を選択します
  4. 集中モード/「おやすみモード」で通知がブロックされていないことを確認します

check_notification_setup で問題を診断し、test_notification で動作を確認できます。

Linux

libnotify の notify-send が必要です。サウンドアラートには paplay も必要です。

# Ubuntu / Debian
sudo apt install libnotify-bin pulseaudio-utils

# Fedora
sudo dnf install libnotify pulseaudio-utils

# Arch
sudo pacman -S libnotify

デスクトップ通知を利用するには、ディスプレイサーバー(X11/Wayland)が実行中である必要があります。ヘッドレス/SSH セッションでは動作しません。

Windows

PowerShell のトースト通知(標準搭載)を使用します。

  1. 設定 → システム → 通知を開きます
  2. 通知がオンになっていることを確認します
  3. 集中モードで通知を許可するように設定します
  4. Windows Terminal を使用している場合は、通知が有効になっていることを確認します

AI による設定: AI は実行時に通知の確認、テスト、設定を行えます。

  • check_notification_setup — プラットフォームの対応状況を診断し、設定手順を表示します
  • test_notification — テスト通知を送信して、すべてが正常に動作することを確認します
  • configure_alerts — デスクトップ通知、サウンド、しきい値、Webhook を有効化/無効化します(設定ファイルへの保存は任意です)

Webhook ペイロード:

{
  "event": "email.urgent",
  "account": "work",
  "sender": { "name": "John CEO", "address": "[email protected]" },
  "subject": "Q4 Review Due Today",
  "priority": "urgent",
  "labels": ["VIP"],
  "rule": "VIP Contacts",
  "timestamp": "2026-02-18T11:30:00Z"
}

静的ルールでは、緊急度のしきい値に関係なく、alert = true を設定してデスクトップ通知を強制できます。

[[settings.hooks.rules]]
name = "VIP Contacts"
match = { from = "[email protected]" }
actions = { flag = true, alert = true, labels = ["VIP"] }

機能:

  • 自動再接続 — 再接続のバックオフスケジュールに従って、切断または失敗したフォルダー接続を再試行します。接続が停止している間に届いたメールは、再接続後に通知されます。ただし、サーバー側でフォルダーの UIDVALIDITY が変更された場合を除きます。まだ一度も接続していないフォルダーについては、初回の接続が成功した後に届いたメールのみ通知されます
  • バッチ処理 — 設定可能な遅延時間内に届いたメールをまとめて、AI の呼び出しを減らします
  • レート制限 — サンプリング呼び出しは最大で毎分 10 回です
  • 適切な縮退 — クライアントがサンプリングに対応していない場合は、通知モードに切り替えます
System One(オプトイン式の振り分け)

静的ルール適用後に残ったメールを対象とする、任意の TypeSafe System One 分類機能です。デフォルトではオフです。 settings.watcher.enabled と settings.system_one.enabled の両方をオンにする必要があります。環境変数に TYPESAFE_API_KEY を設定してください(TOML には決して設定しないでください)。

source_folders(デフォルトは INBOX)内の新着メールのうち、静的ルールで処理されなかったものだけが分類されます。そのようなメッセージごとに、Mailoo は api.typesafe.ai(または TYPESAFE_BASE_URL)にリクエストを1回送信します。リクエストには次の情報が含まれます(src/services/mail-arrival/state.ts、src/services/mail-arrival/questions.ts)。

データ送信される内容
送信者From の表示名とアドレス
件名件名全体
リンク件名内で見つかった URL、および include_body = true の場合は本文内で見つかった URL
添付ファイル各添付ファイルのファイル名と MIME タイプ。ファイルの内容は含まれません
送信者認証SPF、DKIM(結果と署名ドメイン)、DMARC の結果、From、Reply-To、Return-Path の各ドメイン、List-Unsubscribe ヘッダーの有無
メールボックス設定済みアカウント名とメッセージが格納されているフォルダー
フォルダールール各 [[settings.system_one.folders]] エントリーの path、description、false_criteria。false_criteria が未設定の場合は、その他のフォルダーパス
モデルmodel 設定(デフォルトは jev-latest)
本文include_body = true の場合のみ:引用された返信チェーンを除いたプレーンテキスト。body_max_chars(デフォルトは6000、最大24000)で切り詰められます

送信されない情報:To、Cc、Bcc のアドレス、Message-ID、その他の生ヘッダー、添付ファイルの内容、および include_body が false の場合の本文。

Mailoo は分類した直近5000件のメッセージを記憶し、再送信しません。2つのアカウントに届いたメッセージは、各アカウントで1回ずつ分類されます。リクエストまたはヘッダーの読み取りに失敗したメッセージは記憶されないため、次回通知されたときに再試行されます。

auto_move と auto_flag は別々の切り替え項目で、デフォルトでは false です。振り分け先は folders[].path から取得され(IMAP LIST に対して検証されます)、すべてのメールボックスをライブ一覧表示して取得するわけではありません。

[settings.system_one]
enabled = false
include_body = false
auto_move = false
auto_flag = false

[[settings.system_one.folders]]
path = "Receipts"
description = "Invoices, receipts, and payment confirmations."

on_new_email = "notify" と "triage" は、System One がオンの場合、どちらも System One にメールを渡します。none の場合はオフのままです。

機能とデータフロー

以下に示す送信呼び出し、子プロセス、ファイル、環境変数は、src/ が使用するものです。MCP サンプリングを使用するフックのトリアージは、接続されたクライアント内で完結します。この経路では、Mailoo が別のモデルホストに接続することはありません。

ネットワーク
接続先用途コード
設定済みの IMAP ホストとポート読み取り、書き込み、IDLEsrc/connections/manager.ts、src/services/watcher.service.ts
設定済みの SMTP ホストとポート送信src/connections/manager.ts
ManageSieve ホスト(未設定の場合は IMAP ホスト)、デフォルトのポート 4190(sieve_port / MCP_EMAIL_SIEVE_PORT)フィルタースクリプトsrc/services/sieve.service.ts
https://oauth2.googleapis.com/tokenGoogle トークンの更新とコード交換src/services/oauth.service.ts
https://accounts.google.com/o/oauth2/v2/authオペレーターのブラウザー用の認証 URL。プロセスがこの URL を取得することはありませんsrc/services/oauth.service.ts
https://login.microsoftonline.com/common/oauth2/v2.0/tokenMicrosoft トークンの更新とコード交換src/services/oauth.service.ts
https://login.microsoftonline.com/common/oauth2/v2.0/authorizeオペレーターのブラウザー用の認証 URL。プロセスがこの URL を取得することはありませんsrc/services/oauth.service.ts
カスタムの token_url / auth_urloauth2.provider が custom の場合も同様です。設定の検証では https が必須です。平文の http が許可されるのは、localhost、127.0.0.0/8、または ::1 の場合のみです(src/config/schema.ts)src/services/oauth.service.ts
設定済みの Webhook URL(http または https の POST)アラート送信時。このホストの DNS ルックアップ後に実行されますsrc/services/notifier.service.ts、src/safety/validation.ts
https://api.typesafe.ai(または TYPESAFE_BASE_URL)System One による分類。有効になっている場合のみ。送信フィールド:System Onesrc/services/mail-arrival/index.ts

mailoo http はリッスンします。送信先は追加されません。src/cli/providers.ts のプロバイダープリセットは、ウィザードで保存する IMAP ホストと SMTP ホストを設定します。

プロセス
プログラム用途コード
osascriptmacOS の通知、カレンダーイベント、リマインダーsrc/services/notifier.service.ts、src/services/osascript.ts(カレンダーとリマインダー)
notify-sendLinux デスクトップ通知src/services/notifier.service.ts
paplayLinux の通知音src/services/notifier.service.ts
powershellWindows のバルーン通知src/services/notifier.service.ts
which(Windows では where)osascript、afplay、notify-send、paplay、または powershell が存在することを確認します。afplay は存在確認のみで、macOS のサウンド再生には osascript を使用しますsrc/services/notifier.service.ts
xdg-openLinux で一時的なカレンダーファイルを開きますsrc/services/local-calendar.service.ts
launchctlmacOS スケジューラーエージェントのインストール、削除、または状態確認(scheduler status)src/cli/scheduler.ts、src/cli/scheduler-install.ts
crontabLinux のスケジューラー行のインストール、削除、または状態確認(scheduler status)src/cli/scheduler.ts、src/cli/scheduler-install.ts
ファイル

XDG_CONFIG_HOME、XDG_DATA_HOME、XDG_STATE_HOME が設定されていない場合、パスには src/config/xdg.ts の XDG デフォルト値が使用されます。

パス書き込まれる内容コード
$XDG_CONFIG_HOME/mailoo/config.toml(モード 0600)パスワードや OAuth シークレットを含むアカウントと設定src/config/loader.ts、src/services/alerts-config.ts を通じて save を実行する configure_alerts
$XDG_DATA_HOME/mailoo/audit.log追記専用の監査ログ行。ファイルとディレクトリのモード:SECURITY.mdsrc/safety/audit.ts
$XDG_STATE_HOME/mailoo/scheduled/ と scheduled/sent/スケジュール送信の JSON レコード(モード 0600)。一時ファイルとリネームを通じて置き換えられますsrc/services/scheduler.service.ts
$XDG_DATA_HOME/mailoo/calendar-attachments/カレンダーイベント用に保存された添付ファイルsrc/services/imap.service.ts
$XDG_STATE_HOME/mailoo/mailbox-writers.lockフック、ウォッチャー、スケジューラーを実行する stdio サーバー。保持側はロックを更新し、シャットダウン時に削除します。タイミングについては設定を参照してくださいsrc/safety/writer-lease.ts
$XDG_STATE_HOME/mailoo/calendar-processed.json(モード 0600)と .lockすでに自動イベントが追加、検出、またはダイアログで却下されたメッセージと、各メールの件名。一時ファイルとリネームを通じて置き換えられます。追加に失敗した場合やタイムアウトした場合は記録されないため、そのメールは引き続き対象になります。ファイルが破損している場合、自動カレンダー処理は停止し、最初からやり直すのではなく、analyze_email_for_scheduling がエラーを報告しますsrc/utils/calendar-state.ts
作業ディレクトリ内の savePath引数が設定されている場合の download_attachment または export_emailsrc/tools/attachments.tool.ts、src/tools/export.tool.ts
OS の一時ディレクトリ、mailoo-event-*.icsxdg-open に渡される Linux のカレンダーファイルsrc/services/local-calendar.service.ts
~/Library/LaunchAgents/com.bitfloo.mailoo.scheduler.plistmacOS のスケジューラーエージェント。標準出力と標準エラー出力は /tmp/mailoo-scheduler.log ですsrc/cli/scheduler-install.ts、src/cli/scheduler.ts
ユーザーの crontabLinux 上の Mailoo の行src/cli/scheduler-install.ts
MCP クライアントの設定(Claude、Cursor、Windsurf)mailoo install は起動エントリをマージし、一時ファイルとリネームを通じてファイルを置き換えます(モード 0600)。JSON オブジェクトではないファイル(たとえば、コメントを含む JSON)は変更せず、コマンドを停止しますsrc/cli/install-commands.ts、src/cli/client-config.ts

$XDG_CONFIG_HOME/mailoo/templates/ 内のテンプレートは読み込まれますが、サーバーによって書き込まれることはありません。

環境

単一アカウントの設定では、MCP_EMAIL_* を読み込みます(src/config/loader.ts)。HTTP リッスンでは、MCP_EMAIL_HTTP_HOST、MCP_EMAIL_HTTP_TOKEN、MCP_EMAIL_HTTP_ALLOWED_HOSTS を読み込みます(src/safety/http-transport.ts)。同じ名前が、Smithery の設定キーおよび server.json の packages[].environmentVariables リストでも使われます。

名前役割
MCP_EMAIL_ADDRESS、MCP_EMAIL_PASSWORD、MCP_EMAIL_IMAP_HOST、MCP_EMAIL_SMTP_HOSTアカウント。MCP_EMAIL_OAUTH2_PROVIDER が設定されていない場合、パスワードは必須です
MCP_EMAIL_ACCOUNT_NAME、MCP_EMAIL_FULL_NAME、MCP_EMAIL_USERNAMEID
MCP_EMAIL_IMAP_PORT、MCP_EMAIL_IMAP_TLS、MCP_EMAIL_IMAP_STARTTLS、MCP_EMAIL_IMAP_VERIFY_SSL、MCP_EMAIL_IMAP_DISABLE_IMAP4REV2、MCP_EMAIL_SIEVE_HOST、MCP_EMAIL_SIEVE_PORTIMAP と ManageSieve
MCP_EMAIL_SMTP_PORT、MCP_EMAIL_SMTP_TLS、MCP_EMAIL_SMTP_STARTTLS、MCP_EMAIL_SMTP_VERIFY_SSL、MCP_EMAIL_SMTP_POOL_ENABLED、MCP_EMAIL_SMTP_POOL_MAX_CONNECTIONS、MCP_EMAIL_SMTP_POOL_MAX_MESSAGESSMTP
MCP_EMAIL_OAUTH2_PROVIDER、MCP_EMAIL_OAUTH2_CLIENT_ID、MCP_EMAIL_OAUTH2_CLIENT_SECRET、MCP_EMAIL_OAUTH2_REFRESH_TOKENOAuth2
MCP_EMAIL_RATE_LIMIT、MCP_EMAIL_READ_ONLY、MCP_EMAIL_TOOLSET、MCP_EMAIL_DEFAULT_ACCOUNT、MCP_EMAIL_SAVE_TO_SENT設定
MCP_EMAIL_WATCHER_ENABLED、MCP_EMAIL_WATCHER_FOLDERS、MCP_EMAIL_WATCHER_IDLE_TIMEOUTIDLE ウォッチャー
MCP_EMAIL_HOOK_ON_NEW_EMAIL、MCP_EMAIL_HOOK_PRESET、MCP_EMAIL_HOOK_AUTO_LABEL、MCP_EMAIL_HOOK_AUTO_FLAG、MCP_EMAIL_HOOK_BATCH_DELAY、MCP_EMAIL_HOOK_CUSTOM_INSTRUCTIONSフック
MCP_EMAIL_ALERT_DESKTOP、MCP_EMAIL_ALERT_SOUND、MCP_EMAIL_ALERT_URGENCY_THRESHOLD、MCP_EMAIL_ALERT_WEBHOOK_URL、MCP_EMAIL_ALERT_WEBHOOK_ALLOW_PRIVATEアラート
MCP_EMAIL_HOOK_AUTO_CALENDAR、MCP_EMAIL_HOOK_CALENDAR_NAME、MCP_EMAIL_HOOK_CALENDAR_ALARM_MINUTES、MCP_EMAIL_HOOK_CALENDAR_CONFIRMカレンダーの自動設定
MCP_EMAIL_SYSTEM_ONE_ENABLEDSystem One の切り替え。API キーは TYPESAFE_API_KEY であり、MCP_EMAIL_* 変数ではありません
TYPESAFE_API_KEY、TYPESAFE_BASE_URLSystem One の認証情報と任意の API ルート。SDK は TYPESAFE_BASE_URL を読み込みます
XDG_CONFIG_HOME、XDG_DATA_HOME、XDG_STATE_HOME、APPDATA上記のディレクトリを上書きします。APPDATA は、mailoo install が使用する Windows の Claude 設定ディレクトリです
MCP_EMAIL_HTTP_HOST、MCP_EMAIL_HTTP_TOKEN、MCP_EMAIL_HTTP_ALLOWED_HOSTSHTTP リッスンポリシー

API

ツール(57)
読み取り(19)
ツール説明
list_accounts設定済みのすべてのメールアカウントを一覧表示します
list_mailboxes未読件数と特別用途フラグを含むフォルダーを一覧表示します
list_emails日付、送信者、件名、フラグで絞り込める、ページ分割されたメール一覧を取得します
get_email添付ファイルのメタデータを含むメール全文を読み取ります
get_emails1 回の呼び出しで複数のメールの全文を取得します(最大 20 件)
get_email_status本文を取得せずに、メールの既読状態、フラグ、ラベルを取得します
search_emailsキーワードで検索します。since/before(別名 start_date/end_date)を指定できます
download_attachment添付ファイルをダウンロードします(base64、または savePath でディスクに保存 — 読み取り専用の書き込みではありません)
export_email1 件のメッセージを RFC 822 形式の生の .eml ソースとしてエクスポートします(base64、または savePath でディスクに保存)。フラグは変更されません
find_email_folderメールが存在する実際のフォルダーを特定します(仮想フォルダーを解決します)
extract_contacts最近のメールヘッダーから重複のない連絡先を抽出します
get_threadReferences/In-Reply-To を使用してスレッドを再構成します
list_templates利用可能なメールテンプレートを一覧表示します
get_email_statsメール分析 — 件数、送信者の上位一覧、日別の傾向
check_health接続状態、レイテンシ、クォータ、IMAP 機能を確認します
get_email_securitySPF/DKIM/DMARC と From/Reply-To/Return-Path のドメインを読み取り専用で確認します
sieve_statusManageSieve に接続できるかどうかを確認します(デフォルトポート 4190)
sieve_list_scriptsManageSieve スクリプトを一覧表示します
sieve_get_scriptManageSieve スクリプトをダウンロードします
書き込み(12)
ツール説明
send_email新しいメールを送信します(プレーンテキストまたは HTML、CC/BCC、添付ファイル)
reply_email適切なスレッド情報(In-Reply-To、References)を付けて返信します
forward_email元の内容を引用して転送します
save_draft下書きを保存します(RFC 2047 件名、添付ファイルは任意)
send_draft既存の下書きを送信し、「下書き」から削除します
apply_template変数を置換してテンプレートを適用します
schedule_emailメールの配信を予約します
list_scheduledステータス別に予約済みメールを一覧表示します
cancel_scheduled保留中のメール配信予約をキャンセルします
sieve_put_scriptManageSieve スクリプトを作成または置換します(有効化はしません)
sieve_delete_scriptManageSieve スクリプトを削除します
sieve_activate_scriptスクリプトを有効化します(名前を空にするとすべて無効化されます)
管理(7)
ツール説明
move_emailメールをフォルダー間で移動します
delete_emailゴミ箱に移動するか、完全に削除します
mark_email既読/未読、フラグの設定/解除を行います
bulk_action最大 100 件のメールに対する一括操作を行います
create_mailbox新しいメールボックスフォルダーを作成します
rename_mailbox既存のメールボックスフォルダーの名前を変更します(INBOX または特別用途フォルダーは対象外)
delete_mailboxメールボックスとその内容を完全に削除します(INBOX または特別用途フォルダーは対象外)
ラベル(5)
ツール説明
list_labels利用可能なラベルを検出します(プロバイダーの方式を自動判定)
add_labelメールにラベルを追加します(ProtonMail フォルダー、Gmail X-GM-LABELS、または IMAP キーワード)
remove_labelメールからラベルを削除します
create_label新しいラベルを作成します
delete_labelラベルを削除します(Gmail では INBOX または特別用途フォルダーは対象外)

注: ラベルを IMAP キーワードとして保存するサーバーでは、キーワードは IMAP atom (RFC 9051)でなければなりません。空白、制御文字、非 ASCII 文字、および ( ) { % * " \ ] は使用できません。 これ以外のラベルは、何も送信される前にエラーとして拒否されるため、Receipts (2024) は失敗します(以前のリリースでは受け入れられていました)。既存の atom ではないキーワードの削除については、add_label / remove_label を参照してください。

ウォッチャーとアラート(6)
ツール説明
get_watcher_statusIMAP IDLE 接続、監視中のフォルダー、最後に確認した UID を表示します
list_presets利用可能な AI トリアージプリセットと、その説明および推奨ラベルを一覧表示します
get_hooks_config現在のフック設定(プリセット、ルール、カスタム指示)を表示します
configure_alerts実行時にアラート/通知の設定を更新します
check_notification_setupデスクトップ通知のサポート状況を診断し、設定手順を提示します
test_notificationOS の権限が設定されていることを確認するため、テスト通知を送信します
カレンダーとリマインダー(8)
ツール説明
extract_calendarメールから ICS/iCalendar イベントを抽出します
analyze_email_for_schedulingメールを分析し、イベントやリマインダーに適した内容を検出します
add_to_calendarメールのイベントをローカルカレンダー(macOS/Linux)に追加します
create_reminderメールから macOS Reminders.app にリマインダーを作成します
list_calendars利用可能なすべてのローカルカレンダーを一覧表示します
list_eventsタイトル、日付、カレンダーの任意のフィルターを指定して、ローカルカレンダーのイベントを一覧表示します
list_remindersタイトルとリストの任意のフィルターを指定して、Reminders.app の項目を一覧表示します
check_calendar_permissionsローカルカレンダーにアクセスできるかどうかを確認します

上記ツールのパラメーターに関する注記:docs/tools.md。

プロンプト(7)

プロンプトは、呼び出すツールがツールセットに登録されている場合にのみ一覧表示されます。summarize_thread には core または full が、summarize_meetings には full が必要です。送信、下書き、または一括処理ツールがない場合(minimal、read_only)、プロンプトではその手順を省略します。

プロンプト説明
triage_inbox未読メールを分類して優先順位を付け、推奨アクションを提示します
summarize_threadメールのスレッドを要約します
compose_reply文脈を考慮したメールへの返信を下書きします
draft_from_context提供された文脈と指示に基づいて新しいメールを作成します
extract_action_itemsメールのスレッドから実行可能なタスクを抽出します
summarize_meetingsメールから今後のカレンダーイベントを要約します
cleanup_inboxアーカイブ、削除、または配信停止を提案するメールを提示します
リソース(6)
リソースURI説明
アカウントemail://accounts設定済みアカウントの一覧
メールボックスemail://{account}/mailboxesアカウントのフォルダーツリー
未読email://{account}/unread未読メールの概要
テンプレートemail://templates利用可能なメールテンプレート
統計email://{account}/statsメール統計のスナップショット
予約済みemail://scheduled送信待ちの予約メール
プロバイダーの自動検出
プロバイダードメイン
Gmailgmail.com
Outlook / Hotmailoutlook.com, hotmail.com, live.com
Yahoo Mailyahoo.com, ymail.com
iCloudicloud.com, me.com, mac.com
Fastmailfastmail.com
ProtonMail Bridgeproton.me, protonmail.com
Zoho Mailzoho.com
GMXgmx.com, gmx.de, gmx.net
アーキテクチャ
src/
├── main.ts                — Entry point and subcommand routing
├── server.ts              — MCP server factory
├── logging.ts             — MCP protocol logging bridge
├── cli/                   — Interactive CLI commands
│   ├── account-commands.ts — Account CRUD (list, add, edit, delete)
│   ├── setup.ts           — Legacy setup alias → account add
│   ├── test.ts            — Connection tester
│   ├── config-commands.ts — Config management (show, edit, path, init)
│   ├── install-commands.ts — MCP client registration (install, status, remove)
│   ├── providers.ts       — Provider auto-detection (IMAP/SMTP presets)
│   └── scheduler.ts       — Scheduler CLI
├── config/                — Configuration layer
│   ├── xdg.ts             — XDG Base Directory paths
│   ├── schema.ts          — Zod validation schemas
│   └── loader.ts          — Config loader (TOML + env vars)
├── connections/
│   ├── auth.ts            — IMAP/SMTP credentials (password or OAuth2)
│   ├── backoff.ts         — Reconnect delays with jitter after a failed connect
│   ├── manager.ts         — Lazy persistent IMAP/SMTP with OAuth2 (experimental)
│   └── probe.ts           — One-shot IMAP/SMTP login checks (setup wizard, mailoo test)
├── services/              — Business logic
│   ├── imap.service.ts    — IMAP operations
│   ├── label-strategy.ts  — Provider-aware label strategy (ProtonMail/Gmail/IMAP keywords)
│   ├── smtp.service.ts    — SMTP operations + optional \\Sent APPEND
│   ├── sieve.service.ts   — ManageSieve (RFC 5804)
│   ├── template.service.ts — Email template engine
│   ├── oauth.service.ts   — OAuth2 token management (experimental)
│   ├── mail-services.ts   — IMAP/SMTP services from the config, for the servers and the scheduler CLI
│   ├── calendar.service.ts — ICS/iCalendar parsing
│   ├── scheduler.service.ts — Email scheduling queue
│   ├── watcher.service.ts — IMAP IDLE real-time watcher with auto-reconnect
│   ├── hooks.service.ts   — AI triage via MCP sampling + static rules + auto-labeling/flagging
│   ├── notifier.service.ts — Multi-channel notification dispatcher (desktop/sound/webhook)
│   ├── presets.ts         — Built-in hook presets (inbox-zero, gtd, priority-focus, etc.)
│   └── event-bus.ts       — Typed EventEmitter for internal email events
├── tools/                 — MCP tool definitions (57)
├── prompts/               — MCP prompt definitions (7)
├── resources/             — MCP resource definitions (6)
├── safety/                — Audit trail, rate limiter, stdio lifecycle, shutdown, writer lease
│   └── http-transport.ts  — Streamable HTTP listen policy
├── utils/                 — RFC 2047 compose, MIME body, auth headers
└── types/                 — Shared TypeScript types

メンテナー

Bitfloo

コントリビューション

PR は develop(GitHub のデフォルトブランチ)宛てに受け付けています。develop はリリースブランチであり、ここから v* のタグを付けてリリースします。この README を編集する際は、standard-readme の仕様に準拠してください。CONTRIBUTING.md を参照してください。

# Development workflow
pnpm install
pnpm typecheck          # type check
pnpm check              # lint and format
pnpm ci:local           # lint, typecheck, unit; GreenMail if Docker is up
pnpm test               # unit tests (Vitest; no mail server)
pnpm test:integration   # GreenMail IMAP/SMTP (needs Docker)
pnpm test:all           # unit plus GreenMail
pnpm build              # build
pnpm start              # run

pnpm test:integration と pnpm test:all には Docker が必要です。Docker が停止している場合、pnpm ci:local は GreenMail をスキップします。プルリクエストで GitHub が実行する内容は、CONTRIBUTING.md に記載されています。mailoo test/npx -y @bitfloo/mailoo test は実際のアカウントへの接続確認であり、Vitest ではありません。

帰属表示とライセンス

これは、codefuturistによるemail-mcpのLGPL-3.0-or-later の公開フォークです。 codefuturist の公式プロジェクトではありません。原著作権は引き続き原著作者に帰属します。 Mailoo のブランディング、Bitfloo の商標、および新しいコードの著作権は、Copyright (c) 2026 Bitfloo に帰属します。

LGPL-3.0-or-laterの下でライセンスされています。LGPL-3 で必要とされる GNU GPL-3 のテキストはCOPYINGにあります。 帰属表示はNOTICEに記載されています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。