Skip to main content
Glama
vasparshin

zoho-multi-mcp

by vasparshin

zoho-multi-mcp

MCP (Model Context Protocol) サーバーで、Claude などの AI アシスタントを Zoho Mail アカウントに接続します。AI ワークフローから直接、メールの読み取り、送信、検索、返信、削除を実行できます。さらに、メールボックスごとに1つのプロセスを使うのではなく、1つの軽量プロセスから任意の数の Zoho メールボックスを実行できます。

これは FujiwaraChoki/zoho-mail-mcp(MIT ライセンス、LICENSE 参照)にマルチアカウント対応を追加したフォークです。元のシングルアカウントサーバーの功績はすべてアップストリームの作者に帰属します。

このフォークが存在する理由

MCP 経由で複数の Zoho メールボックスを実行している場合(チーム用、プロジェクト専用の送信者用など)、自然な構成はメールボックスごとに1つのサーバープロセスを立てることです。これで動作はしますが、各プロセスは、メールボックスがどれほど小さく、またアイドル状態であっても、同じ固定の Bun/V8 ランライムメモリオーバーヘッド(約75〜85MB の RSS)を支払います。メールボックスが3つあれば、そのベースラインの3倍のコストを払うことになりますが、実際のアカウントごとの状態(OAuth トークンやフォルダキャッシュ)はわずかなので、そのコストに見合う利益はありません。

このフォークは、オプトイン方式のマルチアカウントモードを追加します。1つのプロセスで複数の Zoho アカウントを処理でき、呼び出し側が呼び出しごとにアカウントを指定する単一のエンドポイントとして動かすか、既存のセットアップにとってはより安全な選択肢として、それぞれ専用の固定ポートを持つ複数のリスナーを立て、各リスナーが素のシングルアカウントサーバーとまったく同じに動作させることができます。本番環境での測定結果: シングルアカウントの3プロセスを並列実行すると合計 RSS は約 230MB でしたが、同じ3つのメールボックスを提供する1つのプロセスに集約すると約 90MB の RSS になりました。「マルチアカウントモード」セクションより後ろの内容はすべてアップストリームから変更されておらず、メールボックスが1つだけで十分な場合は、従来どおりの動作になります。

Related MCP server: Mailing Manager MCP

ツール

ツール

説明

list_folders

すべてのメールフォルダを一覧表示する

list_emails

フィルタリングとページネーション付きでフォルダ内のメールを一覧表示する

read_email

指定したメールの完全な内容を読み取る

search_emails

すべてのフォルダからキーワードでメールを検索する

send_email

新しいメールを送信する

reply_email

既存のメールに返信する(返信 / 全員に返信)

delete_email

メールを削除する(ゴミ箱または完全削除)

セットアップ

1. Zoho API クライアントを作成する

  1. Zoho API Console にアクセスします(米国データセンターの場合は .com を使用します)

  2. Add Client > Self client の順にクリックします

  3. Client ID と Client Secret を控えます

2. リフレッシュトークンを生成する

対話的なセットアップヘルパーを実行します:

bun run setup.ts

または手動の場合:

  1. Self Client 内で、次のスコープの認可コードを生成します:

    ZohoMail.accounts.READ,ZohoMail.folders.READ,ZohoMail.messages.READ,ZohoMail.messages.CREATE,ZohoMail.messages.DELETE
  2. 有効期間を10分に設定し、説明を追加して、Create をクリックします

  3. 生成されたコードをコピーし、セットアップスクリプトで使って交換します

3. 認証情報を確認する

ZOHO_CLIENT_ID=your_id ZOHO_CLIENT_SECRET=your_secret ZOHO_REFRESH_TOKEN=your_token bun run setup.ts --verify

4. MCP クライアントを設定する

シングルアカウント — Claude Code(~/.claude.json)

{
  "mcpServers": {
    "zoho-mail": {
      "command": "bun",
      "args": ["run", "/path/to/zoho-multi-mcp/src/index.ts"],
      "env": {
        "ZOHO_CLIENT_ID": "your_client_id",
        "ZOHO_CLIENT_SECRET": "your_client_secret",
        "ZOHO_REFRESH_TOKEN": "your_refresh_token",
        "ZOHO_DATACENTER": "eu"
      }
    }
  }
}

Claude Desktop の claude_desktop_config.json も同じ構成です。

マルチアカウントモード

このサーバーで実行する Zoho アカウントごとに、上記のいずれかの手順を一度実行し、それから2つのモードのどちらかを選択します。

モードA — 単一エンドポイント、呼び出し側がアカウントを選ぶ

ZOHO_ACCOUNTS_JSON にアカウントの JSON 配列を設定し、サーバーを通常どおり ZOHO_HTTP_PORT を指定して起動します(または stdio)。すべてのツールに必須の account フィールド(指定した id の文字列 enum)が付き、すべての呼び出しでどのアカウント向けかを指定する必要があります。

export ZOHO_ACCOUNTS_JSON='[
  {"id": "work", "clientId": "...", "clientSecret": "...", "refreshToken": "..."},
  {"id": "personal", "clientId": "...", "clientSecret": "...", "refreshToken": "..."}
]'
export ZOHO_HTTP_PORT=8010
bun run src/index.ts

MCP クライアントが毎回の呼び出しで明示的な account 引数を受け入れ、設定用に single の URL で済みたい場合に適しています。

モードB — 1つのプロセスで複数の固定アカウントリスナーを立てる

上と同様に ZOHO_ACCOUNTS_JSON を設定し、各アカウントを固有のポートに結び付ける ZOHO_MULTI_PORT_JSON を設定します。各リスナーは生粋のシングルアカウントサーバーとして動作します。どのツールも account フィールドを持たず、そのポートの素のシングルアカウント構成とバイト単位で同一です。

export ZOHO_ACCOUNTS_JSON='[
  {"id": "work", "clientId": "...", "clientSecret": "...", "refreshToken": "..."},
  {"id": "personal", "clientId": "...", "clientSecret": "...", "refreshToken": "..."}
]'
export ZOHO_MULTI_PORT_JSON='[
  {"id": "work", "port": 8010, "name": "zoho-mail-work"},
  {"id": "personal", "port": 8011, "name": "zoho-mail-personal"}
]'
bun run src/index.ts

既存のマルチプロセス構成を移行するときに使うのがこのモードです。MCP クライアントの設定はに使っているのと同じポートを向いたままで、これまで動かしていた複数のプロセスの代わりにこの1つのプロセスを起動するだけで、ほかに変更するものはありません。name は任意で、ログ行のラベルにのみ影響します。

どちらのモードも必須ではありません。ZOHO_ACCOUNTS_JSON と ZOHO_MULTI_PORT_JSON の両方を設定しなければ、サーバーは従来のシングルアカウントのアップストリームプロジェクトとまったく同じに動作し、ZOHO_CLIENT_ID / ZOHO_CLIENT_SECRET / ZOHO_REFRESH_TOKEN を直接読み取ります。

環境変数

変数

必須

説明

ZOHO_CLIENT_ID

シングルアカウントモードのみ

Zoho API コンソールからの OAuth2 Client ID

ZOHO_CLIENT_SECRET

シングルアカウントモードのみ

OAuth2 Client Secret

ZOHO_REFRESH_TOKEN

シングルアカウントモードのみ

OAuth2 Refresh Token(セットアップ時に生成)

ZOHO_DATACENTER

いいえ

Zoho データセンター:eu(デフォルト)、us、in、au、jp

ZOHO_ACCOUNTS_JSON

マルチアカウントモードのみ

{id, clientId, clientSecret, refreshToken, datacenter?} 形式の JSON 配列

ZOHO_MULTI_PORT_JSON

マルチポートモードのみ

{id, port, name?} 形式の JSON 配列。各 id は ZOHO_ACCOUNTS_JSON 内に存在する必要があります

ZOHO_HTTP_PORT

いいえ

stdio の代わりに、このポートで HTTP サーバーとして起動します

ZOHO_SERVER_NAME

いいえ

stdio / シングルポート HTTP モード用のログ行のラベル

特徴

  • 自動更新付き OAuth2 - トークンは自動的に更新され、手動での操作は不要。マルチアカウントモードではアカウントごとにキャッシュされます

  • レート制限 - Zoho API の制限内に収まるよう、組み込みの sliding window レートリミッター(30 リクエスト/分)を搭載

  • 401 でのリトライ - 認証失敗時は自動的にトークンを更新して再試行します

  • HTML をプレーンテキストに変換 - メール本文は AI が扱いやすいクリーンなプレーンテキストに変換されます

  • マルチアカウント対応・低メモリ - 上記の「このフォークが存在する理由」を参照

要件

  • Bun ランライム

  • API アクセスが有効な Zoho Mail アカウントが 1つ以上

ライセンス

MIT (c) 2026 Sami Hindi — LICENSE を参照してください。このフォークで追加されたマルチアカウント / マルチポート部分は同じライセンスの下で公開されています。

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects AI assistants to email accounts via IMAP/SMTP, enabling reading, searching, sending, and organizing emails with features like smart drafts, scheduling, and attachment handling.
    95 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to read, search, send, and reply to Zoho Mail via IMAP/SMTP using an application-specific password.
    1
    MIT