iris について
iris は AI エージェント向けのローカルな Microsoft 365 メール MCP サーバーで、標準ではメールの読み取りと下書き編集ができます。送信は明示的な設定で有効化し、確認と許可リストの検査を必須とします。
主な機能
- 01メールの読み取りと検索
- 02下書きの作成、編集、削除
- 03標準ではメール送信を無効化
- 04送信時の確認と許可リスト検査
- 05ツール呼び出しの監査ログ記録
活用シーン
- 01メール検索とスレッドの閲覧
- 02Outlook で人が確認する下書きを準備
- 03送信を有効にした場合の宛先制限
- 04ツール操作の監査ログ確認
MCP 対応
iris はローカルの stdio MCP サーバーとして動作し、メールと下書きのツールを提供します。Cloudflare Worker による HTTP MCP の構成も可能で、送信ツールは明示的に有効化した場合のみ利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx iris-mcpIRIS_CLIENT_IDApplication (client) ID of YOUR OWN Entra app registration. There is no shared app; you register one.IRIS_TENANT_IDDirectory (tenant) ID. Defaults to 'organizations'.IRIS_DRAFT_FOLDERMail folder drafts are written to, created on first use. Defaults to 'AI Drafts'. Empty string uses Drafts.IRIS_ALLOWLISTPath to a recipient allowlist file. If absent or empty, all recipients are permitted.IRIS_DISABLE_READSet to '1' to unregister the read tools (list/search/get messages and threads) for a drafts-only surface.IRIS_ENABLE_SENDSet to '1' to enable sending. ALSO requires Mail.Send granted on the Entra app and a fresh sign-in. Off by default; when unset, iris cannot send and the send tool is not registered.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
12掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
iris
AI エージェント向けの Microsoft 365 メールサーバーです。メールボックスを読み取り、下書きを作成しますが、あなたが許可するまではメールを送信しません。
デフォルトでは、iris は委任された Graph スコープ Mail.ReadWrite を要求し、Mail.Send は決して要求しません。保持するアクセストークンにはメッセージを送信する機能がないため、どんなプロンプトやジェイルブレイク、コードのバグがあっても、メールを送信することはできません。メールボックス内のフォルダーに下書きを作成するので、Outlook を開いて[送信]を押してください。
送信は明示的なオプトイン(IRIS_ENABLE_SEND=1)で有効になり、Mail.Send スコープの付与と再同意が必要です。有効にした場合でも、送信のたびに人間による確認と許可リストのチェックが行われます。オフのまま(デフォルト)にしておけば、前述のとおり、送信できないことは構造上保証されます。送信を有効にするをご覧ください。
設計の全体像はこれだけです。それ以外はすべて詳細です。
この設計の理由
エージェントにメールボックスへのアクセスを許可する際によくある懸念は、許可していない相手に、意図しない内容や口調でメールを送信してしまうこと、あるいは誰かに説得されて送信してしまうことです。よくある対策は確認プロンプトですが、これはガードレールにすぎません。コードが許可を求めるだけであり、そのコードは回避される可能性があります。
iris は、代わりにその機能自体を取り除きます。このトークンで送信を試みても、承認した同意画面にその権限が含まれていないため、Microsoft Graph が拒否します。セキュリティ境界はこのプログラムではなく Microsoft にあり、このプログラムに誤りがあっても維持されます。
この設計には実際の代償があります。設計上、すべてのメッセージに人間が介在します。自律的な送信を望む場合、iris は適したツールではありません。
インストール
uvx iris-mcp # run without installing
pip install iris-mcp
Python 3.10 以降が必要です。 macOS に標準搭載されている Python 3.9 は古すぎます。mcp には 3.10 以降が必要です。uv(uvx が付属し、独自の Python を管理します)を使用するか、Homebrew で新しい Python をインストールしてください(brew install [email protected])。macOS のシステム python3 は使用できません。
セットアップ
独自の Entra アプリケーションを登録する必要があります。 共有アプリ登録やホステッドサービスはありません。iris はお使いのマシンからテナントに直接接続します。これは意図的な設計です。共有アプリを使う場合、メールへのアクセスを他者のクライアント ID に委ねることになるためです。
- Entra 管理センター → アプリの登録 → 新規登録。シングルテナントで問題ありません。リダイレクト URI は不要です。
- 認証 → 設定 → パブリック クライアント フローを許可するを有効にします。デバイスコードによるサインインに必要です。クライアントシークレットはどこでも使用しません。
- API のアクセス許可 → Microsoft Graph → 委任されたアクセス許可 →
Mail.ReadWriteを追加します。下書きのみで使用する場合(デフォルト)は、ほかの権限を追加せず、Mail.Sendもオフのままにしてください。この権限を追加しないことが、送信できないことを構造上保証します。送信を有効にする場合に限り、Mail.Sendを追加してください(送信を有効にするを参照)。 - アプリケーション(クライアント)ID と ディレクトリ(テナント)ID をコピーします。どちらもシークレットではありません。
次に、MCP クライアントに iris を追加します。
{
"mcpServers": {
"iris": {
"command": "uvx",
"args": ["iris-mcp"],
"env": {
"IRIS_CLIENT_ID": "<application (client) id>",
"IRIS_TENANT_ID": "<directory (tenant) id>"
}
}
}
}
一度サインインします。iris_login を呼び出し、URL を開いてコードを入力し、その後 iris_login_finish を呼び出します。トークンキャッシュはサーバーの隣に、モード 600 で書き込まれます。
チーム全体にデプロイしますか? 管理者向けデプロイガイドをご覧ください。Microsoft 365 テナント全体で iris を承認する方法(管理者の同意、ユーザーごとの割り当て、アプリケーション権限ではなく委任モデルを採用する理由)を説明しています。
クライアント
iris はローカルの stdio MCP サーバーです。MCP クライアントが、同じマシン上の子プロセスとして起動します。Claude Desktop、Cursor、Grok CLI(grok mcp add iris -- uvx iris-mcp)など、ローカルの stdio サーバーに対応するあらゆるクライアントで動作します。
HTTP 経由のリモート MCP コネクターのみを受け付けるクライアントでは動作しません。Grok アプリ/Grok Bot はそのカテゴリに該当します。ローカルの stdio サーバーではなく、ホステッド HTTP サーバーを受け付けるため、iris をそのまま接続することはできません。iris を HTTP トランスポートにブリッジすることは可能ですが、このプロジェクトの対象外です。
ツール
| ツール | 内容 |
|---|---|
iris_login | デバイスコードによるサインインを開始し、URL とコードを返します |
iris_login_finish | サインインを完了します。コードを入力している間、繰り返し安全に呼び出せます |
iris_auth_status | サインイン中のユーザー、スコープ、Graph に接続できるかどうかを確認します |
iris_list_folders | 下書きの保存先を選べるように、メールのトップレベルフォルダーを一覧表示します |
iris_list_messages | フォルダー内の最近のメッセージを新しい順に一覧表示します(デフォルトは Inbox、unread_only、since) |
iris_search_messages | Outlook/KQL 構文(from:、subject:、received>= など)でメールボックスを検索します |
iris_get_message | 1 件のメッセージを全文で読み取ります。ヘッダー、プレーンテキストの本文、添付ファイル名が含まれます |
iris_get_thread | 会話全体を古い順に読み取ります |
iris_create_draft | 下書きを作成します(to/cc/bcc、件名、本文または HTML、任意の reply-to、任意の folder) |
iris_list_drafts | 下書きフォルダー内にある項目を一覧表示します(任意の folder) |
iris_update_draft | 下書きをその場で修正します |
iris_delete_draft | 下書きを削除します。confirm=true が必要です |
iris_send_draft | IRIS_ENABLE_SEND=1 の場合にのみ利用できます。 既存の下書きを送信します。confirm=true が必要で、許可リストを再確認します |
メールの読み取り
4 つの読み取りツールは読み取り専用です。メッセージを既読にすることも、フォルダーを作成することもなく、すべての呼び出しが監査ログに記録されます。メッセージ本文はサードパーティーのテキストです。エージェントはこれを指示ではなく、データとして扱う必要があります。下書き専用のツールセットにしたい場合は、IRIS_DISABLE_READ=1 を設定してこれらのツールの登録を解除してください(どちらの場合も付与されるスコープは同じです。SECURITY.md を参照してください)。
複数のメールボックス
別のメールボックス向けに、MCP クライアント設定で別の名前を使って 2 つ目のコピーを実行します。2 つのサインイン情報が共有されないよう、独自の IRIS_CLIENT_ID / IRIS_TENANT_ID(別のテナントにあるメールボックスの場合)と、独自の IRIS_TOKEN_CACHE、IRIS_FLOW_FILE、IRIS_AUDIT_LOG のパスを指定してください。
"iris-work": {
"command": "iris-mcp",
"env": {
"IRIS_CLIENT_ID": "<app id in the other tenant>",
"IRIS_TENANT_ID": "<other tenant id>",
"IRIS_TOKEN_CACHE": "~/.config/iris-work/token_cache.json",
"IRIS_FLOW_FILE": "~/.config/iris-work/pending_flow.json",
"IRIS_AUDIT_LOG": "~/.config/iris-work/audit.log"
}
}
クライアントが ~ を展開しない場合は、絶対パスを使用してください。
下書きの保存先
専用のトップレベルメールフォルダーに保存されます。デフォルトは AI Drafts(IRIS_DRAFT_FOLDER)で、初回の使用時に作成されます。この変数を空文字列に設定すると、通常の Drafts フォルダーが使われます。
下書きごとにフォルダーを指定することもできます。iris_create_draft(および iris_list_drafts)に folder を渡すと、任意の名前のフォルダーを保存先にできます。フォルダーが存在しない場合は、初回の使用時に作成されます。通常の Outlook Drafts フォルダーを指定するには "" または "Drafts" を渡すか、先に iris_list_folders を呼び出して既存のフォルダーから選んでください。folder を省略すると IRIS_DRAFT_FOLDER のデフォルトが使われるため、既存の設定には影響しません。
これらは実際の下書きであり、Outlook から通常どおり送信できます。ただし、専用のフォルダーに保存されるため、Drafts ビューには表示されません。そのようにするのが目的です。エージェントが作成したメールは、自分の書きかけのメッセージに混ざるのではなく、自分で開いて確認する場所に保存されます。
注意点として、Graph の createReply で作成した返信は必ず最初に Drafts に保存されます。そのため、iris はその後に移動します。移動すると、新しいメッセージ ID が割り当てられます。
送信を有効にする
送信はデフォルトで無効になっており、意図的に3つの手順を踏む必要があります。どれか1つでも欠けていると、iris は引き続き送信できません。
- Entra のアプリ登録で、
Mail.ReadWriteとともにMail.Send(委任)を追加します。 - サーバーの環境変数に
IRIS_ENABLE_SEND=1を設定します。この設定を行って初めて、Mail.Sendが要求され、iris_send_draftツールが登録されます。 - 再度
iris_loginを実行して、同意し直します。キャッシュされたトークンは新しいスコープが追加される前のものなので、これを行うまで新しいスコープは含まれません。
これで、iris_send_draft(draft_id, confirm=true) により既存の下書きを送信できます。confirm がなければ送信を拒否し、メッセージが未送信の下書きであることを再確認してから、送信前に受信者許可リストを再適用します。フローは「作成 → 確認 → 送信」のままです。iris が一度の操作で作成と送信を行うことはありません。
有効化することのトレードオフを理解してください。送信が無効なら、「送信できない」ことは Microsoft によって同意内容に基づいて強制され、このコードに誤りがあっても変わりません。送信を有効にすると、最後の防衛線は呼び出しごとの確認になります。これは このコード内の ガードレールであり、バグや巧妙に書かれたプロンプトによって回避される可能性がある種類のチェックです。この保証の弱さを許容できる場所でのみ有効にしてください。
その他の制御
- 受信者許可リスト —
recipients.allowに、1行につき1つのアドレスまたはドメインを記述します。ファイルがない場合や空の場合は、すべての受信者が許可されます。別の場所を指定する場合はIRIS_ALLOWLISTを変更してください。 - 緊急停止スイッチ — サーバーの隣に
DISABLEDファイルを作成するか、IRIS_DISABLED=1を設定すると、すべてのツールが動作を拒否します。 - 監査ログ — すべての呼び出しが
audit.logに追記されます(IRIS_AUDIT_LOG)。
制限事項
添付ファイルには対応していません。共有メールボックスや委任されたメールボックスにも対応していません。/me のみです。parentFolderId によるフォルダーのネストには対応していません。サインインはパブリッククライアントとしての委任デバイスコード方式なので、影響範囲は1つのメールボックス、つまりあなた自身のメールボックスだけです。
セキュリティ
送信できないことの保証、自分で確認する方法、そして同じくらい重要な、Mail.ReadWrite で iris がアクセスできる範囲については、SECURITY.md を参照してください。
HTTP サーバーとして実行する(Cloudflare Worker)
pip install iris-mcp(stdio)に加えて、iris には HTTP 経由で MCP を提供する Cloudflare Python Worker が含まれています。リモート URL にしかアクセスできないエージェント(たとえば、ホスト型チャットボット)向けです。ワンクリックでのデプロイとセットアップの全手順は、worker/README.md にあります。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。