[{"data":1,"prerenderedAt":250},["ShallowReactive",2],{"docs-navigation":3,"i-lucide:book-open":96,"i-lucide:history":100,"i-lucide:shield-check":102,"i-lucide:mail":104,"i-lucide:search":106,"i-lucide:moon":108,"i-lucide:sun":110,"i-lucide:menu":112,"i-lucide:chevron-down":114,"i-lucide:arrow-up-right":116,"i-simple-icons:github":118,"docs-\u002Fdocs\u002Fabout\u002Farchitecture":120,"docs-surround-\u002Fdocs\u002Fabout\u002Farchitecture":237,"i-lucide:arrow-left":242,"i-lucide:arrow-right":244,"i-lucide:copy":246,"i-lucide:hash":248},[4],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fdocs","docs\u002F1.index",[9,10,28,45,66,79],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"children":14,"page":27},"Install","\u002Fdocs\u002Finstall","docs\u002F2.install",[15,19,23],{"title":16,"path":17,"stem":18},"Install with the installer","\u002Fdocs\u002Finstall\u002Finstaller","docs\u002F2.install\u002F1.installer",{"title":20,"path":21,"stem":22},"Install from source","\u002Fdocs\u002Finstall\u002Ffrom-source","docs\u002F2.install\u002F2.from-source",{"title":24,"path":25,"stem":26},"Register with Claude","\u002Fdocs\u002Finstall\u002Fclaude-clients","docs\u002F2.install\u002F3.claude-clients",false,{"title":29,"path":30,"stem":31,"children":32,"page":27},"Providers","\u002Fdocs\u002Fproviders","docs\u002F3.providers",[33,37,41],{"title":34,"path":35,"stem":36},"Outlook.com","\u002Fdocs\u002Fproviders\u002Foutlook","docs\u002F3.providers\u002F1.outlook",{"title":38,"path":39,"stem":40},"Gmail, Fastmail, iCloud and any IMAP server","\u002Fdocs\u002Fproviders\u002Fother-providers","docs\u002F3.providers\u002F2.other-providers",{"title":42,"path":43,"stem":44},"Overriding provider endpoints","\u002Fdocs\u002Fproviders\u002Fendpoint-overrides","docs\u002F3.providers\u002F3.endpoint-overrides",{"title":46,"path":47,"stem":48,"children":49,"page":27},"Reference","\u002Fdocs\u002Freference","docs\u002F4.reference",[50,54,58,62],{"title":51,"path":52,"stem":53},"Tools","\u002Fdocs\u002Freference\u002Ftools","docs\u002F4.reference\u002F1.tools",{"title":55,"path":56,"stem":57},"Configuration","\u002Fdocs\u002Freference\u002Fconfiguration","docs\u002F4.reference\u002F2.configuration",{"title":59,"path":60,"stem":61},"CLI","\u002Fdocs\u002Freference\u002Fcli","docs\u002F4.reference\u002F3.cli",{"title":63,"path":64,"stem":65},"Permissions","\u002Fdocs\u002Freference\u002Fpermissions","docs\u002F4.reference\u002F4.permissions",{"title":67,"path":68,"stem":69,"children":70,"page":27},"Guides","\u002Fdocs\u002Fguides","docs\u002F5.guides",[71,75],{"title":72,"path":73,"stem":74},"The settings window","\u002Fdocs\u002Fguides\u002Fsettings-window","docs\u002F5.guides\u002F1.settings-window",{"title":76,"path":77,"stem":78},"Troubleshooting","\u002Fdocs\u002Fguides\u002Ftroubleshooting","docs\u002F5.guides\u002F2.troubleshooting",{"title":80,"path":81,"stem":82,"children":83,"page":27},"About","\u002Fdocs\u002Fabout","docs\u002F6.about",[84,88,92],{"title":85,"path":86,"stem":87},"Notes and limits","\u002Fdocs\u002Fabout\u002Flimits","docs\u002F6.about\u002F1.limits",{"title":89,"path":90,"stem":91},"Architecture","\u002Fdocs\u002Fabout\u002Farchitecture","docs\u002F6.about\u002F2.architecture",{"title":93,"path":94,"stem":95},"Contributing","\u002Fdocs\u002Fabout\u002Fcontributing","docs\u002F6.about\u002F3.contributing",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":99},0,24,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v16m8.001-2A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2z\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":101},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\"\u002F>\u003Cpath d=\"M3 3v5h5m4-1v5l4 2\"\u002F>\u003C\u002Fg>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":103},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"\u002F>\u003Cpath d=\"m9 12l2 2l4-4\"\u002F>\u003C\u002Fg>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":105},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":107},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":109},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":111},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":113},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":115},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":117},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":119},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"id":121,"title":89,"body":122,"description":230,"extension":231,"icon":232,"meta":233,"navTitle":89,"navigation":234,"path":90,"seo":235,"stem":91,"__hash__":236},"docs\u002Fdocs\u002F6.about\u002F2.architecture.md",{"type":123,"value":124,"toc":224},"minimark",[125,129,140,145,152,163,169,173],[126,127,89],"h1",{"id":128},"architecture",[130,131,136],"pre",{"className":132,"code":134,"language":135},[133],"language-text","src\u002Frubit_mcp_mail\u002F\n  server.py        MCP tool definitions\n  __main__.py      CLI: serve | install | auth | doctor | gui\n  installer.py     setup wizard: writes config, signs in, registers with Claude\n  installer_gui.py the setup window (tkinter), falling back to the terminal\n  shortcuts.py     Start Menu \u002F Desktop \u002F .desktop entries for the GUI\n  claude_registration.py  claude_desktop_config.json \u002F `claude mcp add`\n  session.py       wires config + auth + backend; attachment path safety\n  config.py        TOML config -> Account models\n  diagnostics.py   the doctor checks, as data (shared by the CLI and the GUI)\n  permissions.py   registry of per-account-toggleable tool names\n  config_editor.py every write to config.toml: comment-preserving, validated\n  config_gui.py    the settings window (tkinter): accounts, permissions, doctor\n  providers.py     provider profile registry\n  secrets.py       keyring with 0600-file fallback\n  models.py        pydantic models + message handles\n  mime.py          BODYSTRUCTURE walking, decoding, HTML->text\n  backends\u002F\n    base.py        MailBackend protocol\n    imap.py        the IMAP implementation\n  auth\u002F\n    password.py         app passwords\n    oauth_microsoft.py  MSAL device-code flow\n","text",[137,138,134],"code",{"__ignoreMap":139},"",[141,142,144],"h2",{"id":143},"adding-a-provider","Adding a provider",[146,147,148,151],"p",{},[137,149,150],{},"src\u002Frubit_mcp_mail\u002Fproviders.py"," is a dict of profiles — host, port, and which\nauth strategy to use. Adding a preset is one entry.",[146,153,154,155,158,159,162],{},"A provider that needs a non-IMAP API instead implements the ",[137,156,157],{},"MailBackend","\nprotocol in ",[137,160,161],{},"src\u002Frubit_mcp_mail\u002Fbackends\u002Fbase.py","; the tool layer does not\nchange. That protocol's docstring carries the project's central rule:",[164,165,166],"blockquote",{},[146,167,168],{},"No implementation may set flags, move, delete, append, or expunge.",[141,170,172],{"id":171},"the-layering","The layering",[174,175,176,186,194,216],"ul",{},[177,178,179,185],"li",{},[180,181,182],"strong",{},[137,183,184],{},"server.py"," is the only file that knows about MCP. It does argument\nvalidation, permission guarding, and turns exceptions into readable strings.",[177,187,188,193],{},[180,189,190],{},[137,191,192],{},"session.py"," owns the wiring — config in, an authenticated backend out —\nand is the only place that touches the filesystem for downloads.",[177,195,196,201,202,205,206,209,210,215],{},[180,197,198],{},[137,199,200],{},"backends\u002Fimap.py"," is the only file that speaks IMAP. Every read path uses\n",[137,203,204],{},"EXAMINE"," and ",[137,207,208],{},"BODY.PEEK","; there are no write paths, and\n",[211,212,214],"a",{"href":213},"\u002Fsecurity#the-test-that-enforces-it","a test enforces that",".",[177,217,218,223],{},[180,219,220],{},[137,221,222],{},"auth\u002F"," hands back credentials without knowing what they'll be used for.",{"title":139,"searchDepth":225,"depth":226,"links":227},2,3,[228,229],{"id":143,"depth":225,"text":144},{"id":171,"depth":225,"text":172},"A file-by-file map of the source tree.","md","i-lucide-folder-tree",{},true,{"title":89,"description":230},"_8T4UbfJv-s8Pl__Mb7g-a3EZXFg12eVjwTBnC8KuKg",[238,240],{"title":85,"path":86,"stem":87,"description":239,"children":-1},"What IMAP search can and cannot do, body truncation, and the Microsoft risk.",{"title":93,"path":94,"stem":95,"description":241,"children":-1},"Dev setup, the checks CI runs, commit conventions and how releases are cut.",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":243},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":245},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":247},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",{"left":97,"top":97,"width":98,"height":98,"rotate":97,"vFlip":27,"hFlip":27,"body":249},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 9h16M4 15h16M10 3L8 21m8-18l-2 18\"\u002F>",1789573344182]