{"name":"io.github.SuperAngryMonkey/iris","slug":"superangrymonkey-iris","title":null,"description":"Microsoft 365 mail MCP: drafts into Outlook; sending off by default, opt-in via IRIS_ENABLE_SEND.","url":"https://mcp.market/server/superangrymonkey-iris","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"email","tags":["email"],"presence":{"score":25,"stars":0,"forks":0,"downloads_week":98,"last_push_at":"2026-09-19T23:34:00.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/SuperAngryMonkey/iris","website":null,"version":"0.2.1","remotes":[],"packages":[{"registryType":"pypi","registryBaseUrl":"https://pypi.org","identifier":"iris-mcp","version":"0.2.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Application (client) ID of YOUR OWN Entra app registration. There is no shared app; you register one.","isRequired":true,"name":"IRIS_CLIENT_ID"},{"description":"Directory (tenant) ID. Defaults to 'organizations'.","name":"IRIS_TENANT_ID"},{"description":"Mail folder drafts are written to, created on first use. Defaults to 'AI Drafts'. Empty string uses Drafts.","name":"IRIS_DRAFT_FOLDER"},{"description":"Path to a recipient allowlist file. If absent or empty, all recipients are permitted.","name":"IRIS_ALLOWLIST"},{"description":"Set 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.","name":"IRIS_ENABLE_SEND"}]}],"tools":[{"name":"iris_auth_status","description":"Report whether iris is signed in, as whom, and with what scopes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iris_create_draft","description":"Compose a message into a mail folder as an unsent draft. It is NOT sent — a human opens Outlook and presses Send.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iris_delete_draft","description":"Delete a draft. Destructive, so confirm=true is required — set it only after the human has explicitly approved deleting this specific draft.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iris_list_drafts","description":"List recent messages sitting in a draft folder. folder selects which one by display name; omit it for the configured default (IRIS_DRAFT_FOLDER), or pass \"\" / \"Drafts\" for the normal Outlook Drafts folder.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iris_list_folders","description":"List the mailbox's top-level mail folders (name, id, unread/total counts) so you can pick one to pass as the `folder` argument to iris_create_draft or iris_list_drafts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iris_login","description":"Start a device-code sign-in for the mailbox. Returns a URL and a code for the human to enter in a browser; then call iris_login_finish() to complete. Only needed once, or after the refresh token lapses.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iris_login_finish","description":"Complete a device-code sign-in started with iris_login(). Call after entering the code in the browser. Waits up to ~60s; if the code has not been entered yet, it says so and can simply be called again.","write_action":false,"price_micros":0,"input_schema":null},{"name":"iris_send_draft","description":"Send an existing draft. This tool exists only because IRIS_ENABLE_SEND=1; a default install cannot send at all. Requires confirm=true, set ONLY after explicit human approval of THIS message. Re-verifies the message is still an unsent draft and re-checks the recipient allowlist before sending.","write_action":true,"price_micros":0,"input_schema":null},{"name":"iris_update_draft","description":"Revise an existing draft in place. Only the fields you pass are changed.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-20T16:19:40.129Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:19:40.107Z","components":{"code":{"score":25,"max":25,"notes":["4 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"iris-mcp","version":"0.2.1","found":true,"weeklyDownloads":98,"license":"MIT","dependencyCount":3,"publishedAt":"2026-09-02T21:58:39.561419Z","repositoryUrl":"https://github.com/SuperAngryMonkey/iris"}],"repo":{"found":true,"owner":"SuperAngryMonkey","repo":"iris","archived":false,"pushedAt":"2026-09-19T23:34:00Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/148808873?v=4","ownerCreatedAt":"2023-10-23T18:51:34Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/148808873?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":98,"license":"MIT","lastPushAt":"2026-09-19T23:34:00.000Z","score":25}}}},"grade_history":[],"reviews":[]}